当前位置: 首页 > 知识库问答 >
问题:

使用数据提供程序执行并行TestNG硒测试的驱动程序行为

宗政文彬
2023-03-14

我想在TestNg中并行运行硒测试,使用“数据提供者”。理想情况下,测试是按方法并行的(一个测试=一个方法),而不是简单的浏览器套件并行。我在某个地方读到过,一次可以控制大约5个ChromeDriver实例,所以我认为这应该是可能的。稍后,我计划转移到grid2。对于开发,我将通过右键单击XML配置文件上的运行来运行IntelliJ idea测试运行程序。

我在并行运行测试时遇到了问题(在grid2和本地),所以我创建了一个或多或少我想做什么的示例。

这是我的测试课

package tests;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.*;
import java.util.concurrent.TimeUnit;
import static org.testng.Assert.assertNotNull;

public class ParallelTest {
    public static final String SEARCH_TERMS = "search-terms";
    private WebDriver driver;

    @BeforeMethod
    @Parameters({"browser"})
    public void beforeMethod(@Optional("chrome") String browser){
        driver = getBrowser(browser);
        driver.manage().deleteAllCookies();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }

    private WebDriver getBrowser(String browser) {
        if(browser.equals("chrome")){
            System.setProperty("webdriver.chrome.driver", "webdrivers\\chromedriver.exe");
            return new ChromeDriver();
        }
        return new FirefoxDriver();
    }

    @AfterMethod
    public void afterMethod(){
        driver.quit();
    }

    @Test(description = "Check parallel selenium works.",
          dataProvider = SEARCH_TERMS)
    public void parallelSeleniumTest(String searchTerm){
        driver.get("http://google.com");
        WebElement search = driver.findElement(By.id("gbqfq"));
        new Actions(driver)
                .sendKeys(search, searchTerm)
                .sendKeys(search, Keys.ENTER)
                .perform();
        String firstResult = driver.findElements(By.className("r")).get(0).getText();
        assertNotNull(firstResult);
        System.out.println(firstResult);
    }

    @DataProvider(name = SEARCH_TERMS, parallel = true)
    public Object[][] getSearchTerms(){
        return new Object[][]{
                {"google"},
                {"microsoft"},
                {"facebook"},
                {"amazon"},
                {"apple"},
                {"oracle"},
                {"yahoo"},
                {"jetbrains"},
                {"intellij idea"},
                {"selenium"},
                {"java"},
                {"testng"},
                {"code"}
        };
    }
}

我加入了一些本地事件,因为我在测试套件中大量使用它们。

这里是TestNg xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="4" name="vfr6-ui-tests" parallel="methods">
    <test name="parallel-test-firefox">
        <parameter name="browser" value="firefox"/>
        <classes>
            <class name="tests.ParallelTest"/>
        </classes>
    </test>
    <test name="parallel-test-chrome">
        <parameter name="browser" value="chrome"/>
        <classes>
            <class name="tests.ParallelTest"/>
        </classes>
    </test>
</suite>

我读到,每次测试实例化一个驱动程序往往是最容易维护的。问题是,firefox测试以串行方式运行,而chrome测试将所有数据点作为测试用例吐出,试图打开大量浏览器实例,然后一切都失败了。我的测试将有10-25或300-500个数据点(在客户或客户x产品之间循环)。

设置驱动程序、数据提供程序和测试运行程序以在运行测试时实现最佳并行性的最佳方法是什么?

共有2个答案

公冶威
2023-03-14

你真的不需要使用工厂。如果我是你,我会在dataprovider方法中调用以下代码:

driver = getBrowser(browser);

然后,将驱动程序实例作为第二列参数返回给测试方法。这样做可以让数据提供者生成浏览器实例。为了改进这一点,您可以使用DriverHelper类形式的builder设计模式,该模式可以在将驱动程序实例传递到测试方法之前,用一种生成更具体的驱动程序配置的方法来替换getBrowser方法。

注意:请记住,如果将来想使用Spring加载驱动程序,那么这种方法根本不起作用。事实上,你根本无法使用数据提供者。但是,如果你不使用Spring,那么我会说这是最优雅的方式。

万俟亦
2023-03-14

我对数据提供者也有同样的经历。在我的例子中,我使用了dataProvider的(parallel=true)属性。你的问题有两种解决方案。

>

上述方法的缺点是,当您获得报告时;可能是maven-surefire、testng Eclipse报告或reportNG报告,您看不到前面传递的参数。为了克服这一点,您可以使用以下方法。

创建一个工厂类,并使用for循环在工厂方法中实例化测试类。(循环从0开始。)在测试类中,定义一个从工厂类接收参数的构造函数。在此测试类中定义一个dataProvider,它可以使用构造函数中接收的参数(数据点)。定义可以使用该参数或数据点的BeforeMethod或BeforeClass,测试方法的“dataProvider”属性应指向所需的dataProvider。同样,在testng中。xml使用parallel=“实例”。

此外,使用try/cat块来实例化驱动程序对象并关闭浏览器。这将有助于您避免因tearDown方法的设置失败而跳过。

 类似资料:
  • 我想在类中与数据提供者并行运行测试方法。我需要一个数据提供者,它每次在新测试方法开始为给定的测试运行生成部分动态数据之前都会被调用。让我用伪代码解释一下: 我怎样才能做到这一点?

  • 我想用Selenium和TestNG来模拟谷歌搜索,同时使用各种搜索参数。下面是我的测试类和testng。xml。我已经使用下面的注释

  • 我正在尝试通过TestNG进行多线程测试为测试实例化WebDrivers<代码>@AfterMethod在测试后关闭WebDrivers

  • suite name=“knowledgetest”verbose=“5”configfailurepolicy=“continue”data-provider-thread-count=“10”parallel=“methods”thread-count=“5”

  • 问题内容: 我想在TestNg中使用@dataprovider并行运行selenium测试。理想情况下,测试是按方法并行的(一种测试=一种方法),而不是浏览器的简单套件并行性。我读过某个地方的内容,一次可以控制大约5个ChromeDriver实例,因此我认为应该可以实现。稍后,我计划移至grid2。为了进行开发,我通过右键单击+在XML配置文件上运行,使用IntelliJ Idea测试运行器运行事

  • 我正在尝试使用selenium grid和TestNG对chrome和Firefox进行并行测试。 我正在使用@DataProvider使其使用单个excel文件进行数据驱动 但是,每次我尝试运行套件时,其中一个浏览器都会关闭,并在其中一个浏览器仍能正常运行测试脚本时抛出以下错误堆栈: 我有以下项目在testng.xml 对于before测试,我有以下内容,它位于名为Framework的类中,由名