Ответ
В тестовой автоматизации на 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 использую реже, в основном в сценариях, где действие нужно выполнить минимум один раз перед проверкой условия (например, чтение из потока).