一、概述

可以通过以下方式运行多个单元测试类:

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)