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

是否可以将动态数量的参数传递给具有相同数据提供者的相同测试测试?

唐兴发
2023-03-14

我有一个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中有没有办法做到这一点呢?

共有3个答案

蒲勇
2023-03-14

不知道一个非常干净/直截了当的功能,使这个可访问的,但很少有建议会-

>

  • 使用DataDevelopder中的数据超集,当您在不同的方法中使用它们时,您可以忽略不需要所有参数的方法中的额外参数。示例-

    @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
    }
    

    您可以利用< code>Method来获取DataProvider中调用方法的名称,并相应地调整您的返回对象。这里是文档和样本差不多。

    如果您将@DataProvider声明为将java.lang.reflect.Method作为第一个参数,TestNG将为第一个参数传递当前的测试方法。当几个测试方法使用同一个@DataProvider,并且您希望它根据为哪个测试方法提供数据而返回不同的值时,这特别有用。

    @DataProvider(name="dp")
    public Object[][] getDataForClient2(Method m) {
       if(m.getName().equals("transferCreditM1") {
           //do X
       } else { 
           //do Y
       }     
    }
    

  • 韩季
    2023-03-14

    您可以将数据包装成一个对象。在我看来,有些参数保持不变,而有些发生了变化。所以用senderid、receiverid、params和所有这些超集创建一个类——只设置你需要的数据——基于调用dataprovider的方法,并发送这些对象的数组

    许丁雷
    2023-03-14

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

    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中被接受。只是我的个人意见。

     类似资料:
    • 问题内容: 与在或中使用的方式类似: 问题答案: 是。 如果你不理会关键字参数,这很简单并且可以工作: 如你所见,Python将为你提供一个包含所有参数的元组。 对于关键字参数,你需要将其作为单独的实际参数接受,如的所示。

    • 从excel文件读取测试数据。要求:我想首先我的所有测试应该运行在相同的测试数据,即excel行,然后所有测试与另一行。 解决方案:尝试将@Factory与我的@DataProvider一起使用 问题:如果我在@dataProvider中使用核心值,那么它可以正常工作。但是当从excel动态获取时,如果给我错误:[错误]导致:java.lang.NullPointerException } 基类

    • 问题内容: 在我们的项目中,我有几个JUnit测试,例如从目录中获取每个文件并对其进行测试。如果我在中实现了一种方法,那么它只会显示为可能失败或成功的一项测试。但是我对每个文件的结果都很感兴趣。如何编写一个/ 使得每个文件显示为单独的测试,例如在Eclipse的图形TestRunner中?(为每个文件编写显式测试方法不是一种选择。) 问题答案: 看看JUnit 4 中的 参数化测试 。 实际上,我

    • 问题内容: 我的JavaScript中有代码,可以使用ajax发布数据: 在控制器中,我有一个带有签名的方法: 我可以正确地拥有inttype。但是objectType不会为null,但是如果我确实喜欢objectType.prop1,它将抛出错误。如果我将用JSON.stringify JavaScript中的对象类型,则控制器中的objectType将具有字符串值。 是否可以使用像这样的动态数

    • Edit1:我有一个Excelutility.java类,可以从中获取单元格数据,并将其传递给我的测试类中的tests方法。 为了从excel文件中读取,我按照以下方式组织了测试方法: 我想做的是: > 从sheet1读取第一行数据,将其传递到test1,继续到test2 从工作表1读取第二行数据,将其传递到test1,继续到test2 并依此类推,具体取决于excel工作表中的行数。 结果是:

    • 问题内容: 假设我有一个Helper类,如下所示: 并且是将被设置一次,在构造函数的变量。 不是,因此我可以使用来区分变量和参数。 另一方面,是。在涉及静态变量时,是否有任何方法可以将其与参数区分开? 问题答案: 尽管不建议通过构造函数设置静态变量的值,但可以使用。