构造函数
我们先看TestNG构造函数
/** Default constructor. Setting also usage of default listeners/reporters. */
//内部调用 init方法
public TestNG() {
init(true);
}
/**
* 内部属性赋值
*/
private void init(boolean useDefaultListeners) {
//TestNG实例
m_instance = this;
m_useDefaultListeners = useDefaultListeners;
//IConfiguration接口 存放一些信息
m_configuration = new Configuration();
}
//构造函数
public Configuration() {
init(new JDK15AnnotationFinder(new DefaultAnnotationTransformer()));
}
//这里熟悉吧 先讲到这里后续会有这里的源码
public JDK15AnnotationFinder(IAnnotationTransformer transformer) {
m_transformer = transformer;
m_annotationMap.put(IListenersAnnotation.class, Listeners.class);
m_annotationMap.put(IDataProviderAnnotation.class, DataProvider.class);
m_annotationMap.put(IFactoryAnnotation.class, Factory.class);
m_annotationMap.put(IObjectFactoryAnnotation.class, ObjectFactory.class);
m_annotationMap.put(IParametersAnnotation.class, Parameters.class);
m_annotationMap.put(ITestAnnotation.class, Test.class);
// internal
m_annotationMap.put(IBeforeSuite.class, BeforeSuite.class);
m_annotationMap.put(IAfterSuite.class, AfterSuite.class);
m_annotationMap.put(IBeforeTest.class, BeforeTest.class);
m_annotationMap.put(IAfterTest.class, AfterTest.class);
m_annotationMap.put(IBeforeClass.class, BeforeClass.class);
m_annotationMap.put(IAfterClass.class, AfterClass.class);
m_annotationMap.put(IBeforeGroups.class, BeforeGroups.class);
m_annotationMap.put(IAfterGroups.class, AfterGroups.class);
m_annotationMap.put(IBeforeMethod.class, BeforeMethod.class);
m_annotationMap.put(IAfterMethod.class, AfterMethod.class);
}
run
从前面的文章我们可以知道TestNG无论是从IDEA插件还是main方法最终都会调用org.testng.TestNG#run方法,所以我们这次就从run方法开始入手,看看内部到底发生了什么。先上代码
/** Run TestNG. */
public void run() {
initializeEverything();
sanityCheck();
runExecutionListeners(true /* start */);
runSuiteAlterationListeners();
m_start = System.currentTimeMillis();
List<ISuite> suiteRunners = runSuites();
m_end = System.currentTimeMillis();
if (null != suiteRunners) {
generateReports(suiteRunners);
}
runExecutionListeners(false /* finish */);
exitCode = this.exitCodeListener.getStatus();
if (exitCodeListener.noTestsFound()) {
if (TestRunner.getVerbose() > 1) {
System.err.println("[TestNG] No tests found. Nothing was run");
usage();
}
}
m_instance = null;
m_jCommander = null;
}
从上面的代码可以看出执行逻辑如下
上图中的4个步骤是整个TestNG运行的过程,其中我们要学习的是初始化、运行与生成报告
还有一点需要我们注意的就是在执行runSuite之前,执行了两个监听器分别是
- org.testng.IExecutionListener
- org.testng.IAlterSuiteListener