Как я могу получить TestNG ITestResult в тестовом слушателе Spring?

Я пишу тесты с использованием Spring и TestNG. Пример тестового класса:

@SpringBootTest
@TestExecutionListeners(
        mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS,
        listeners = {TestListener.class}
)
public class BaseTest extends AbstractTestNGSpringContextTests
{
}

Мой класс TestListener расширяет TransactionalTestExecutionListener, поэтому у меня есть методы переопределения для beforeTestClass (TestContext testContext), afterTestMethod (TestContext testContext) и т. Д.

Моя проблема в том, что в рамках afterTestMethod мне нужно иметь возможность получить TestNG ITestResult или TestResult, чтобы я мог делать разные вещи в зависимости от успеха теста, сбоя или пропуска и т. Д. Есть ли способ получить доступ к ITestResult или TestResult из прослушивателя весенних тестов?


person Jusbat    schedule 25.04.2018    source источник


Ответы (1)


Нет простого прямого способа получить доступ к объекту ITestResult тестового метода, который был выполнен, потому что Spring, похоже, не предоставляет к нему доступ.

Вы можете попробовать сделать что-то вроде этого:

  • Создайте служебный метод таким образом, чтобы при получении объекта Method, представляющего только что выполненный метод @Test, он запрашивал текущий ITestContext и находил любой объект ITestResult, чей объект Method соответствовал предоставленному объекту Method.
  • Пусть ваша реализация слушателя запросит этот служебный метод, чтобы получить доступ к объекту ITestResult.

Вот как может выглядеть пример реализации:

public class MyListener extends TransactionalTestExecutionListener {
    @Override
    public void afterTestMethod(TestContext testContext) throws Exception {
      super.afterTestMethod(testContext);
      ITestResult currentTestResult = getCorrespondingResultFor(testContext.getTestMethod());
    }

    private ITestResult getCorrespondingResultFor(Method method) {
      ITestContext context = Reporter.getCurrentTestResult().getTestContext();
      Set<ITestResult> allResults = new HashSet<>();
      allResults.addAll(context.getPassedTests().getAllResults());
      allResults.addAll(context.getFailedTests().getAllResults());
      allResults.addAll(context.getSkippedTests().getAllResults());
      return allResults
          .stream()
          .filter(result -> result.getMethod().getConstructorOrMethod().getMethod().equals(method))
          .findAny()
          .orElse(null);
    }
}
person Krishnan Mahadevan    schedule 01.05.2018
comment
Большое вам спасибо, это именно то, что я ищу! - person Jusbat; 02.05.2018