2011-09-07 48 views
2

我面對有關運行時間爲每個測試運行JUnit的輕微不便。JUnit的@AfterClass被添加到一個可憐的測試用例:(

我有一個@AfterClass註釋和最後的測試運行會得到它的運行時添加到它的。

因此,報告將錯誤地顯示很長的運行時間爲窮人測試恰好是最後的運行。

有沒有辦法從上次測試排除它運行的時間?

回答

3

這是Eclipse的問題,而不是junit。如果我們用這個作爲一個例子:

public class TimingTest { 
    @Test public void test1() { 
     System.out.println("test1"); 
     sleep(1000); 
    } 

    @Test public void test2() { 
     System.out.println("test2"); 
     sleep(2000); 
    } 

    @After public void after() { 
     System.out.println("after"); 
     sleep(3000); 
    } 

    @AfterClass public static void afterClass() { 
     System.out.println("afterClass"); 
     sleep(5000); 
    } 

    private static void sleep(int i) { 
     try { 
      Thread.sleep(i); 
     } catch (InterruptedException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

那麼我們得到TEST1 = 4S,測試2 = 10S(在Eclipse)。然而,Eclipse中的junit runner並未使用junit提供的信息。 RunListener接口定義了方法testStarted,testFinished,testRunStarted,testRunFinished。如果我們看一下時會調用這些方法,使用:

public class RunJunitTestRunListener { 
    private static class MyListener extends RunListener { 
     private long runStart = 0L; 
     private long testStart = 0L; 

     @Override 
     public void testRunStarted(Description description) throws Exception { 
      System.out.println("runStarted"); 
      runStart = System.currentTimeMillis(); 
      super.testRunStarted(description); 
     } 

     @Override 
     public void testRunFinished(Result result) throws Exception { 
      System.out.println("runFinished " + (System.currentTimeMillis() - runStart) + "ms"); 
      super.testRunFinished(result); 
     } 

     @Override 
     public void testStarted(Description description) throws Exception { 
      System.out.println("testStarted"); 
      testStart = System.currentTimeMillis(); 
      super.testStarted(description); 
     } 

     @Override 
     public void testFinished(Description description) throws Exception { 
      System.out.println("testFinished " + (System.currentTimeMillis() - testStart) + "ms"); 
      super.testFinished(description); 
     } 
    } 

    public static void main(String[] args) { 
     JUnitCore core= new JUnitCore(); 
     core.addListener(new MyListener()); 
     core.run(TimingTest.class); 
    } 
} 

我們得到的輸出:

testFinished 4004ms 
testFinished 5002ms 
runFinished 14012ms 

這是你所期望的。 Eclipse正在將@afterClass添加到時間上。所以,如果你關心你的方法的時間,你需要

  1. 運行上面的代碼,創建自己的偵聽器。沒有簡單的方法將聽衆附加到特定的測試。
  2. 使用基準測試套件(如junit-benchmark建議DaveBall或JunitPerf
  3. 不要做任何慢@AfterClass
+0

+1爲好的答案JunitPerf聽起來有趣 - 我添加了它到清單http://stackoverflow.com/questions/7146207/what-is-the-best-macro-benchmarking-tool-framework-to-measure-a-single-threaded。如果您碰巧知道它可以處理哪些方面,您是否可以如此善意並將其粗略地填充到社區wiki中? – DaveFar

0

你怎麼樣在最後的測試中考慮/考慮運行時間?

如果您正在測量性能,請使用微基準測試。看看junit-benchmark,我認爲它是最簡單的微型基準測試庫之一。

+0

如果不這樣做微標杆只是普通的TDD檢查我的方法做我想做什麼,我不要在重構中摧毀它們,所以沒有任何問題,但是由於奇怪的報告行爲,在測試中獲得9秒的運行時間非常煩人,我認爲運行時是eclipse在JUnit視圖中爲我提供的例如test1(0,002 s)test2(0,001 s)test3(8,922 s)在現實測試3中是(0,00x s)與其他人一樣 – Farmor