测试中的并行方法执行仅执行从类中调用的最后一个方法



我有一个带有3种方法的测试套件文件。在套件级别我并行="方法" thread-count =" 3",以便对类中的每种方法并行打开3个线程。

执行套件时,打开了3个线程(浏览器)启动URL,但仅根据方法中的步骤执行第三个线程/浏览器。对于第一个2个线程/浏览器执行的无动作。

尝试了很多东西来找到此问题的答案,但找不到解决方案。以下是我使用的代码,如果我错过了什么,请纠正我。

基础:

public class BaseClass {
    public WebDriver driver;
    public WebDriverWait wait;
    @BeforeMethod()
    public void configure() {
        System.setProperty("webdriver.chrome.driver","C:\SeleniumDrivers\chromedriver.exe");
          driver=new ChromeDriver();
          driver.get("https://www.google.com");
          driver.manage().window().maximize();
          driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);          
    }
    @AfterMethod()
    public void tearDown() {
        driver.quit();
    }
}

testMethods

  public class NewTest extends BaseClass{
  @Test()
  public void method1() {
      driver.findElement(By.name("q")).sendKeys("parallel");
      driver.findElement(By.name("q")).sendKeys(Keys.ENTER);
  }
  @Test()
  public void method2() {
      driver.findElement(By.name("q")).sendKeys("methods");  
      driver.findElement(By.name("q")).sendKeys(Keys.ENTER);
  }
  @Test()
  public void method3() {
      driver.findElement(By.name("q")).sendKeys("testng");
      driver.findElement(By.name("q")).sendKeys(Keys.ENTER);
  }
}

套房文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="methods">
  <test thread-count="5" name="Test">
    <classes>
      <class name="website.NewTest"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

预期结果:3个并行打开的浏览器。第一浏览器应搜索"并行"。第二浏览器应搜索"方法"。第三浏览器应搜索"自动化"。

实际结果:3个并行打开的浏览器,但首先打开的2个浏览器确实按照该方法执行操作,最后浏览器打开了" ParalletMethodtestng"一词并关闭的搜索。打开的前2个浏览器并不能按照代码最大化。

===============================================
Suite
Total tests run: 3, Failures: 2, Skips: 0
===============================================

希望这会有所帮助。

这可以发生,因为thread-count不在正确的位置。根据testng文档, thread-count应该在 suite 标签中。请如下所述使用它。

<suite name="My suite" parallel="methods" thread-count="5">

在此处检查测试文档:

http://testng.org/doc/documentation-main.html#parallallann-running

WebDriver不是线程安全的。我可能会引用硒常见问题解答

Q:Webdriver线程安全吗?
答:Web驱动器不是线程安全。话虽如此,如果您可以序列化访问基础驱动程序实例,则可以在多个线程中共享参考。这是不建议的。另一方面,您/can/在每个线程中实例化一个WebDriver实例。

如果您的解决方案用于庞大或小型项目,则无关紧要。如果要扩展解决方案,则可以随时使用硒网格进行并行执行。本地WebDriver对象将不是您的问题。分叉记忆进食Chrome实例将是您的问题。

我建议使用QAF TestNG扩展名,该扩展程序负责驱动程序管理,资源管理以及更多用于Web,移动和Web服务功能测试自动化。使用QAF,您的测试类可能看起来如下:

 public class NewTest extends WebDriverTestCase{
  @Test()
  public void method1() {
      getDriver().get("https://www.google.com");
      getDriver().findElement(By.name("q")).sendKeys("parallel");
      getDriver().findElement(By.name("q")).sendKeys(Keys.ENTER);
  }
  @Test()
  public void method2() {
      getDriver().get("https://www.google.com");
      //another improved way
      WebElement ele = getDriver().findElement(By.name("q"));
      ele.sendKeys("methods");  
      ele.sendKeys.submit();
  }
  @Test()
  public void method3() {
      getDriver().get("https://www.google.com");
      //another way with qaf
      WebElement ele = $("name=q");
      ele.sendKeys("testng");  
      ele.sendKeys.submit();
  }
}

更多您可以使用内置数据提供商进行测试驱动。

如果您只想使用testng而无需任何扩展名,则需要通过ThreadLocal

处理WebDriver
private final ThreadLocal<WebDriver> driver = new ThreadLocal<>();

应通过同步方法创建驱动程序。

public synchronized WebDriver createDriver() {
        return new ChromeDriver(options.getOptions());
}
@BeforeMethod(alwaysRun = true)
public void setupDriver(String browser) {
    driver.set(CcreateDriver());
}
public synchronized WebDriver getDriver() {
        return driver.get();
}

您还需要Remeber使用线程安全地图,列表等,例如Conturenthashmap等。它也用于硒网格。因此,也应将ThreadLocal应用于Remotewebdriver,因为它也不安全。

最新更新