如何运行多个单元测试
一、概述
可以通过以下方式运行多个单元测试类:
List<Class<?>> classes = new ArrayList<>();
classes.add(...);
classes.add(...);
Result result = JUnitCore.runClasses(classes.toArray(new Class[] {}));
二、样例
1、代码
- 测试类一
package com.example;
import org.junit.Test;
import kd.bos.form.unittest.DisplayName;
public class TestCaseOne {
@Test
@DisplayName("测试加法")
public void testAdd() {
System.out.println("测试加法...");
}
@Test
@DisplayName("测试减法")
public void testDivision() {
System.out.println("测试减法...");
int a = 0;
int b = 5/a;
}
}
- 测试类二
package com.example;
import org.junit.Test;
import kd.bos.form.unittest.DisplayName;
public class TestCaseTwo {
@Test
@DisplayName("测试数据库")
public void testDBConnection() {
System.out.println("测试数据库连接...");
}
}
- 程序主类
package com.example;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class Test {
public static void main(String[] args) {
doUnittest();
}
private static void doUnittest() {
StringBuilder ret = new StringBuilder();
List<Class<?>> classes = new ArrayList<>();
classes.add(TestCaseOne.class);
classes.add(TestCaseTwo.class);
Result result = JUnitCore.runClasses(classes.toArray(new Class[] {}));
ret.append("\n共执行 ").append(result.getRunCount()).append(" 个测试用例,");
if(result.wasSuccessful()) {
ret.append("全部成功。");
}else {
ret.append(String.format("失败:%s 个,详情如下:", result.getFailureCount()));
StringBuilder errInfo = new StringBuilder();
List<Failure> failures = result.getFailures();
int index = 0;
for(Failure failure : failures) {
errInfo.append("\n").append(++index).append("、");
errInfo.append(failure.getTestHeader()).append("\n");
errInfo.append(getStackTrace(failure.getException())).append("\n");
}
ret.append("\n").append(errInfo);
}
System.out.println(ret);
}
private static String getStackTrace(Throwable throwable) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw, true);
throwable.printStackTrace(pw);
return sw.getBuffer().toString();
}
}
2、运行结果
测试加法...
测试减法...
测试数据库连接...
共执行 3 个测试用例,失败:1 个,详情如下:
1、testDivision(com.example.TestCaseOne)
java.lang.ArithmeticException: / by zero
at com.example.TestCaseOne.testDivision(TestCaseOne.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:24)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at org.junit.runner.JUnitCore.run(JUnitCore.java:136)
at org.junit.runner.JUnitCore.run(JUnitCore.java:127)
at org.junit.runner.JUnitCore.runClasses(JUnitCore.java:76)
at com.example.ExampleTest.doUnittest(ExampleTest.java:24)
at com.example.ExampleTest.main(ExampleTest.java:15)