【问题标题】:Run tests in parallel using @Dataprovider使用 @Dataprovider 并行运行测试
【发布时间】:2020-08-18 21:54:33
【问题描述】:

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

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

为了克服这个问题我尝试在测试方法中使用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 -->

【问题讨论】:

  • 您是否尝试过在测试中声明和初始化本地WebDriver 对象?

标签: java selenium testng testng-dataprovider


【解决方案1】:

使用数据提供者类来做这个测试,而不是从 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;
        }

【讨论】:

  • 对于小数据我也想到了。但如果数据集增加到 500 或 5000?我知道您会建议 API 自动化,但客户坚持将其作为 UI 自动化。我也想了解线程概念。如何并行维护多个线程而不会从 1 个线程到另一个线程的数据泄漏/共享?
  • 您能否详细说明该问题。当你说“浏览器也从不同的行中挑选数据”时。我会理解您在从 excel 读取文件的 testData 方法中的登录存在问题。
  • 是的!所以你会看到不同的行有不同的唯一数据。现在,期望是 Thread1(Browser1) 应该从 Row1 中选择数据,browser2 从 row2 中选择数据,依此类推。但在实际 browser1 中,从其他行获取数据。
猜你喜欢
  • 2016-10-29
  • 2016-12-09
  • 1970-01-01
  • 2018-10-05
  • 2011-11-25
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
相关资源
最近更新 更多