2011-09-07 2 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, TEST2 = (이클립스) 10 초 얻을. 그러나 Eclipse에서 junit 주자는 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. 위의 코드를 실행하고 나만의 수신기를 만듭니다. 리스너를 특정 테스트에 쉽게 부착 할 수있는 방법은 없습니다. DaveBall로
  2. 벤치마킹 제품군을 사용 (junit-benchmark 제안 또는 JunitPerf
+0

+1 멋진 답변입니다 .JunitPerf가 재미 있다고 들리 - 추가했습니다. 목록에 http://stackoverflow.com/questions/7146207/what-is-the-best-macro-benchmarking-tool-framework-to-measure-a-single-threaded. 어떤 측면에서 처리 할 수 ​​있는지 알고 있으면 친절하고 대략적으로 커뮤니티 위키에 채울 수 있습니까? – DaveFar

0

안녕하세요. 최종 테스트에서 런타임을 고려해야합니까?

성능을 측정하려면 마이크로 벤치 마크를 사용하십시오. junit-benchmark을 확인하십시오. 저는 이것이 가장 쉬운 마이크로 벤치마킹 라이브러리 중 하나라고 생각합니다.

+0

일을하지 @AfterClass 느린 아무것도하지 마십시오 마이크로 벤치마킹 그냥 일반 TDD 내 방법은 내가 원하는 것을 할 수 있음을 확인하고 I를 리팩토링에서 그들을 파괴하지 마십시오. 그래서 아무 문제가 있지만 매우 이상한 보고서 동작으로 인해 10ms로 끝날 수있는 테스트 9sec 런타임을 얻는 것은 매우 성가신 일입니다. 내가 Eclipse를 JUnit보기에서 제공하는 것과 같이 고려해야합니다. 예제 test1 (0,002 s) test2 (0,001 s) test3 (8,922 s) 실제로 test3은 (0,00 x s) 다른 사람들과 같습니다 . – Farmor

관련 문제