使用 DataProvider 对象值进行 Testng 断言
Testng assert with DataProvider object values
我创建了一个功能测试错误登录测试,但我想用那些循环测试来断言
这是我的示例数据
@DataProvider(name = "Lgindataprovides")
public Object[][] getData(){
Object[][] data= {
{"abcd@mail.com","12345666"}#email and password wrong (asset text = enter email is not available please register)
{"xyz@mail.com","12345666"},#email correct password wrong (assert text = password is wrong)
return data;
}
这是我的测试
@Test(dataProvider = "Lgindataprovides", dependsOnMethods = "boofoo")
public void logintest(String email, String passowrd) {
driver.get("https://dummyurl/login");
driver.findElement(By.id("email")).sendKeys(email);
driver.findElement(By.id("password")).sendKeys(passowrd);
driver.findElement(By.cssSelector("button[type='submit']"));
Assert.assertEquals(get1stdatatest, "enter email is not available please register")
Assert.assertEquals(get2nderrordatatest, "password is wrong")
}
但是这个测试用例失败了,我该如何处理呢?
我要的是
当此数据"abcd@mail.com","12345666"
传递给登录测试时,它应该断言“输入电子邮件不可用,请注册”
当此数据xyz@mail.com","12345666
传递给登录测试时,它应该断言“输入电子邮件不可用,请注册”
我明白了,您想检查每个测试数据对的唯一错误消息。
- 将第 3 项添加到数据提供程序,其中包含您期望的错误消息文本。因此,每个 email/password 都将与错误消息相关联。
@DataProvider(name = "Lgindataprovides")
public Object[][] getData(){
Object[][] data= {
{"abcd@mail.com","12345666", "error-message-1"},
{"xyz@mail.com","12345666", "error-message-2"}
}
return data;
}
- 将第三个参数添加到您的测试中并断言实际错误符合预期。
@Test(dataProvider = "Lgindataprovides", dependsOnMethods = "boofoo")
public void logintest(String email, String passowrd, String expectedError) {
driver.get("https://dummyurl/login");
driver.findElement(By.id("email")).sendKeys(email);
driver.findElement(By.id("password")).sendKeys(passowrd);
driver.findElement(By.cssSelector("button[type='submit']"));
Assert.assertEquals(getActualErrorMessage(driver), expectedError)
}
- 调整获取实际错误信息文本的方法。您的 driver.findElement 定位器会同时找到密码或电子邮件错误消息。您可以尝试使用 xpath 并按 class
//*[contains(@class, 'some-error-class']
进行搜索。因此,您会在表单上收到任何错误消息文本,它应该可以正常工作。
private String getActualErrorMessage(WebDriver driver) {
driver.findElement(By.xpath("...")).getText();
}
您也可以在不创建新方法的情况下进行内联。如果需要,还可以添加一些 waits/timeouts。
我创建了一个功能测试错误登录测试,但我想用那些循环测试来断言
这是我的示例数据
@DataProvider(name = "Lgindataprovides")
public Object[][] getData(){
Object[][] data= {
{"abcd@mail.com","12345666"}#email and password wrong (asset text = enter email is not available please register)
{"xyz@mail.com","12345666"},#email correct password wrong (assert text = password is wrong)
return data;
}
这是我的测试
@Test(dataProvider = "Lgindataprovides", dependsOnMethods = "boofoo")
public void logintest(String email, String passowrd) {
driver.get("https://dummyurl/login");
driver.findElement(By.id("email")).sendKeys(email);
driver.findElement(By.id("password")).sendKeys(passowrd);
driver.findElement(By.cssSelector("button[type='submit']"));
Assert.assertEquals(get1stdatatest, "enter email is not available please register")
Assert.assertEquals(get2nderrordatatest, "password is wrong")
}
但是这个测试用例失败了,我该如何处理呢? 我要的是
当此数据
"abcd@mail.com","12345666"
传递给登录测试时,它应该断言“输入电子邮件不可用,请注册”当此数据
xyz@mail.com","12345666
传递给登录测试时,它应该断言“输入电子邮件不可用,请注册”
我明白了,您想检查每个测试数据对的唯一错误消息。
- 将第 3 项添加到数据提供程序,其中包含您期望的错误消息文本。因此,每个 email/password 都将与错误消息相关联。
@DataProvider(name = "Lgindataprovides")
public Object[][] getData(){
Object[][] data= {
{"abcd@mail.com","12345666", "error-message-1"},
{"xyz@mail.com","12345666", "error-message-2"}
}
return data;
}
- 将第三个参数添加到您的测试中并断言实际错误符合预期。
@Test(dataProvider = "Lgindataprovides", dependsOnMethods = "boofoo")
public void logintest(String email, String passowrd, String expectedError) {
driver.get("https://dummyurl/login");
driver.findElement(By.id("email")).sendKeys(email);
driver.findElement(By.id("password")).sendKeys(passowrd);
driver.findElement(By.cssSelector("button[type='submit']"));
Assert.assertEquals(getActualErrorMessage(driver), expectedError)
}
- 调整获取实际错误信息文本的方法。您的 driver.findElement 定位器会同时找到密码或电子邮件错误消息。您可以尝试使用 xpath 并按 class
//*[contains(@class, 'some-error-class']
进行搜索。因此,您会在表单上收到任何错误消息文本,它应该可以正常工作。
private String getActualErrorMessage(WebDriver driver) {
driver.findElement(By.xpath("...")).getText();
}
您也可以在不创建新方法的情况下进行内联。如果需要,还可以添加一些 waits/timeouts。