Как определить, когда JUnit завершает работу, просто используя TestWatcher? - PullRequest
3 голосов
/ 30 марта 2012

Мне нужно:

  • смотреть тесты
  • собирать информацию
  • строить отчет о тестах

Тестыбудет запущен через TeamCity.Я создаю объект TestWatcher для прослушивания результатов теста, и этот TestWatcher включен в каждый класс JUnit, который содержит тесты.У меня был слушатель, который слушал, когда весь комплект был закончен, но мне пришлось добавить это программно.Поскольку сейчас я использую TeamCity для запуска тестов и получения результатов, я считаю, что потерял эту возможность.Меня также попросили подготовить отчет в формате PDF с результатами TeamCity.Все, что мне нужно знать, - это когда тесты заканчиваются, чтобы я мог знать, когда начинать создавать свой отчет.Есть ли способ сделать это, просто используя TestWatcher?

Ниже показано, как выглядит мой TestWatcher на данный момент.BaseTestResult - это просто класс, который содержит результаты тестов и упорядочивает их для облегчения их распечатки.Я также использую Selenium, и переменная драйвера имеет тип WebDriver:

@Rule
public TestWatcher watchman = new TestWatcher() {
    private BaseTestResult currentTest;
    private long startTime;
    private long endTime;

    @Override
    protected void starting(Description d) {
        startTime = System.currentTimeMillis();
        currentTest = new BaseTestResult(d);
        currentTest.setBrowser(type);
        if (d.getAnnotation(TestDescription.class) != null) {
            currentTest.setDescription(d.getAnnotation(
                    TestDescription.class).description());
        }
        currentTest.setSuite(d.getTestClass().getName());
    }

    @Override
    protected void succeeded(Description d) {
        currentTest.setSucceeded(true);
    }

    @Override
    protected void failed(Throwable e, Description d) {
        currentTest.setThrowable(e);
    }

    @Override
    protected void finished(Description d) {
        endTime = System.currentTimeMillis();
        currentTest.setRuntime(endTime - startTime);
        String fileName = d.getMethodName() + type + ".png";
        File srcFile = ((TakesScreenshot) driver)
                .getScreenshotAs(OutputType.FILE);
        String filePath = "./screens/" + fileName;
        try {
            FileUtils.copyFile(srcFile, new File(filePath));
            currentTest.setScreenshotPath(filePath);
        } catch (IOException e) {
            log.severe(e.toString());
        }

        if (currentTest.getSucceeded()) {
            BaseListener.getSuiteResult().addPassed(currentTest);
        } else {
            BaseListener.getSuiteResult().addFailed(currentTest);
        }

        // Quit, the web driver
        if (driver != null) {
            driver.quit();
        }
    }

};

Ответы [ 2 ]

6 голосов
/ 30 марта 2012

Вы можете сделать это:

@ClassRule // the magic is done here
public static TestRule classWatchman = new TestWatcher() {
    @Override
    protected void starting(Description desc) {
        System.out.println(desc.testCount()); // insert actual logic here
    }
};

Это смотрит весь класс вместо каждого теста.Это означает, что он дает вам количество тестов в наборе в начале набора.Затем, каждый раз, когда вы звоните BaseListener.getSuiteResult().addPassed(currentTest); или BaseListener.getSuiteResult().addFailed(currentTest);, вы можете проверить, добавили ли вы уже количество тестов в наборе (то есть набор завершен).

Или, что еще лучше,

@ClassRule
public static TestRule classWatchman = new TestWatcher() {
    @Override
    protected void finished(Description desc) {
        System.out.println("Suite completed!"); // insert actual logic here
    }
};

Если у вас есть несколько классов, содержащих тесты, вы можете создать один класс AllMyTests, содержащий все из них!Этот класс AllMyTests может быть затем запущен JUnit.В этом случае @ClassRule будет вести себя как @SuiteRule (которого не существует).

@RunWith(Suite.class)
@Suite.SuiteClasses({ First.class, Second.class, Third.class })
public class AllMyTests {
    // nothing to do
}
1 голос
/ 28 января 2014

Это сработало для меня

@ClassRule 
public Static TestWatcher watchman= new TestWatcher() {
  @Override
  protected void failed(Throwable e, Description description) {


  logger.info(description.getMethodName()+"Failed!"+" "+e.getMessage());
  }

  @Override
  protected void succeeded(Description description) {

    logger.info(description.getMethodName()+" " + "success!");
  }
  @Override
  protected void finished(Description desc) {
  logger.info("Suite completed!");
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...