testng的入口在哪里
先上图。
入口就在这个包里边.具体的类就是testNG.class
/**
* The TestNG entry point for command line execution.
*
* @param argv the TestNG command line parameters.
* @throws FileNotFoundException
*/
public static void main(String[] argv) {
TestNG testng = privateMain(argv, null);
System.exit(testng.getStatus());
}
/**
* <B>Note</B>: this method is not part of the public API and is meant for internal usage only.
*/
public static TestNG privateMain(String[] argv, ITestListener listener) {
TestNG result = new TestNG();
if (null != listener) {
result.addListener(listener);
}
//
// Parse the arguments
//
try {
CommandLineArgs cla = new CommandLineArgs();
m_jCommander = new JCommander(cla, argv);
validateCommandLineParameters(cla);
result.configure(cla);
}
catch(ParameterException ex) {
exitWithError(ex.getMessage());
}
//
// Run
//
try {
result.run();
}
catch(TestNGException ex) {
if (TestRunner.getVerbose() > 1) {
ex.printStackTrace(System.out);
}
else {
error(ex.getMessage());
}
result.setStatus(HAS_FAILURE);
}
return result;
}
上边这段就是具体的入口。main直接调用了privateMain,在privateMain里边做具体的初始化工作。
第一步:
加载监听器
第二步:
解释命令行参数
第三步:
正式运行
看了这个短短几行代码,冒出来几个问题:
1)为啥无端端要弄个privateMain?
看英文注释,privateMain应该会被多个地方调用,但我仍觉得这个是多此一举。
2)看起来listeners如果是在本地运行,应该永远都是空才是,那有啥用?
这个大致看了下,命令行方式的启动,会在privateMain里边的configure函数做默认listeners的加载。如果在
命令行的xml指定了使用别的listeners,就会替换掉默认的。这个是testng灵活扩展的关键。
具体的listeners的加载跟定义。后边结合testng的运行跟加载机制,详细说明。