Java @test注释在testNG中是如何工作的?

Java @test注释在testNG中是如何工作的?,java,testng,Java,Testng,我对@test注释的背景感到困惑。它是如何工作的?通过“for”循环?还是其他方法?我在git中找不到相关的源代码,有人能指出吗?TestNG中的@test注释将类或方法标记为测试的一部分。在以下链接中,您可以找到有关TestNG中@Test不同功能的更多信息: TestNG类是在TestNG框架中运行测试的入口点。 用户可以创建自己的TestNG对象,并以多种不同的方式调用它: 在现有的testng.xml上 在完全由Java创建的合成testng.xml上 通过直接设置测试类 TestNG首

我对
@test
注释的背景感到困惑。它是如何工作的?通过“for”循环?还是其他方法?我在git中找不到相关的源代码,有人能指出吗?

TestNG中的@test注释将类或方法标记为测试的一部分。在以下链接中,您可以找到有关TestNG中@Test不同功能的更多信息:


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注释的类数组。 */

    公共void setTestClasses(类[]类){ m_suites.clear(); m_commandLineTestClasses=类; }

    ITestNGListener iTestListener=newtestnglistenerstest(); testng.addListener(iTestListener)

如果我们想在测试方法中添加监听器,上面的代码由TestNG使用,TestNG只不过是一个接受ITestNGListener接口变量的方法。此方法检查在ITestNGListener变量中传递的实例,并根据该实例决定在测试中实现什么

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);
  }
}
运行Testcases和测试套件的最后一个调用由run()方法执行。TestNG调用run方法,其中有多个对其他方法的调用,如sanityCheck()、runExecutionListeners()、List suiteRunners=runSuites();等等

/**运行TestNG*/
公开募捐{
初始化所有内容();
卫生检查();
runExecutionListeners(true/*start*/);
运行SuiteAlterationListeners();
m_start=System.currentTimeMillis();
列出suiteRunners=runSuites();
m_end=System.currentTimeMillis();
如果(空!=suiteRunners){
发电机报告(SuiteRunner);
}
runExecutionListeners(false/*finish*/);
exitCode=this.exitCodeListener.getStatus();
if(exitCodeListener.noTestsFound()){
if(TestRunner.getVerbose()>1){
System.err.println(“[TestNG]未找到任何测试。未运行任何测试”);
用法();
}
}
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);
    }
  }
}
private void generatereport(列出SuiteRunner){
for(IReporter reporter:m_reporters.values()){
试一试{
长启动=System.currentTimeMillis();
reporter.generateReport(m_Suiters、suiteRunners、m_outputDir);
Utils.log(
“TestNG”,
2.
“+reporter+占用的时间:”+(System.currentTimeMillis()-start)+“ms”);
}捕获(例外情况除外){
System.err.println(“[TestNG]Reporter”+Reporter+”失败”);
例如printStackTrace(System.err);
}
}
}

谢谢你的回答,你可以看到重复的链接,但是上面的链接仍然不能解决我的问题,我想知道@Test的内部实现,而不是如何使用它
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);
    }
  }
}