JUnit跨类调用测试失败问题及JUnit4执行测试方案咨询
问题分析与解决方案
一、JUnit3测试类跨调用失败的原因与修复
错误原因
你的MyJUnitTest继承了JUnit3的TestCase类,这类测试的执行依赖指定测试方法名的构造函数。直接通过new MyJUnitTest()实例化时,会调用无参构造函数,没有初始化fName(测试方法名)字段,导致调用run()时抛出TestCase.fName cannot be null错误。而IDE直接运行测试时,会自动完成测试方法的发现和初始化,因此不会出现该问题。
修复方案
方案1:指定测试方法名实例化测试类
修改类A的代码,实例化MyJUnitTest时传入要执行的测试方法名:
public class A{ public static void abc(){ // 传入测试方法名"test1" MyJUnitTest t = new MyJUnitTest("test1"); t.test(); } }
同时优化测试类中的test()方法,避免空指针(当测试成功时failures为空):
public boolean test(){ junit.framework.TestResult result = this.run(); System.out.println("测试是否成功:" + result.wasSuccessful()); if (!result.failures.isEmpty()) { System.out.println(result.failures.nextElement()); } return result.wasSuccessful(); }
方案2:使用TestSuite运行多个测试方法
如果需要执行多个测试方法,推荐使用JUnit3的TestSuite来管理测试用例:
public class A{ public static void abc(){ junit.framework.TestSuite suite = new junit.framework.TestSuite(); // 添加要执行的测试方法 suite.addTest(new MyJUnitTest("test1")); // 如果有其他测试方法,继续调用addTest添加 // suite.addTest(new MyJUnitTest("test2")); junit.framework.TestResult result = new junit.framework.TestResult(); suite.run(result); System.out.println("测试是否成功:" + result.wasSuccessful()); System.out.println("总测试数:" + result.runCount()); System.out.println("失败数:" + result.failureCount()); // 遍历输出失败详情 if (!result.failures.isEmpty()) { result.failures.forEach(failure -> System.out.println(failure.toString())); } } }
另外,业务类T的add是静态方法,测试中无需实例化T,可以删除setUp和tearDown方法中的多余代码。
二、JUnit4中跨类执行测试并获取结果的方法
JUnit4摒弃了继承TestCase的模式,改用注解驱动,同时提供JUnitCore类来执行测试并获取结果。
步骤1:修改测试类为JUnit4风格
import org.junit.Test; import static org.junit.Assert.assertArrayEquals; public class MyJUnitTest { // 无需继承TestCase,直接用@Test标记测试方法 @Test public void test1(){ int[] vgl1 = new int[1]; int[] vgl2 = new int[1]; vgl1[0] = T.add(1,2); vgl2[0] = 3; assertArrayEquals("Test one", vgl1, vgl2); } // 可添加更多@Test标记的测试方法 // @Test // public void test2(){...} }
步骤2:通过JUnitCore执行测试并获取结果
在类A中使用JUnitCore.runClasses()方法执行测试,返回的Result对象包含所有测试结果信息:
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class A{ public static void abc(){ // 执行指定测试类的所有@Test方法 Result result = JUnitCore.runClasses(MyJUnitTest.class); System.out.println("测试是否成功:" + result.wasSuccessful()); System.out.println("总测试数:" + result.getRunCount()); System.out.println("失败数:" + result.getFailureCount()); // 遍历输出所有失败用例的详情 for (Failure failure : result.getFailures()) { System.out.println("失败用例:" + failure.getTestHeader()); System.out.println("失败原因:" + failure.getMessage()); } } }
内容的提问来源于stack exchange,提问作者Michèle S.
相关产品推荐
相关产品推荐

