如何在我的测试方法中指定之前设置 dataProvider Name

How to set dataProvider Name before specifying in my test method

在我的测试方法中设置 dataProvider 名称之前,我正在尝试检查我将 运行 我的测试的环境。

public class AssignmentSOAPTest {
    private static final String  ctdataProvName=System.getProperty("env");
    

   @BeforeClass
   public void setUp()  {
   }


   @Test(dataProvider = ctdataProvName, dataProviderClass CCCAssignmentSOAPDataProvider.class)
   @Feature("FullCCCAssignment")
   public void tc01FullCCCAssignment(int a,int b,int c) {

    System.out.println("These are the number provided by Data Provider "+  a+"," +b+","+c);

}

}

在这种情况下,因为我的@Test 方法给我一个错误:属性值必须是常量。我发现这是因为我设置常量的方式不正确。在设置常量之前,我尝试了不同的方法来检查环境,但无法弄清楚。有办法吗?

我想在设置名称之前检查环境的原因是因为这样我的 testScript 中需要的 @Test 方法会更少。我有 4 个不同的环境以及 10 个不同的测试用例。不同环境的测试用例相同,但数据不同。

我的数据提供者 class 看起来像这样(没有添加所有环境,数据会有所不同):

   @DataProvider (name = "ct-environment-data-provider")
   public Object[][] ctDPMethod (Method m){
       switch (m.getName()) {
        case "tc01FullCCCAssignment":
            return new Object[][] {{2, 3 , 5}};
        case "minimumAssignment":
            return new Object[][] {{2, 3, -1}};
        case "updateAssignment":
            return new Object[][] {{1, 3, -1}};
        case "cancelAssignment":
            return new Object[][] {{3, 3, -1}};
        case "saveAssignment":
            return new Object[][] {{8, 3, -1}};
        case "openShopAssignment":
            return new Object[][] {{5, 3, -1}};
        case "casualtyAssignment":
            return new Object[][] {{6, 3, -1}};
   }
   return null;
}

@DataProvider (name = "int-environment-data-provider")
public Object[][] intDPMethod (Method m){
    switch (m.getName()) {
        case "tc01FullCCCAssignment":
            return new Object[][] {{1, 1 , 5}};
        case "minimumAssignment":
            return new Object[][] {{2, 3, -1}};
        case "updateAssignment":
            return new Object[][] {{1, 3, -1}};
        case "cancelAssignment":
            return new Object[][] {{3, 3, -1}};
        case "saveAssignment":
            return new Object[][] {{8, 3, -1}};
        case "openShopAssignment":
            return new Object[][] {{5, 3, -1}};
        case "casualtyAssignment":
            return new Object[][] {{6, 3, -1}};
    }
}

您可以使用 IAnnotationTransformer class 根据 System.getProperty 设置数据提供者名称。注释转换器可用于修改 @Test 注释,它将在任何测试 运行.

之前执行
public class CustomTransformer implements IAnnotationTransformer {
    private static final String  ctdataProvName = System.getProperty("env");
    
    // include the name of all the test methods in the below list, 
    // for which you need to update the data provider name
    private static final List<String> methods = Arrays.asList("tc01FullCCCAssignment");

    @Override
    public void transform(ITestAnnotation annotation,
                          Class testClass,
                          Constructor testConstructor,
                          Method testMethod) {

        if(testMethod != null && methods.contains(testMethod.getName())) {
            annotation.setDataProvider(ctdataProvName);
        }
    }
}

现在,您需要在 <suite> 标签下的套件 xml 文件中提及注释转换器:

<listeners>
    <listener class-name="com.yourpackage.CustomTransformer" />
</listeners>

一些侦听器可以在测试 class 本身使用 @Listener 注释声明,但注释转换器 只能通过套件 xml[=24= 定义].这是因为需要在处理测试 classes 之前执行注释转换器,以便最终确定注释。