0

我正在创建一个功能测试,selenium 将充当用户在网站上注册帐户,但是,网站注册有 16 个输入字段要填写。一些 Int 值和一些 String。有没有更简单的方法来做到这一点?

 @Test(dataProvider = "Reg")
  public void login(String sUsername, String sPassword, String sMemorableWord)  {

我在那里只传递了 3 个值,但完成完整的 reg 测试后,将有 16 个字符串或 Int 参数。这将是一个巨大的列表,还有其他方法吗?

4

2 回答 2

1

有一种更简单的方法可以做到这一点。如果您将测试的所有参数放在单个 Excel 电子表格行中,则只需将所有参数读入单个对象即可。然后,在您的数据提供者中,返回一个包含所有这些参数的对象。

@Test(dataProvider = "Reg")
public void login(WebDriver drvInstance, HashMap params)  {

这就是我以前的做法。然后,在 dataprovider 中,我只为每个测试创建新的驱动程序实例,并将所有参数收集到一个对象中,然后返回这两项。另外,我使用 Apache MetaModel 来读取电子表格。

在您的数据提供者中,执行以下操作:

@DataProvider(name = "test1")
public Object[][] prepareTestData() {
    Object[][] vals = new Object[columns][rows];
    for each row in spreadsheet {
        get rows from spreadsheet into a hashmap
        create new Capabilities object from hashmap values
        create webdriver from capabilities            
        add driver and hashmap to object[][]
    }
    return vals;
}

您可能没有意识到这一点的美妙之处在于,您传递回方法的那两个参数也可以从@BeforeMethod配置阶段访问。JUnit 无法做到的事情。此外,通过这种方式,TestNG 可以处理多个浏览器实例的线程。

此外,Rudziankoŭ 有一个观点。您可以在 dataprovider 方法中使用 Builder 模式来构造对象,但稍后我会在您让它工作后这样做。

于 2016-01-19T17:14:29.067 回答
0

您可以从 testng 中的 DataProvider 获得帮助。在 DataProvider 中,将所有值加载到可能是来自 excel 的 Hashtable 并以 Object[][] 的形式返回。

在 @Test 方法中收集该数据提供者,将 Hashtable h 作为参数传递给函数方法,然后您可以从哈希表中获取所需的数据。

下面简单的例子可以给你一个好主意..

 static WebDriver driver;

@Test(dataProvider="getdata")
public void myTestCase(Hashtable<String, String> h){

    driver=new FirefoxDriver();
    driver.get(h.get("url"));
}

@DataProvider(name="getdata")
public Object[][] testdata(){

    Hashtable<String, String> h=new Hashtable<>();

    //collect data from excel sheet
    h.put("url", "http://www.google.com");

    Object[][] obj={{h}};

    return obj;


}
于 2016-01-19T17:08:50.500 回答