@test注释如何在testNG中运行?

时间:2015-07-20 06:52:27

标签: java testng

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

2 个答案:

答案 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的不同功能的更多信息:

http://testng.org/doc/documentation-main.html