在testng中并行执行方法仅执行从类

时间:2019-02-27 14:25:32

标签: java multithreading selenium selenium-webdriver testng

我有一个包含3种方法的类的测试套件文件。在套件级别,我给出了parallel =“ methods” thread-count =“ 3”,以便为类中的每个方法并行打开3个线程。

执行该套件时,将打开3个线程(浏览器)以启动URL,但按照方法中的步骤仅执行第3个线程/浏览器。对于第1个2个线程/浏览器不执行任何操作。

尝试了很多找到该问题的答案,但找不到解决方案。以下是我使用的代码,如果我错过了一些内容,请纠正我。

BaseClass:

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个浏览器并行打开。第一浏览器应搜索“ parallel”。第二个浏览器应搜索“方法”。第三浏览器应搜索“自动化”。

实际结果: 并行打开3个浏览器,但是首先打开的2个浏览器按照该方法执行操作,最后打开的浏览器搜索单词“ parallelmethodtestng”并关闭。根据代码,打开的前2个浏览器不会关闭也不会最大化。

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

希望这会有所帮助。

4 个答案:

答案 0 :(得分:0)

WebDriver不是线程安全的。我可能会引用Selenium FAQ

  

问:WebDriver线程安全吗?
  答:WebDriver不是线程安全的。话虽如此,如果您可以序列化对底层驱动程序实例的访问,则可以在多个线程中共享一个引用。不建议这样做。另一方面,您可以为每个线程实例化一个WebDriver实例。

您的解决方案用于大型项目还是小型项目都是无关紧要的。如果要扩展解决方案,则可以始终使用Selenium网格进行并行执行。本地WebDriver对象将不是您的问题。吞噬Chrome实例的内存将是您的问题。

答案 1 :(得分:0)

我建议使用qaf TestNG extension,它负责驱动程序管理,资源管理以及更多用于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();
  }
}

您还可以make test data-driven使用内置数据提供程序。

答案 2 :(得分:0)

如果您只想使用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();
}

您还需要记住使用线程安全映射,列表等,例如concurentHashMap等。 它也适用于Selenium Grid。因此,ThreadLocal也应应用于RemoteWebDriver,因为它也不安全。

答案 3 :(得分:0)

由于thread-count不在正确的位置,因此可能发生。根据TestNG文档thread-count应该位于 suite 标签中。请按如下所述使用它。

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

在此处查看testng文档:

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