Как запускать блок кода после каждого @test, независимо от того, @Disabled тест или нет?

В основном я хотел бы добавить в свой отчет Extent запись «Пропущенные тесты». Я понимаю, что могу использовать @AfterEach, однако я вижу, что блок кода @AfterEach не выполняется для теста @Disabled в Junit5.

Я попытался использовать интерфейс TestWatcher и переопределил метод testDisabled, как показано ниже:

package utils;

import java.util.Optional;

import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.TestWatcher;


public class MyTestWatcher implements TestWatcher {
                public static String testStatus;
                public static String testCaseName;
    @Override
    public void testAborted(ExtensionContext Context, Throwable throwable) {
                testStatus = "Aborted";
                testCaseName = Context.getDisplayName();
                System.out.println("Test Aborted: " + Context.getDisplayName());
                }

    @Override
    public void testDisabled(ExtensionContext Context, Optional<String> optional) {
                testStatus = "Skipped";
                testCaseName = Context.getDisplayName();  
                System.out.println("Test Skipped: " + Context.getDisplayName());
                }

    @Override
    public void testFailed(ExtensionContext Context, Throwable throwable) {
                testStatus = "Failed";
                testCaseName = Context.getDisplayName();   
               System.out.println("Test Failed: " + Context.getDisplayName());
}

    @Override
    public void testSuccessful(ExtensionContext Context) {
                testStatus = "Passed";
                testCaseName = Context.getDisplayName();
                System.out.println("Test Passed: " + Context.getDisplayName());
    }

}

На основе переменных testStatus и testCaseName, которые установлены в методе testDisabled () выше, я хотел бы запустить блок кода из моего тестового класса, чтобы добавить запись в свой отчет Extent, в которой указано, какой тестовый пример был пропущено.


person Ashwin Kumar    schedule 28.05.2019    source источник
comment
Запустите непропущенные тесты. и обработать все пропущенные аннотации отдельно. Слейте документацию. Это единственный способ, не требующий взлома, так как, вероятно, нет никаких положений, чтобы не обрабатывать тест, но затем все же немного обработать его.   -  person Joop Eggen    schedule 28.05.2019
comment
так в чем твой вопрос? TestWatcher подход не сработал?   -  person gokareless    schedule 28.05.2019


Ответы (2)


Если я правильно понял ваш вопрос, вам просто нужно применить TestWatcher к вашему тесту, чтобы решить вашу проблему. В JUnit 5 вы можете использовать @ExtendsWith аннотацию. Полный пример будет:

@ExtendWith(MyTestWatcher.class)
class MyTest {

  @Test
  void test() {
    System.out.println("inside active test");
  }

  @Test
  @Disabled
  void testDisabled() {
    System.out.println("inside disabled test");
  }

}

С выходом:

inside active test
Test Passed: test()
Test Skipped: testDisabled()

Протестировано с JUnit 5.4.2

person gokareless    schedule 28.05.2019
comment
Мой вопрос в том, что мне пришлось добавить пропущенные тесты в свой отчет о степени. Я добавляю шаги отчета о тестировании в блок AfterEach. Однако для теста Disabled в Junit5 блок AfterEach не выполняется. Поэтому мне не удалось добавить в отчет информацию о пропущенном тесте. - person Ashwin Kumar; 29.05.2019
comment
используя ваш наблюдатель и мой код abobe, вы сможете достичь этого - person gokareless; 29.05.2019
comment
похоже, что ваш вопрос больше относится к экземпляру ExtentReport, а не к @AfterEach - person gokareless; 29.05.2019

Мне удалось добавить отчеты для пропущенных тестов, инициализировав Extent Report из класса MyTestWatcher. Несмотря на то, что объект ExtentReport уже был инициализирован в моем тестовом классе, когда я снова пытаюсь инициализировать (что в конечном итоге приведет к созданию другого отчета о файле HTML), я добавил следующий код в свой класс ExtentManager:

public static ExtentReports GetExtent(String env){
        **if (extent != null)
          return extent; //avoid creating new instance of html file**
        extent = new ExtentReports();       
        extent.attachReporter(getHtmlReporter());
        extent.setSystemInfo("Environment",env);
        extent.setAnalysisStrategy(AnalysisStrategy.SUITE);
        return extent;

И мой обновленный код в классе MyTestWatcher выглядит следующим образом:

package utils;

import java.util.Optional;

import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.TestWatcher;

import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.Status;




public class MyTestWatcher implements TestWatcher {
                public static String testCaseName;
                public static ExtentReports extent;
                public static ExtentTest report;

    static 
                {
                extent = utils.ExtentReportManager.GetExtent(System.getProperty("env"));
                report = extent.createTest("Skipped Tests", "Tests which are skipped are displayed here.");
                }
    @Override
    public void testAborted(ExtensionContext Context, Throwable throwable) {
                testCaseName = Context.getDisplayName();
                System.out.println("Test Aborted: " + Context.getDisplayName());
                }

    @Override
    public void testDisabled(ExtensionContext Context, Optional<String> optional) {
                testCaseName = Context.getDisplayName();  
                System.out.println("Test Skipped: " + Context.getDisplayName());
                report.createNode(testCaseName).log(Status.SKIP, "This test is marked as @DISABLED");
                }

    @Override
    public void testFailed(ExtensionContext Context, Throwable throwable) {
                testCaseName = Context.getDisplayName();   
               System.out.println("Test Failed: " + Context.getDisplayName());
                }

    @Override
    public void testSuccessful(ExtensionContext Context) {
                testCaseName = Context.getDisplayName();
                System.out.println("Test Passed: " + Context.getDisplayName());
    }

}
person Ashwin Kumar    schedule 29.05.2019