testng源码阅读之5

本文介绍了TestNG中@Test和@DataProvider注解的使用及源码解析。首先,@Test注解的查找和方法限制在AnnotationHelper.findMethodsWithAnnotation中进行。接着,TestNGMethodFinder和TestClass.initMethods()初始化测试方法。对于@DataProvider,通过findDataProvider()找到数据提供者,并在Parameters.handleParameters()中处理参数。MethodInvocationHelper.invokeDataProvider负责调用数据提供者并封装参数。最后,Invoker.invokeTestMethods()执行测试方法,支持单线程和多线程执行。TestNG的多线程执行策略确保了资源的有效管理和结果的正确汇总。
摘要由CSDN通过智能技术生成

testng里边的注释是如何应用的?

举最简单的两个例子:

@Test 这个注解

AnnotationHelper.findMethodsWithAnnotation
{
这里做最基本的判断:
1、先把有注解的找出来
2、有注解的方法不能有返回值,只能是void
3、给所有的测试方法编号
}

TestNGMethodFinder.getTestMethods–>

TestClass.initMethods()–>

Testrunner.initMethods() –>testRunner的构造函数


@Dataprovoider 这个注解

findDataProvider()–>
{
通过反射获取类中有@Dataprovider的类名跟方法名
}

Parameters.handleParameters();

这里就是按照传过来的dataprovider来初始化整个testmethod的执行的参数


  if (null != dataProviderHolder) {
      int parameterCount = testMethod.getConstructorOrMethod().getParameterTypes().length;

      for (int i = 0; i < parameterCount; i++) {
        String n = "param" + i;
        allParameterNames.put(n, n);
      }

      parameters = MethodInvocationHelper.invokeDataProvider(
          instance, /* a test instance or null if the dataprovider is static*/
          dataProviderHolder.method,
          testMethod,
          methodParams.context,
          fedInstance,
          annotationFinder);

      Iterator<Object[]> filteredParameters = filterParameters(parameters,
          testMethod.getInvocationNumbers());

      result = new ParameterHolder(filteredParameters, ParameterOrigin.ORIGIN_DATA_PROVIDER,
          dataProviderHolder);
    }

MethodInvocationHelper.invokeDataProvider
这里就是最基本的调用dataprovider的返回实现。也是通过注释实现的。
1、先做错误的判断处理
2、根据指定的分割符。来封装返回的参数列表
3、这里有个数据结构,是testng重写了的:internal.collections.Pair

  protected static Iterator<Object[]> invokeDataProvider(Object instance, Method dataProvider,
      ITestNGMethod method, ITestContext testContext, Object fedInstance,
      IAnnotationFinder annotationFinder) {
    Iterator<Object[]> result = null;
    final ConstructorOrMethod com = method.getConstructorOrMethod();

    // If it returns an Object[][], convert it to an Iterable<Object[]>
    try {
      List<Object> lParameters = Lists.newArrayList();

      // Go through all the parameters declared on this Data Provider and
      // make sure we have at most one Method and one ITestCont
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值