2013-03-06 95 views
3

在junit4中,我想执行来自不同类的特定测试方法,即希望使用不同类中的特定测试方法创建测试套件。junit4创建具有特定测试方法的测试套件

可以说我有2类:

public class Test_Login { 
    @Test 
    public void test_Login_001(){ 
     System.out.println("test_Login_001"); 
    } 

    @Test 
    public void test_Login_002(){ 
     System.out.println("test_Login_002"); 
    } 

    @Test 
    public void test_Login_003(){ 
     System.out.println("test_Login_003"); 
    } 
} 


public class Logout { 

    @Test 
    public void test_Logout_001(){ 
     System.out.println("test_Logout_001"); 
    } 

    @Test 
    public void test_Logout_002(){ 
     System.out.println("test_Logout_002"); 
    } 

    @Test 
    public void test_Logout_003(){ 
     System.out.println("test_Logout_003"); 
    } 
} 

从上面的类我想只执行测试方法test_Login_001,test_Login_003,test_Logout_002。

junit4如何实现?

回答

1

您需要创建一个org.junit.runner.Request并将其传递给JunitCore运行器,或者实际传递给任何Runner。

JUnitCore junitRunner = new JUnitCore(); 
Request request = Request.method(Logout.class, "test_Logout_002"); 
Result result = junitRunner.run(request); 

其实我创建了一个注释,并可以搜索这些注释的方法和动态创建请求并运行它们

public class TestsSuite { 

public static void main(String[] args) throws Exception { 
    Class annotation = MyTestAnnotation.class; 
    JUnitCore junitRunner = new JUnitCore(); 
    Class testClass = Test_Login.class; 
    Method[] methods = testClass.getMethods(); 
    for (Method method : methods) { 
     if (method.isAnnotationPresent(annotation)) { 
      if (method.isAnnotationPresent(org.junit.Test.class)) { 
       Request request = Request.method(testClass, method.getName()); 
       Result result = junitRunner.run(request); 
       System.out.println(result.wasSuccessful()); 
      } 
     } 
    } 
} 

}

1

由于JUnit的4.8推出分类存在一个干净的解决方案,创建一个TestSuite:

@RunWith(Categories.class) 
@IncludeCategory(MustHaveTests.class) 
@SuiteClasses({ Test_Login.class, Test_Logout.class }) 
public class MustHaveTestsTestSuite { 
    public interface MustHaveTests { /* category marker */ } 

} 

并添加@Category(MustHaveTests.class)以上每一个测试,你想与TestSuite的运行,例如:

@Category(MustHaveTests.class) 
@Test 
public void test_Login_001(){ 
    System.out.println("test_Login_001"); 
} 

当运行的TestSuite只有MustHaveTests-“标记”测试将被执行。在@Category更多详细信息:https://github.com/junit-team/junit4/wiki/categories

0

这可能不是最灵巧的实现,但我通过创建一个新的@SuiteMethods注释解决了类似的问题如下:

SuiteMethods.java

@Retention(RUNTIME) 
@Target(TYPE) 
public @interface SuiteMethods { 
    String[] value() default {""}; 
} 

FilteredSuite的.java

public class FilteredSuite extends Categories { 

    private static String[] TEST_METHODS_TO_RUN = {""}; // default behavior is to run all methods 

    private static Class<?> extractMethodNamesFromAnnotation(Class<?> clazz) { 
     SuiteMethods methodsAnnotation = clazz.getAnnotation(SuiteMethods.class); 
     if (methodsAnnotation != null) { 
      // if our MethodsAnnotation was specified, use it's value as our methods filter 
      TEST_METHODS_TO_RUN = methodsAnnotation.value(); 
     }   
     return clazz; 
    } 

    public static Filter getCustomFilter() { 
     Filter f = new Filter() { 

      @Override 
      public boolean shouldRun(Description desc) { 
       String methodName = desc.getMethodName(); 
       for (String subString : TEST_METHODS_TO_RUN) { 
        if (methodName == null || methodName.contains(subString)) { 
         return true; 
        } 
       } 
       return false; 
      } 

      @Override 
      public String describe() { 
       return null; 
      } 
     }; 
     return f; 
    } 

    public FilteredSuite(Class<?> arg0, RunnerBuilder arg1) throws InitializationError { 
     super(extractMethodNamesFromAnnotation(arg0), arg1);    
    } 

    @Override 
    public void filter(Filter arg0) throws NoTestsRemainException { 
     // At test suite startup, JUnit framework calls this method to install CategoryFilter. 
     // Throw away the given filter and install our own method name filter 
     super.filter(getCustomFilter()); 
    } 
} 

的使用示例

@RunWith(FilteredSuite.class) 
@SuiteClasses({ 
    GroupRestTest.class, 
    ScenarioRestTest.class 
}) 
@SuiteMethods({ 
    "testReadOnlyFlag", 
    "testSheetWriteData", 
    "testAddScenarioMeta" 
}) 
public class SubsetTestSuite { 
}