如何随机运行JUnit测试中的指定数量用例?附自定义Runner实现
问题:如何从JUnit测试类中随机运行指定数量的测试用例?
现有测试套件类TestSuite和测试类TestA代码如下:
TestSuite.java
@RunWith(Suite.class) @Suite.SuiteClasses({TestA.class}) public class TestSuite { }
TestA.java
public class TestA { @Test public void test1(){ System.out.println("test1"); } @Test public void test2(){ System.out.println("test2"); } @Test public void test3(){ System.out.println("test3"); } }
需求:从TestA的3个测试用例中随机运行其中2个,已知需要创建自定义Runner,求相关实现示例。
解决方案
自定义一个继承自BlockJUnit4ClassRunner的Runner类,重写computeTestMethods方法实现随机筛选指定数量的测试用例:
public class TestRunner extends BlockJUnit4ClassRunner { private static final int MAX_TESTS_TO_RUN = 2; public TestRunner(Class<?> klass) throws InitializationError { super(klass); } @Override protected List<FrameworkMethod> computeTestMethods() { // 获取所有测试方法 List<FrameworkMethod> methods = super.computeTestMethods(); // 打乱测试方法顺序 List<FrameworkMethod> shuffledMethods = new ArrayList<>(methods); Collections.shuffle(shuffledMethods); // 返回前MAX_TESTS_TO_RUN个测试方法,兼容测试方法总数小于指定数量的场景 return new ArrayList<>(shuffledMethods.subList(0, Math.min(methods.size(), MAX_TESTS_TO_RUN))); } }
使用方式
在测试类TestA上添加@RunWith注解指定自定义Runner即可:
@RunWith(TestRunner.class) public class TestA { // 测试方法保持不变 }
补充说明
如果测试类已配置其他Runner(比如Suite Runner),则需要通过自定义Rule来实现相同逻辑,而非替换原有Runner。
内容的提问来源于stack exchange,提问作者HELENDOUDOU
相关产品推荐
相关产品推荐

