【问题标题】:Using both @DataProvider and @Parameters同时使用@DataProvider 和@Parameters
【发布时间】:2014-10-07 08:09:22
【问题描述】:

我想知道有没有办法同时使用@DataProviderParamaters来传递参数。

我尝试了两个选项,但都失败了:

@Parameters("Brand")
@Test(dataProvider="dpCGA", groups={"CGA"})
public void createAccount(String brand) {
    setBrand(brand);
}

上面示例中的数据提供者正在覆盖品牌变量。

@Parameters("Brand")
@Test(dataProvider="dpCGA", groups={"CGA"})
public void createAccount(String brand, String email) {
    setBrand(brand);
    createAccount(email);
}

测试用例甚至没有运行。

我正在使用 TestNG 运行我的测试用例,并希望从 XML 文件中获取品牌参数。

另外,我有一个用于保存电子邮件的 Excel 文件,并希望使用 @DataProvider 获取这些值。

可以同时使用这两个标签吗?如果没有,还有其他方法可以从 XML 文件中获取品牌参数吗?

提前致谢

【问题讨论】:

    标签: java selenium selenium-webdriver testng


    【解决方案1】:

    @DataProvider 是将参数传递给方法的方法之一。您不能将两者用于相同的方法。

    查看您的问题,您可以简单地将品牌添加到 DataProvider 方法中,例如,

      @DataProvider(name="dpCGA")
      public Object[][] data() {
    
        return new Object[][] { 
            {"brand", "email1"}, 
            {"brand", "email2"}
         };
      }
    

    并将其传递给方法,

    @Test(dataProvider="dpCGA", groups={"CGA"})
    public void createAccount(String brand, String email) {
        setBrand(brand);
        createAccount(email);
    }
    

    【讨论】:

    • 我知道我可以用@DataProvider 传递它,但只是想确定我不能同时使用这两种方法。感谢您的回复。
    【解决方案2】:

    根据您的情况,它实际上可能是“可行的”。特别是,如果您只有一个“参数”实例,例如因为您正在传递环境(开发、测试版...),那么您可以这样做:

    private String suiteBrand;
    
    @Parameters({"Brand"})
    @BeforeSuite
    public void setUp (final String Brand) {
       suiteBrand = Brand;
    }
    
    
    @Test(dataProvider="dpCGA", groups={"CGA"})
    public void createAccount(String email) {
        brand = suiteBrand;
        setBrand(brand);
        createAccount(email);
    }
    

    BeforeSuite 将使用参数执行,您可以在由数据提供者参数化的测试中访问它们。

    它可能与多个参数一起使用,或者与@BeforeEach 一起使用,但我还没有尝试过。

    【讨论】:

      【解决方案3】:

      你不能同时使用@DataProvider 和@Parameters。通过@DataProvider 传递所有参数。

      【讨论】:

        【解决方案4】:

        正如其他人已经指出的那样,接收DataProvider 结果以及套件参数是不可能的。这个答案通过单步执行代码证明了这一点:

        1. Invoker.invokeTestMethods() 将调用Parameters.handleParameters()
        2. 在那里它将尝试查找DataProvider
          • 如果找到,它将被调用。并且通过它之后不会添加套件参数,it passes the contextDataProvider
          • 如果没有找到,它将求助于xmlParameters

        虽然DataProvider 可以通过ITestContext 接收上下文,但这只会使在套件(XML) 中配置的参数可用,而不是通过系统属性指定。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多