【问题标题】:How to tell when JUnit finishes by just using a TestWatcher?如何仅使用 TestWatcher 来判断 JUnit 何时完成?
【发布时间】:2012-04-14 03:06:55
【问题描述】:

我需要:

  • 观看测试
  • 收集信息
  • 根据测试生成报告

测试将通过 TeamCity 启动。我创建了一个 TestWatcher 对象来监听测试结果,这个 TestWatcher 包含在每个包含测试的 JUnit 类中。我有一个监听器,它会在整个套件完成时收听,但我必须以编程方式添加它。由于我现在使用 TeamCity 运行测试并生成结果,我相信我已经失去了这种能力。我还被要求制作一份包含 TeamCity 结果的 PDF 报告。我只需要知道测试什么时候完成,这样我就可以知道什么时候开始构建我的报告。有没有办法仅通过使用 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();
        }
    }

};

【问题讨论】:

    标签: java pdf selenium junit


    【解决方案1】:

    这对我有用

    @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!");
      }
    };
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      @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
      }
      

      【讨论】:

      • 顺便说一句,我刚刚意识到我们都使用以旧方式命名的测试 Watcher :)
      • 感谢您的回答,这绝对是朝着正确方向迈出的一步。如果我有多个课程怎么办?我计划拥有多个测试类,并希望根据所有运行的测试类的结果生成一份报告。
      猜你喜欢
      • 2018-05-03
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多