Как вызывать экземпляры входных аргументов метода TestNG @Test после выполнения теста с использованием интерфейса TestNG ITestResult или любого другого интерфейса TestNG

#java #testng #testng-dataprovider

#java #testng #testng-dataprovider

Вопрос:

Я создаю пользовательский reporter, реализующий интерфейс IReporter, и хотел бы опубликовать входные параметры теста в итоговом отчете о тестировании. Мои тестовые входные параметры предоставляются через TestNG Dataprovider. Каждый входной параметр является экземпляром класса TestCase.

Я могу получить доступ к входным параметрам в моем отчете, но это всего лишь хэш-код объекта, а не сам экземпляр, из которого я мог бы вызвать необходимые тестовые данные и опубликовать в html-отчете.

Я смог распечатать все входные аргументы, используя следующий код

 Set<ITestResult> failedTests = testContext
                    .getFailedTests()
                    .getAllResults();
            for (ITestResult result: failedTests) {
                for (Object param: result.getParameters()) {
                    System.out.println(param);
                }
            }
Output:
data.service.entities.TestCase@1a1da881
org.testng.TestRunner@4dbb42b7
  

Метод getParameters() возвращает массив объектов, которые я не знаю, как преобразовать в TestCase.

Пожалуйста, посоветуйте способ получить экземпляр data.service.entities.TestCase@1a1da881 для вызова его методов.

Ответ №1:

Чтобы получить экземпляры, я создал класс TestNG CustomListener, где я вручную устанавливаю входной аргумент (TestCase) в качестве атрибута каждого выполняемого теста ITestResult:

     public class CustomListener extends TestListenerAdapter {

    @Override
    public void onTestFailure(ITestResult iTestResult) {
        super.onTestFailure(iTestResult);
        TestCase tCase = (TestCase) iTestResult.getParameters()[0];
        iTestResult.setAttribute("failed_case", tCase);
    }

    @Override
    public void onTestSuccess(ITestResult iTestResult) {
        super.onTestSuccess(iTestResult);
        TestCase tCase = (TestCase) iTestResult.getParameters()[0];
        iTestResult.setAttribute("passed_case", tCase);
    }

    @Override
    public void onTestSkipped(ITestResult iTestResult) {
        super.onTestSkipped(iTestResult);
        TestCase tCase = (TestCase) iTestResult.getParameters()[0];
        iTestResult.setAttribute("skipped_case", tCase);
    }
  }
  

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

         TestCase failedCase = (TestCase) testResult.getAttribute("failed_case");
        TestCase passedCase = (TestCase) testResult.getAttribute("passed_case");
        TestCase skippedCase = (TestCase) testResult.getAttribute("skipped_case");