TestNG源码分析04-RUN

TestNG运行

构造函数

我们先看TestNG构造函数

 /** Default constructor. Setting also usage of default listeners/reporters. */
 //内部调用 init方法
public TestNG() {
   init(true);
}
/**
  * 内部属性赋值
  */
private void init(boolean useDefaultListeners) {
    //TestNG实例
    m_instance = this;
    m_useDefaultListeners = useDefaultListeners;
    //IConfiguration接口 存放一些信息
    m_configuration = new Configuration();
}

//构造函数
public Configuration() {
    init(new JDK15AnnotationFinder(new DefaultAnnotationTransformer()));
}

//这里熟悉吧 先讲到这里后续会有这里的源码
public JDK15AnnotationFinder(IAnnotationTransformer transformer) {
    m_transformer = transformer;
    m_annotationMap.put(IListenersAnnotation.class, Listeners.class);
    m_annotationMap.put(IDataProviderAnnotation.class, DataProvider.class);
    m_annotationMap.put(IFactoryAnnotation.class, Factory.class);
    m_annotationMap.put(IObjectFactoryAnnotation.class, ObjectFactory.class);
    m_annotationMap.put(IParametersAnnotation.class, Parameters.class);
    m_annotationMap.put(ITestAnnotation.class, Test.class);
    // internal
    m_annotationMap.put(IBeforeSuite.class, BeforeSuite.class);
    m_annotationMap.put(IAfterSuite.class, AfterSuite.class);
    m_annotationMap.put(IBeforeTest.class, BeforeTest.class);
    m_annotationMap.put(IAfterTest.class, AfterTest.class);
    m_annotationMap.put(IBeforeClass.class, BeforeClass.class);
    m_annotationMap.put(IAfterClass.class, AfterClass.class);
    m_annotationMap.put(IBeforeGroups.class, BeforeGroups.class);
    m_annotationMap.put(IAfterGroups.class, AfterGroups.class);
    m_annotationMap.put(IBeforeMethod.class, BeforeMethod.class);
    m_annotationMap.put(IAfterMethod.class, AfterMethod.class);
}

run

从前面的文章我们可以知道TestNG无论是从IDEA插件还是main方法最终都会调用org.testng.TestNG#run方法,所以我们这次就从run方法开始入手,看看内部到底发生了什么。先上代码

/** 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;
  }

从上面的代码可以看出执行逻辑如下

Created with Raphaël 2.3.0 开始 initializeEverything(初始化) sanityCheck(检查) runSuites(执行) generateReports(生成报告) 结束

上图中的4个步骤是整个TestNG运行的过程,其中我们要学习的是初始化、运行与生成报告
还有一点需要我们注意的就是在执行runSuite之前,执行了两个监听器分别是

  1. org.testng.IExecutionListener
  2. org.testng.IAlterSuiteListener
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值