使用@Dataprovider并行运行测试

问题描述

我想为10个用户运行登录测试。用户凭据保存在Excel工作表中。因此,我不想一次又一次地运行此测试,而是想一次运行3个,这意味着前3行将启动3个专用的chrome浏览器,然后再运行3个,然后才1个。

enter image description here

但是问题是,浏览器也从不同的行中选择数据。

enter image description here

解决此问题,我尝试在“测试方法”中使用synchronized关键字,但随后浏览器没有并行打开,而是顺序打开,执行测试并退出

如何解决此问题?我希望每一行都有一个专用的Chrome浏览器。

public class DemoParallelTesting{

WebDriver wdriver;

@BeforeMethod
public synchronized void parallelDemo() throws Exception {
//  public void parallelDemo() throws Exception {
    wdriver = new ChromeDriver();
    wdriver.get("https://www.baseURL.com");
}

@Test(dataProvider = "loginData")
public void Registration_data(String testcasename,String sUserName,String sPassword) throws Exception {
    
    // Do login 
}

@DataProvider(name = "loginData",parallel = true)
public Object[][] getData() {
    String filepath= System.getProperty("user.dir") + "/src/test/resources/testData/" + "loginData.xlsx";
    Object data[][] = testData(filepath,"Sheet1");
    return data;

}

public Object[][] testData(String filepath,String sheetName) {
    // read excel file
    return data;

}

testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYstem "https://testng.org/testng-1.0.dtd">
<suite name="Suite" data-provider-thread-count="3">
  <test name="DemoTest" parallel="methods">
    <classes>
      <class name="rough.DemoParallelTesting"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

解决方法

使用数据提供程序类来进行此测试,而不是从excel进行学习。在这里,您需要更改:

  1. 在Registration_data定义中添加数据提供程序类
@Test(dataProvider = "loginData",dataProviderClass = DataProviderSource.class)
    public void Registration_data(String testcasename,String sUserName,String sPassword) throws Exception {
          
            // Do login 
    }
  1. 在dataprovider类中创建以下方法:
@DataProvider(parallel = true)
       public static Object[][] loginData() {
                Object[][] param = new Object[10][2];
                param[0][0] = test_user1;
                param[0][1] = passUser1;
                
                param[1][0] = test_user2;
                param[1][1] = passUser2;
                
                param[2][0] = test_user3;
                param[2][1] = passUser3;
        }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...