我对@test
注释的背景感到困惑。这个怎么运作?通过“for”循环?还是其他方法?我找不到git中的相关源代码,有人可以指出吗?
答案 0 :(得分:1)
TestNG 类是在 TestNg 框架中运行测试的入口点。 用户可以创建自己的 TestNG 对象并以多种不同的方式调用它: 在现有的 testng.xml 上 在一个完全由 Java 创建的综合 testng.xml 上 通过直接设置测试类
TestNG 首先创建一个 TestNG.Class 的对象,如下代码
/** 默认构造函数。还设置默认侦听器/报告器的使用。 */
public TestNG() {
init(true);
}
private void init(boolean useDefaultListeners) {
m_instance = this;
m_useDefaultListeners = useDefaultListeners;
m_configuration = new Configuration();
}
/**
设置要由该 TestNG 对象运行的测试类。此方法将创建一个虚拟套件
这将包装这些称为“命令行测试”的类。
如果与threadCount、parallel、groups、excludedGroups一起使用,那么这个必须是
先设置。
@param classes 包含 TestNG 注释的类数组。 */
public void setTestClasses(Class[] classes) { m_suites.clear(); m_commandLineTestClasses = 类; }
ITestNGListener iTestListener= new TestNgListenersTest(); testng.addListener(iTestListener);
如果我们想在我们的测试方法中添加监听器,上面的代码是由 TestNG 使用的,它只是一个接受 ITestNGListener 接口变量的方法。此方法检查在您的 ITestNGListener 变量中传递的实例,并基于此决定在 Test 中实现的内容。
public void addListener(ITestNGListener listener) {
if (listener == null) {
return;
}
if (listener instanceof IExecutionVisualiser) {
IExecutionVisualiser visualiser = (IExecutionVisualiser) listener;
maybeAddListener(m_executionVisualisers, visualiser);
}
if (listener instanceof ISuiteListener) {
ISuiteListener suite = (ISuiteListener) listener;
maybeAddListener(m_suiteListeners, suite);
}
if (listener instanceof ITestListener) {
ITestListener test = (ITestListener) listener;
maybeAddListener(m_testListeners, test);
}
if (listener instanceof IClassListener) {
IClassListener clazz = (IClassListener) listener;
maybeAddListener(m_classListeners, clazz);
}
if (listener instanceof IReporter) {
IReporter reporter = (IReporter) listener;
maybeAddListener(m_reporters, reporter);
}
if (listener instanceof IAnnotationTransformer) {
setAnnotationTransformer((IAnnotationTransformer) listener);
}
if (listener instanceof IMethodInterceptor) {
m_methodInterceptors.add((IMethodInterceptor) listener);
}
if (listener instanceof IInvokedMethodListener) {
IInvokedMethodListener method = (IInvokedMethodListener) listener;
maybeAddListener(m_invokedMethodListeners, method);
}
if (listener instanceof IHookable) {
setHookable((IHookable) listener);
}
if (listener instanceof IConfigurable) {
setConfigurable((IConfigurable) listener);
}
if (listener instanceof IExecutionListener) {
m_configuration.addExecutionListenerIfAbsent((IExecutionListener) listener);
}
if (listener instanceof IConfigurationListener) {
m_configuration.addConfigurationListener((IConfigurationListener) listener);
}
if (listener instanceof IAlterSuiteListener) {
IAlterSuiteListener alter = (IAlterSuiteListener) listener;
maybeAddListener(m_alterSuiteListeners, alter);
}
if (listener instanceof IDataProviderListener) {
IDataProviderListener dataProvider = (IDataProviderListener) listener;
maybeAddListener(m_dataProviderListeners, dataProvider);
}
if (listener instanceof IDataProviderInterceptor) {
IDataProviderInterceptor interceptor = (IDataProviderInterceptor) listener;
maybeAddListener(m_dataProviderInterceptors, interceptor);
}
}
运行测试用例和测试套件的最终调用由 run() 方法执行。 TestNG 调用 run 方法,其中多次调用其他方法,如 sanityCheck(),runExecutionListeners(),List suiteRunners = runSuites();等等。
/** 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;
}
generateReports() 方法也是 run() 方法中非常重要的方法调用,我想强调这一点,因为此方法接收一个 ISuite 接口列表,用于在套件运行结束时生成报告
private void generateReports(List<ISuite> suiteRunners) {
for (IReporter reporter : m_reporters.values()) {
try {
long start = System.currentTimeMillis();
reporter.generateReport(m_suites, suiteRunners, m_outputDir);
Utils.log(
"TestNG",
2,
"Time taken by " + reporter + ": " + (System.currentTimeMillis() - start) + " ms");
} catch (Exception ex) {
System.err.println("[TestNG] Reporter " + reporter + " failed");
ex.printStackTrace(System.err);
}
}
}
答案 1 :(得分:0)
TestNG中的@test注释将类或方法标记为测试的一部分。在以下链接中,您可以找到有关TestNG中@Test的不同功能的更多信息: