Какие циклы в Java вы использовали в тестовом коде?

«Какие циклы в Java вы использовали в тестовом коде?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В тестовой автоматизации на Java я применяю разные циклы в зависимости от контекста:

1. Улучшенный цикл for-each — самый частый. Использую для итерации по коллекциям тестовых данных.

@DataProvider(name = "userRoles")
public Object[][] provideUserRoles() {
    return new Object[][] {
        {"admin", Arrays.asList("READ", "WRITE", "DELETE")},
        {"editor", Arrays.asList("READ", "WRITE")},
        {"viewer", Arrays.asList("READ")}
    };
}

@Test(dataProvider = "userRoles")
public void testUserHasCorrectPermissions(String role, List<String> expectedPermissions) {
    User user = createUserWithRole(role);

    // For-each для проверки каждого ожидаемого разрешения
    for (String expectedPerm : expectedPermissions) {
        assertTrue("User with role " + role + " should have permission: " + expectedPerm,
                   user.getPermissions().contains(expectedPerm));
    }
}

2. Цикл while — для реализации явных ожиданий (explicit waits). Это критически важно в UI-автоматизации.

public WebElement waitForElement(By locator, int timeoutSeconds) {
    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(timeoutSeconds));
    // Внутри wait.until используется цикл while с опросом
    return wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
}

// Или кастомная логика ожидания
int attempts = 0;
while (attempts < 10) {
    if (isApiResponseReady(requestId)) {
        break; // Выход при успехе
    }
    Thread.sleep(1000); // Пауза 1 сек
    attempts++;
}
if (attempts == 10) {
    throw new RuntimeException("Timeout waiting for API response");
}

3. Традиционный цикл for — когда нужно точное количество итераций, например, для stress-тестирования или повторения действия N раз.

// Проверка, что система корректно обрабатывает 10 быстрых запросов
for (int i = 0; i < 10; i++) {
    Response response = apiClient.sendParallelRequest();
    assertEquals(200, response.getStatusCode(), "Request #" + i + " failed");
}

Циклы do-while использую реже, в основном в сценариях, где действие нужно выполнить минимум один раз перед проверкой условия (например, чтение из потока).