我正在创建一个功能测试,selenium将作为用户在网站上注册一个帐户,但是,网站注册有16个输入字段要填写。一些Int值和一些String。有没有更简单的方法呢?
@Test(dataProvider = "Reg")
public void login(String sUsername, String sPassword, String sMemorableWord) {
我只传递了3个值,但完成了reg测试,将会有16个字符串或Int参数。这将是一个巨大的列表,还有另一种方法吗?
答案 0 :(得分:1)
有一种更简单的方法可以做到这一点。如果将测试的所有参数放在单个Excel电子表格行中,则只需将所有参数读入单个对象。然后,在dataprovider中,返回包含所有这些参数的单个对象。
@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模式来构造对象,但是在您使用它之后我会这样做。
答案 1 :(得分: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;
}