Java 是否可以使用相同的数据提供程序将动态数量的参数传递给相同的testng测试?

Java 是否可以使用相同的数据提供程序将动态数量的参数传递给相同的testng测试?,java,testng,testng-dataprovider,Java,Testng,Testng Dataprovider,我有一个testng测试方法和它的数据提供者。我想使测试用例可重用于具有此功能的多个客户端。唯一需要注意的是,该功能在不同的客户端上的工作方式不同,即我必须为不同的客户端提供相同功能的不同数量的输入,并且最终结果对所有客户端都是相同的 目前,我通过为具有此功能的多个客户机定义多个测试方法和数据提供程序来实现这一点 例如:- @DataProvider(name="dp1") public Object[][] getDataForClient1() { //return data } @

我有一个testng测试方法和它的数据提供者。我想使测试用例可重用于具有此功能的多个客户端。唯一需要注意的是,该功能在不同的客户端上的工作方式不同,即我必须为不同的客户端提供相同功能的不同数量的输入,并且最终结果对所有客户端都是相同的

目前,我通过为具有此功能的多个客户机定义多个测试方法和数据提供程序来实现这一点

例如:-

@DataProvider(name="dp1")
public Object[][] getDataForClient1()
{
   //return data
}

@Test(dataProvider="dp1", groups={"client1"})
public void transferCredit(String senderId,String receiverId,String amount,String expectedResult)
{
   //Perform operation
}

@DataProvider(name="dp2")
public Object[][] getDataForClient2()
{
   //return data
}

@Test(dataProvider="dp2", groups={"client2"})
public void transferCredit(String senderId,String receiverId,String amount,String paymentReference,String expectedResult)
{
   //Perform operation
}
我开发了一个通用的测试逻辑来处理不同的参数集。我不能做的是对不同的参数集重复使用相同的测试方法

我想像下面这样做

@DataProvider(name="dp")
public Object[][] getData()
{
   //return data
}

@Test(dataProvider="dp", groups={"client1,client2"})
public void transferCredit(String ... params)
{
   //Perform operation
}

但这样做会导致testng异常,即参数不匹配。那么在TestNG中有什么方法可以做到这一点呢

虽然不知道有一个非常干净/直接的功能可以让它变得容易访问,但是很少有人会提出建议-

  • 使用
    数据提供程序中的数据超集
    ,当您以不同的方法使用它们时,您可以忽略不需要所有参数的超集中的额外参数。样本-

    @DataProvider(name="dp")
    public Object[][] getData() {
       //return data
    }
    
    @Test(dataProvider="dp1", groups={"client1"})
    public void transferCredit(String senderId,String receiverId,String amount,String expectedResult) {
       //Perform operation; Ignore paymentReference
    }
    
    @Test(dataProvider="dp", groups={"client2"})
    public void transferCredit(String senderId,String receiverId,String amount,String paymentReference,String expectedResult) {
        //Perform operation
    }
    
  • 您可以使用
    Method
    获取数据提供程序中调用方法的名称,并相应地调整返回对象。这是和样品差不多的

    如果您将@DataProvider声明为使用java.lang.reflect.Method 作为第一个参数,TestNG将通过此测试的当前测试方法 第一个参数。这在使用多种测试方法时特别有用 使用相同的@DataProvider,您希望它返回不同的值 取决于它提供数据的测试方法


  • 虽然不知道有一个非常干净/直接的特性可以让它变得可访问,但是很少有人会提出建议-

  • 使用
    数据提供程序中的数据超集
    ,当您以不同的方法使用它们时,您可以忽略不需要所有参数的超集中的额外参数。样本-

    @DataProvider(name="dp")
    public Object[][] getData() {
       //return data
    }
    
    @Test(dataProvider="dp1", groups={"client1"})
    public void transferCredit(String senderId,String receiverId,String amount,String expectedResult) {
       //Perform operation; Ignore paymentReference
    }
    
    @Test(dataProvider="dp", groups={"client2"})
    public void transferCredit(String senderId,String receiverId,String amount,String paymentReference,String expectedResult) {
        //Perform operation
    }
    
  • 您可以使用
    Method
    获取数据提供程序中调用方法的名称,并相应地调整返回对象。这是和样品差不多的

    如果您将@DataProvider声明为使用java.lang.reflect.Method 作为第一个参数,TestNG将通过此测试的当前测试方法 第一个参数。这在使用多种测试方法时特别有用 使用相同的@DataProvider,您希望它返回不同的值 取决于它提供数据的测试方法


  • 可以将数据包装为对象。在我看来,有些参数保持不变,有些则有所改变。因此,根据调用dataprovider的方法,创建一个包含senderid、receiverid、params和所有超集的类—仅设置所需的数据—并发送这些对象的数组。

    您可以将数据包装为对象。在我看来,有些参数保持不变,有些则有所改变。因此,根据调用dataprovider的方法,创建一个具有senderid、receiverid、params和所有超集的类-仅设置所需的数据-并发送这些对象的数组。

    另一个选项(除了此处已共享的选项)是执行类似操作

    public class TestSample {
    
        @Test(dataProvider = "dp")
        public void testMethod(Object object) {
            if (object instanceof String[]) {
                System.err.println("Incoming array was " + Arrays.toString((String[]) object));
            }
            if (object instanceof String) {
                System.err.println("Incoming string " + object);
            }
    
        }
    
        @DataProvider(name = "dp")
        public Object[][] getData() {
            return new Object[][]{
                    {new String[]{"TestNG", "JUnit"}},
                    {"Cedric Beust"}
            };
        }
    }
    
    但老实说,我不认为这是一个在TestNG中可以接受的特性请求。这只是我个人的意见。

    另一个选择(除了已经在这里分享的选择)是这样做

    public class TestSample {
    
        @Test(dataProvider = "dp")
        public void testMethod(Object object) {
            if (object instanceof String[]) {
                System.err.println("Incoming array was " + Arrays.toString((String[]) object));
            }
            if (object instanceof String) {
                System.err.println("Incoming string " + object);
            }
    
        }
    
        @DataProvider(name = "dp")
        public Object[][] getData() {
            return new Object[][]{
                    {new String[]{"TestNG", "JUnit"}},
                    {"Cedric Beust"}
            };
        }
    }
    

    但老实说,我不认为这是一个在TestNG中可以接受的特性请求。这只是我个人的意见。

    阅读现有的testng.xml文件,在运行时修改并执行它

    以下代码的作用: 我想在运行时为每个参数添加一个参数列表。这些参数作为maven运行时参数传递。它们是使用System.getProperty()方法读取的,如下所示。然后将这些参数添加到内部,并成功运行testng。这可以根据您的要求进行扩展

    下面的代码读取testng.xml文件并将参数添加到

    List<String> parameters = new ArrayList<>();
    parameters = Arrays.asList(System.getProperty("parameters").split(",");
    
    TestNG tng = new TestNG();
    File initialFile = new File("testng.xml");
    InputStream inputStream = FileUtils.openInputStream(initialFile);
    Parser p = new Parser(inputStream);
    List<XmlSuite> suites = p.parseToList();
    for(XmlSuite suite:suites){
        List<XmlTest> tests = suite.getTests();
        for (XmlTest test : tests) {
             for (int i = 0; i < parameters.size(); i++) {
                HashMap<String, String> parametersMap = new HashMap<>();
                parametersMap.put("parameter",parameters.get(i));
                test.setParameters(parametersMap);
            }
        }
    }
    tng.setXmlSuites(suites);
    tng.run();
    
    List parameters=new ArrayList();
    parameters=Arrays.asList(System.getProperty(“参数”).split(“,”);
    TestNG tng=新的TestNG();
    File initialFile=新文件(“testng.xml”);
    InputStream InputStream=FileUtils.openInputStream(初始文件);
    Parser p=新的解析器(inputStream);
    List suites=p.parsetList();
    用于(XmlSuite:suites){
    List tests=suite.getTests();
    for(XmlTest测试:测试){
    对于(int i=0;i
    读取现有的testng.xml文件,在运行时对其进行修改并执行它

    以下代码的作用: 我想在运行时为每个参数添加一个参数列表。这些参数作为maven运行时参数传递。使用System.getProperty()方法读取它们,如下所示。然后将这些参数添加到内部并成功运行testng。这可以根据您的要求进行扩展

    下面的代码读取testng.xml文件并将参数添加到

    List<String> parameters = new ArrayList<>();
    parameters = Arrays.asList(System.getProperty("parameters").split(",");
    
    TestNG tng = new TestNG();
    File initialFile = new File("testng.xml");
    InputStream inputStream = FileUtils.openInputStream(initialFile);
    Parser p = new Parser(inputStream);
    List<XmlSuite> suites = p.parseToList();
    for(XmlSuite suite:suites){
        List<XmlTest> tests = suite.getTests();
        for (XmlTest test : tests) {
             for (int i = 0; i < parameters.size(); i++) {
                HashMap<String, String> parametersMap = new HashMap<>();
                parametersMap.put("parameter",parameters.get(i));
                test.setParameters(parametersMap);
            }
        }
    }
    tng.setXmlSuites(suites);
    tng.run();
    
    List parameters=new ArrayList();
    parameters=Arrays.asList(System.getProperty(“参数”).split(“,”);
    TestNG tng=新的TestNG();
    File initialFile=新文件(“testng.xml”);
    InputStream InputStream=FileUtils.openInputStream(初始文件);
    Parser p=新的解析器(inputStream);
    List suites=p.parsetList();
    用于(XmlSuite:suites){
    List tests=suite.getTests();
    for(XmlTest测试:测试){