当前位置: 首页 > 知识库问答 >
问题:

如何从TestNG数据提供程序名称获取数据提供程序方法?

汪成仁
2023-03-14

有人知道TestNG如何根据为测试方法指定的数据提供者名称计算出数据提供者方法是什么吗?

我找到了这个解决方案:https://gist.github.com/ae6rt/3805639

但是,它没有考虑到数据提供者可能是:

  • 在完全不同的类别中定义,或
  • 在父类中定义,并且
  • 该方法可以是静态的,也可以是非静态的

我试图自己破解一些东西,但后来我想我不可能是第一个试图解决这个问题的人,特别是因为显然TestNG必须有一个解决方案。

有没有人知道TestNG是如何做到的,以及如何访问该业务逻辑?

我正在尝试计算启动时的“总测试计数”,如这里所讨论的:如何在TestNG启动时获得测试总量(包括考虑数据提供者)?

共有1个答案

宋鸿云
2023-03-14

这可能是一个很晚的回答,但仍在发布。

下面的示例显示了如何使用TestNG完成此操作。我正在使用TestNG 7.0.0-beta1(截至今天的最新发布版本)。

场景1:数据提供程序驻留在同一个类中。

import org.testng.annotations.DataProvider;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

@Listeners(DataProviderTrackingListener.class)
public class DataProviderInSameClass {

  @Test(dataProvider = "dp")
  public void testMethod(int i) {
    System.err.println(i);
  }

  @DataProvider(name = "dp")
  public Object[][] getData() {
    return new Object[][] {{1}, {2}};
  }
}

场景2:数据提供程序驻留在基类中。

import org.testng.annotations.DataProvider;

public class BaseClass {
  @DataProvider(name = "dp")
  public Object[][] getData() {
    return new Object[][] {{1}, {2}};
  }
}

import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

@Listeners(DataProviderTrackingListener.class)
public class DataProviderInBaseClass extends BaseClass {

  @Test(dataProvider = "dp")
  public void testMethod(int i) {
    System.err.println(i);
  }
}

场景3:数据提供程序位于完全不同的类中。

import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

@Listeners(DataProviderTrackingListener.class)
public class DataProviderInDifferentClass {

  @Test(dataProvider = "dp", dataProviderClass = BaseClass.class)
  public void testMethod(int i) {
    System.err.println(i);
  }
}

提取所有这些信息并将其显示给您的侦听器

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Optional;
import org.testng.ITestListener;
import org.testng.ITestResult;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class DataProviderTrackingListener implements ITestListener {

  @Override
  public void onTestStart(ITestResult result) {
    Test test = result.getMethod().getConstructorOrMethod().getMethod().getAnnotation(Test.class);
    if (test == null) {
      return;
    }
    Method method = null;
    Class<?> foundInClass = null;
    if (isDataProviderPresentInDifferentClass(test)) {
      method = extractDataProviderMethodFrom(test.dataProviderClass());
      foundInClass = test.dataProviderClass();
    } else {
      Class<?> currentClass = result.getInstance().getClass();
      while (currentClass != Object.class) {
        Optional<Method> methods =
            Arrays.stream(currentClass.getDeclaredMethods())
                .filter(
                    eachMethod -> {
                      DataProvider dataProvider = eachMethod.getAnnotation(DataProvider.class);
                      return (dataProvider != null
                          && dataProvider.name().equals(test.dataProvider()));
                    })
                .findFirst();
        if (methods.isPresent()) {
          method = methods.get();
          foundInClass = currentClass;
          break;
        }
        currentClass = currentClass.getSuperclass();
      }
    }
    if (method != null) {
      String msg =
          String.format(
              "Data provider [%s] found in class [%s]", method.getName(), foundInClass.getName());
      System.err.println(msg);
    }
  }

  private static boolean isDataProviderPresentInDifferentClass(Test test) {
    return test.dataProviderClass() != Object.class;
  }

  private static Method extractDataProviderMethodFrom(Class<?> clazz) {
    Optional<Method> method =
        Arrays.stream(clazz.getMethods())
            .filter(eachMethod -> eachMethod.getAnnotation(DataProvider.class) != null)
            .findFirst();
    return method.orElse(null);
  }
}
 类似资料:
  • 我想在类中与数据提供者并行运行测试方法。我需要一个数据提供者,它每次在新测试方法开始为给定的测试运行生成部分动态数据之前都会被调用。让我用伪代码解释一下: 我怎样才能做到这一点?

  • 我有以下问题 我有一个带有随机名称的测试,我必须记录我从数据提供者提供的两个测试参数。 我实现了一种方法,通过将它们连接到名称中,将它们记录为自定义处理的测试参数。 然而,TestNG还添加了未处理的参数(它们看起来像是随机生成的代码,带有包/类的名称和其他内容,如下图所示)。 是否有任何方法可以删除TestNG记录的数据提供程序测试参数?或者我可以用自定义数据提供程序测试参数覆盖它们吗? 顺便说

  • 我有一个TestNG Dataprovider测试,如下所示: 输入csv 读者 测验 有许多输入文件,每个测试都包含一个优先级。我想单独运行优先级为1的测试。 在没有数据提供者的情况下,我可以使用下面的IMethodInterceptor过滤测试。 样品测试: 由于数据提供者的优先级是动态的,因此我无法根据优先级过滤测试。 不应执行其他测试,而应跳过其他测试。

  • 我已使用以下方法在应用程序中输入凭据。 其中EnterText定义如下: 在测试类中,我写了下面的代码 我得到以下错误: 失败:loginProxy(“11”,“Priya”)java.lang.NumberFormatException:java.lang.Integer处为空。parseInt(未知源)位于java.lang.Integer。parseInt(未知源) 请帮助解决同样的问题。据

  • Entity Framework Core 通过一个提供程序模型来允许使用 EF 访问各种不同的数据库。一些概念对于大部分数据库是通用的,这些都包含在主要的 EF Core 组件中,包括 LINQ 的查询表达、事务以及从数据中加载出来后对象的变更跟踪。一些概念则是特定于个别提供程序,比如 SQL Server 提供程序允许你配置内存优化表(一个特定于 SQL Server 的功能),另外一些概念则

  • 我正在尝试通过TestNG进行多线程测试为测试实例化WebDrivers<代码>@AfterMethod在测试后关闭WebDrivers