Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java junit4使用特定的测试方法创建测试套件_Java_Junit4 - Fatal编程技术网

Java junit4使用特定的测试方法创建测试套件

Java junit4使用特定的测试方法创建测试套件,java,junit4,Java,Junit4,在junit4中,我想从不同的类执行特定的测试方法,也就是说,我想用不同类的特定测试方法创建一个测试套件 假设我有两门课: public class Test_Login { @Test public void test_Login_001(){ System.out.println("test_Login_001"); } @Test public void test_Login_002(){ System.out.pr

在junit4中,我想从不同的类执行特定的测试方法,也就是说,我想用不同类的特定测试方法创建一个测试套件

假设我有两门课:

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\u Login\u 001、test\u Login\u 003、test\u Logout\u 002


如何在junit4中实现这一点?

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

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());
            }
        }
    }
}

}

由于JUnit 4.8引入了类别,因此存在一个干净的解决方案,创建一个TestSuite:

@RunWith(Categories.class)
@IncludeCategory(MustHaveTests.class)
@SuiteClasses({Test\u Login.class,Test\u Logout.class})
公共类必须具有TestStestSuite{
公共接口必须有测试{/*类别标记*/}
}
并将@Category(MustHaveTests.class)添加到要使用TestSuite运行的每个测试之上,例如:

@Category(MustHaveTests.class)
@试验
公共无效测试\u登录\u 001(){
System.out.println(“test_Login_001”);
}

运行TestSuite时,只执行MustHaveTests-“标记”测试。关于@Category:

的更多详细信息这可能不是最巧妙的实现,但我通过创建一个新的@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 {
}