Какие типы циклов, кроме ‘for’, вы знаете в контексте написания тестов?

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

Ответ

В автоматизации тестирования используются различные циклические конструкции для организации проверок, обработки данных и управления тестовым потоком.

  1. Цикл while

    • Применение в тестах: Идеален для ожидания появления элемента или изменения состояния системы (polling) с таймаутом. Часто используется в кастомных wait-условиях.
      // Ожидание появления элемента на странице
      public WebElement waitForElement(By locator, int timeoutSeconds) {
      WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(timeoutSeconds));
      return wait.until(ExpectedConditions.presenceOfElementLocated(locator));
      }
      // Внутри `until` может использоваться цикл while для проверки условия.
  2. Цикл do-while

    • Применение в тестах: Гарантирует выполнение тела цикла хотя бы один раз. Может пригодиться для сценариев "действие-проверка", где действие нужно совершить перед первой проверкой условия.
      // Повторение действия до успеха, но не более N раз
      int attempts = 0;
      boolean success = false;
      do {
      attempts++;
      success = performFlakyOperation(); // Потенциально нестабильная операция
      } while (!success && attempts < 3);
      assertTrue("Operation failed after " + attempts + " attempts", success);
  3. Условные циклы через if и break/continue (управление потоком)

    • Применение в тестах: Обработка коллекций данных с пропуском или прерыванием по условию. Например, пропуск тестовых данных, помеченных как "неактивные".
      for (TestData data : testDataList) {
      if (data.getStatus().equals("SKIP")) {
          System.out.println("Skipping: " + data.getId());
          continue; // Переходим к следующей итерации
      }
      if (data.isCritical() && someGlobalCondition) {
          System.out.println("Stopping tests due to critical failure");
          break; // Выходим из цикла полностью
      }
      executeTestWithData(data);
      }
  4. Рекурсия (косвенно)

    • Применение в тестах: Менее распространена, но может использоваться для обхода древовидных структур (например, DOM, JSON, файловая система) в проверках.
      // Рекурсивный поиск файла с определенным расширением
      public File findFile(File dir, String extension) {
      for (File file : dir.listFiles()) {
          if (file.isDirectory()) {
              File result = findFile(file, extension); // Рекурсивный вызов
              if (result != null) return result;
          } else if (file.getName().endsWith(extension)) {
              return file;
          }
      }
      return null;
      }

Ключевой принцип для QA: Выбор типа цикла зависит от задачи. for и for-each — для итерации по известным коллекциям. while и do-while — для ожиданий и повторных попыток. Важно всегда предусматривать условия выхода из цикла, чтобы избежать бесконечного выполнения теста.