原文链接:http://www.littlezheng.com/blog/2017/10/02/10038
junit测试入口:
TestRunner的main方法为junit测试的总入口,以下是main函数源码:
public static void main(String args[]) {
TestRunner aTestRunner = new TestRunner();
try {
TestResult r = aTestRunner.start(args);
if (!r.wasSuccessful()) {
System.exit(FAILURE_EXIT);
}
System.exit(SUCCESS_EXIT);
} catch (Exception e) {
System.err.println(e.getMessage());
System.exit(EXCEPTION_EXIT);
}
}
首先,
TestRunner aTestRunner = new TestRunner();
构造了一个TestRunner对象,然后通过start()方法开始测试,将测试的结果封装到TestResult对象中。
start()方法接受一个字符串数组作为参数,如果该字符串中包含了继承TestCase类的全类名,则说明该类为一个测试类,在接下来的测试中会执行该测试类中的测试方法,即所有以test开头的方法。
TestResult r = aTestRunner.start(args);
这句代码初始化了测试环境,执行了所有测试类的测试方法,并将结果封装。也就是说,这句代码完成了整个测试的生命周期。让我们看看start()方法
- TestRunner的start()方法
public TestResult start(String args[]) throws Exception {
String testCase = "";
String method = "";
boolean wait = false;
//解析过程...
try {
if (!method.equals("")) {
return runSingleMethod(testCase, method, wait);
}
Test suite = getTest(testCase);
return doRun(suite, wait);
} catch (Exception e) {
throw new Exception("Could not create and run test suite: " + e);
}
}
由以上代码可知,该方法解析了main()方法中传入的参数,如果有TestCase子类即测试类的话,就通过getTest()方法获取测试套件(TestSuite),然后通过doRun()方法
执行具体的测试代码,最后将测试结果封装到TestResult中返回。doRun()方法如下:
public TestResult doRun(Test suite, boolean wait) {
TestResult result = createTestResult();
result.addListener(fPrinter);
long startTime = System.currentTimeMillis();
suite.run(result);
long endTime = System.currentTimeMillis();
long runTime = endTime - startTime;
fPrinter.print(result, runTime);
pause(wait);
return result;
}
suite.run(result);这句代码执行了具体的测试代码并封装了测试结果。而suite是Test的实现类,这个对象是测试套件,需要进行一系列的初始化。因此要了解如何
获取测试套件,需要通过start()方法的getTest(testCase)方法入手。