Привязать метод к событию тайм-аута в TestNG - PullRequest
0 голосов
/ 13 ноября 2018

В проекте TestNG я добавил тайм-аут в теге suite в файле xml.

<suite name="Acceptance test suite" verbose="1" time-out="5400000" parallel="instances" thread-count="15">

Этот тайм-аут работает нормально.

Я хочу связать метод, который будет выполняться всякий раз, когда для отдельного теста будет превышено время ожидания. На самом деле, я хочу записать, что этот конкретный тест завершается фреймворком TestNG и парой других задач с использованием информации о тесте, который только что закончился.

Я проверил аннотацию @AfterTest, но она выполняется после завершения всех тестов. Я хочу войти на индивидуальном уровне тестирования.

Как мне этого добиться?

1 Ответ

0 голосов
/ 14 ноября 2018

Вы должны быть в состоянии сделать это с TestNG с сегодняшнего дня.Вам просто нужно извлечь объект Throwable из ITestResult определенного метода тестирования, проверить, является ли это исключение тайм-аута, и, если да, зарегистрировать его отдельно.

На сегодняшний день нет прямой очередиспособ сделать это с помощью слушателя TestNG.Я зарегистрировал новую проблему для отслеживания этой проблемы (https://github.com/cbeust/testng/issues/1952). Я постараюсь исправить это как можно скорее, и она будет доступна в следующей следующей основной версии TestNG. Пожалуйста, не стесняйтесь следить за этой проблемой для получения обновлений.

Вот пример, который показывает, как это сделать.

import com.rationaleemotions.stackoverflow.qn53280681.TimeoutListener;
import java.util.concurrent.TimeUnit;
import org.testng.ITestListener;
import org.testng.ITestResult;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import org.testng.internal.thread.ThreadTimeoutException;

@Listeners(TimeoutListener.class)
public class qn53280681 {
  @Test(timeOut = 500)
  public void timedMethod() throws InterruptedException {
    TimeUnit.SECONDS.sleep(1);
  }

  public static class TimeoutListener implements ITestListener {

    @Override
    public void onTestFailure(ITestResult result) {
      Throwable t = result.getThrowable();
      if (t instanceof ThreadTimeoutException) {
        System.err.println("The test timedout and caused a failure");
      }
    }
  }
}

Вот вывод

The test timedout and caused a failure

org.testng.internal.thread.ThreadTimeoutException: Method com.rationaleemotions.stackoverflow.qn53280681.timedMethod() didn't finish within the time-out 500

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1150)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)


===============================================
Default Suite
Total tests run: 1, Passes: 0, Failures: 1, Skips: 0
===============================================
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...