2012-03-30 1 views
2

は私がする必要があります。テスト結果を待ち受けるTestWatcherオブジェクトを作成します。このTestWatcherは、テストを含む各JUnitクラスに含まれています。スイート全体が完了したときに聴くリスナーがいましたが、プログラムで追加する必要がありました。 TeamCityを使用してテストを実行し結果を生成しているので、私はその能力を失ったと考えています。 TeamCityの結果を含むPDFレポートを作成するように求められました。私が知る必要があることは、いつテストが終了したかで、いつレポートを作成するのかを知ることができます。 TestWatcherを使うだけでこれを達成することができますか?JUnitがTestWatcherを使うだけで終了する方法を教えてください。 <ul> <li></p>テストがチームシティー経由で開始されます</li> </ul> <p>テストからレポートを作成した情報を収集</li> <li>をテスト</li> <li>を見る:

以下は私のTestWatcherの外観です。 BaseTestResultは、テストの結果を含む単なるクラスであり、それらを簡単に印刷するために整理します。私はまた、セレンを使用していますし、ドライバ変数の型は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(); 
     } 
    } 

}; 

答えて

4

あなたはこれを行うことができます:

@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

はところで、私はちょうど私達の両方が古い方法「夜警」で指定された当社のテスト_Watcher_ :)答えを –

+0

感謝を使用することを実現し、これは間違いのステップである私のために働きました正しい方向。複数のクラスがある場合はどうなりますか?私は複数のテストクラスを持つ予定であり、実行するすべてのテストクラスの結果からレポートを作成したいと考えています。 –

+0

あなたのコメントに答えるために、分で答えを編集するつもりです。 –

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!"); 
    } 
}; 
関連する問題