gpt4 book ai didi

java - @test 注释在 testNG 中如何工作?

转载 作者:太空宇宙 更新时间:2023-11-04 13:38:05 24 4
gpt4 key购买 nike

我对 @test 注释的背景感到困惑。怎么运行的?通过“for”循环?或者其他方法?我在git中找不到相关源代码,有人可以指出吗?

最佳答案

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、exclusiveGroups 一起使用,则必须是

  • 首先设置。

  • @param classes 包含 TestNG 注释的类的数组。*/

    public void setTestClasses(Class[] 类) {m_suites.clear();m_commandLineTestClasses = 类;}

    ITestNGListener iTestListener= new TestNgListenersTest();testng.addListener(iTestListener);

如果我们想在测试方法中添加监听器,上面的代码将由 TestNG 使用,它只不过是一个接受 ITestNGListener 接口(interface)变量的方法。此方法检查 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 接口(interface)列表,用于在 Suite 运行结束时生成报告

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);
}
}
}

关于java - @test 注释在 testNG 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31510326/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com