TestNG : dataProvider 迭代一次后进入下一个测试
TestNG : Go to the next test after one iteration of dataProvider
所以我有 2 个测试,一个检查注册 test01_signIn
,如果它通过,则进入第二个测试 test02_CheckNewsStandElements
,它检查主页元素的可见性,唯一的问题是第一个测试有一个如下所示的 DataProvider:
@Test(dataProvider = "Data")
public void test01_signIn(String idMedia, String nomMedia, String idSSO, String mdpSSO, String lien) {
//Test
}
@Test
public void test02_CheckNewsStandElements(){
WebDriverWait wait = new WebDriverWait(driver,5);
WebElement modalCloseButton = null;
modalCloseButton = nsp.modalCloseButton(driver);
try{
wait.until(ExpectedConditions.visibilityOf(modalCloseButton));
}catch(TimeoutException e){
System.out.println("The Element isn't visible");
}
}
@DataProvider(name="Data")
public Object [][] getLists() throws IOException, GeneralSecurityException {
Object [][] objects = newEDLI.importData().clone();
return objects;
}
我得到的结果更像:
Test1
Test1
Test1
...
Test2
Test2
Test2
当我在寻找这样的结果时:
Test1 Test2 Test1 Test2
当您使用 @DataProvider
将数据注入测试方法时,TestNg 将 运行 此方法连续使用的次数与您拥有的数据一样多。此外,您的测试方法之间没有依赖关系。因此,您的 test01_signIn
独立于 test02_CheckNewsStandElements
.
执行
您可以考虑使用@Factory
来组织执行顺序。在这种情况下,您将数据注入测试 class 构造函数(数据提供者应该是静态的),并且您能够管理测试方法执行的顺序:
public class FactoryTest {
private String idMedia;
private String nomMedia;
// .. rest of your data
@Factory(dataProvider = "Data")
public FactoryTest(String idMedia, String nomMedia, ...) {
this.idMedia = idMedia;
this.nomMedia = nomMedia;
// set the rest of your fields
}
@DataProvider(name = "Data")
public static Object[] getList() {
return newEDLI.importData().clone();
}
@Test
public void test01_signIn() {
// use data from class members
}
@Test(dependsOnMethods = "test01_signIn")
public void test02_CheckNewsStandElements() {
WebDriverWait wait = new WebDriverWait(driver,5);
WebElement modalCloseButton = null;
modalCloseButton = nsp.modalCloseButton(driver);
try{
wait.until(ExpectedConditions.visibilityOf(modalCloseButton));
}catch(TimeoutException e){
System.out.println("The Element isn't visible");
}
}
}
注意:虽然测试会以正确的顺序执行,但在测试报告中它们仍然会被分组和排序。
所以我有 2 个测试,一个检查注册 test01_signIn
,如果它通过,则进入第二个测试 test02_CheckNewsStandElements
,它检查主页元素的可见性,唯一的问题是第一个测试有一个如下所示的 DataProvider:
@Test(dataProvider = "Data")
public void test01_signIn(String idMedia, String nomMedia, String idSSO, String mdpSSO, String lien) {
//Test
}
@Test
public void test02_CheckNewsStandElements(){
WebDriverWait wait = new WebDriverWait(driver,5);
WebElement modalCloseButton = null;
modalCloseButton = nsp.modalCloseButton(driver);
try{
wait.until(ExpectedConditions.visibilityOf(modalCloseButton));
}catch(TimeoutException e){
System.out.println("The Element isn't visible");
}
}
@DataProvider(name="Data")
public Object [][] getLists() throws IOException, GeneralSecurityException {
Object [][] objects = newEDLI.importData().clone();
return objects;
}
我得到的结果更像:
Test1
Test1
Test1
...
Test2
Test2
Test2
当我在寻找这样的结果时:
Test1 Test2 Test1 Test2
当您使用 @DataProvider
将数据注入测试方法时,TestNg 将 运行 此方法连续使用的次数与您拥有的数据一样多。此外,您的测试方法之间没有依赖关系。因此,您的 test01_signIn
独立于 test02_CheckNewsStandElements
.
您可以考虑使用@Factory
来组织执行顺序。在这种情况下,您将数据注入测试 class 构造函数(数据提供者应该是静态的),并且您能够管理测试方法执行的顺序:
public class FactoryTest {
private String idMedia;
private String nomMedia;
// .. rest of your data
@Factory(dataProvider = "Data")
public FactoryTest(String idMedia, String nomMedia, ...) {
this.idMedia = idMedia;
this.nomMedia = nomMedia;
// set the rest of your fields
}
@DataProvider(name = "Data")
public static Object[] getList() {
return newEDLI.importData().clone();
}
@Test
public void test01_signIn() {
// use data from class members
}
@Test(dependsOnMethods = "test01_signIn")
public void test02_CheckNewsStandElements() {
WebDriverWait wait = new WebDriverWait(driver,5);
WebElement modalCloseButton = null;
modalCloseButton = nsp.modalCloseButton(driver);
try{
wait.until(ExpectedConditions.visibilityOf(modalCloseButton));
}catch(TimeoutException e){
System.out.println("The Element isn't visible");
}
}
}
注意:虽然测试会以正确的顺序执行,但在测试报告中它们仍然会被分组和排序。