从java运行TestCase并在Eclipse JUnit视图上显示结果

时间:2015-04-01 13:44:26

标签: java eclipse junit annotations

我使用@Test注释定义了一些类,每个类都有几个公共方法。所有方法都遵循相同的行为模式(从ID检索资源,测试是否为空,日志,为资源上的每一行调用真实测试)。所以,我在一个抽象类中将这种行为外化,我在每个方法上实例化,如下所示:

@Test
public void someTest(){
  new BasicTestPattern("X","Y","Z"){ // some parameters to retrieve resources
     @Override
     protected void testLine(){ 
        someCheck1();
        someCheck2();
     }
  }.run();
}

该解决方案每种测试方法消除10-30行。 现在,我想进一步使用自定义注释,如:

@TestPattern(param1="X",param2="Y",param3="Z")
public void someTest(){
  someCheck1();
  someCheck2();
}

最后,我创建了一个小框架,用这个新的注释检索所有方法,以便实现BasicTestPattern并执行它。它在TestCase子类中执行得很好,如:

TestCase junit_test = new TestCase(){
  @Override
  public void runTest() {
    pattern.run();
  }
};

junit_test.run();

但是,Eclipse的JUnit视图中不显示/列出任何测试。我看到只有成功的测试数量。 我怎样才能做到这一点 ?谢谢。

1 个答案:

答案 0 :(得分:0)

您可能需要创建自己的自定义Runner才能找到使用@TestPattern方法注释的所有方法。 (也可能还有@Test?)

然后你的测试类看起来像这样:

@RunWith(YourRunner.class)
public class YourTest{

   @TestPattern(param1="X",param2="Y",param3="Z")
   public void someTest(){
        ...
   }

   @Test
   public void anotherNormalTest(){
        ...
   }


}

This Blog解释了如何编写自定义Runners。但是你可以通过扩展BlockJUnit4ClassRunner来将你的特殊测试方法添加到要运行的测试列表中。

我认为你只需要覆盖computeTestMethods()方法,这就是BlockJUnit4ClassRunner找到所有要运行的测试方法的方法(使用@Test注释的方法),你可以覆盖它来查找你自己注释的方法注释

  public class your TestRunner extends BlockJUnit4ClassRunner{

  protected List<FrameworkMethod> computeTestMethods() {
        //this is all the @Test annotated methods
        List<FrameworkMethod> testAnnotatedMethods = super.computeTestMethods();
        //these are all the methods with your @TestPattern annotation
        List<FrameworkMethod> yourAnnotatedMethods = getTestClass().getAnnotatedMethods(TestPattern.class);

        //do whatever you need to do to generate the test 
        //methods with the correct parameters based on 
        //the annotation ?  
        //Might need to make fake or 
        //synthetic FrameworkMethod instances?

       ...

       //combine everyting into a single List
       List<FrameworkMethod> allTestMethods =...
       //finally return all the FrameworkMethods as a single list
       return allTestMethods;
 }

}

您可能必须创建自己的FrameworkMethod实现包装器以从注释中获取信息,并在调用方法之前执行所需的任何设置。

这将使它与普通的JUnit类无缝集成,并与JUnit IDE视图一起使用

祝你好运