当前位置: 首页 > 面试题库 >

使用dataprovider执行并行TestNGselenium测试的驱动程序行为

董飞航
2023-03-14
问题内容

我想在TestNg中使用@dataprovider并行运行selenium测试。理想情况下,测试是按方法并行的(一种测试=一种方法),而不是浏览器的简单套件并行性。我读过某个地方的内容,一次可以控制大约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产品之间循环)。

设置驱动程序,数据提供程序和测试运行程序以在运行测试中获得最佳并行性的最佳方法是什么?


问题答案:

我对dataProvider也有相同的经验。在我的情况下,我使用了dataProvider的(parallel = true)属性。您的问题有两种解决方案。

  1. 在测试类中使用dataProvider,并为构造函数使用工厂注释。在工厂注释的属性中,使用dataProvider =“您的dataProvider的名称”。在testng.xml中,使用parallel = instances而不是parallel = methods。

上述方法的缺点是在获取报告时;可能是mavensurefire,testng
Eclipse报告或reportNG报告,您看不到预先传递的参数。为了克服这个问题,您可以使用以下方法。

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

另外,使用try / catch块实例化驱动程序对象并关闭浏览器。这将帮助您避免由于tearDown方法的setUp失败而导致的跳过。



 类似资料:
  • 我使用testNg用于使用java的自动化,我使用从excel获取数据并作为参数传递给测试脚本。 假设我在中有10行数据,我的测试用例将按顺序执行10次,但现在我想并行运行这10个测试,同时使用线程。 这能做到吗?如果是的话,有人能给我一个同样的例子吗?

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

  • 问题内容: 我有一个测试,可以从数据提供者那里接收数据。我希望此测试与数据提供者的不同值并行运行。 我尝试了类似的方法: } 我收到的输出是: 你好:10 你好:12 你好:17 你好:11 你好:16 你好:14 你好:13 你好:15 产生10个线程,而我在线程池大小中指定5个。您能否告诉我们必须在上述代码段中添加哪些内容来控制数据提供程序线程池的大小。 问题答案: 您需要使用。在和不需要的值

  • 我正在使用@dataprovider TestNG 注释来传递不同的数据集。我的 TestNG 类包含 @BeforeClass、@DataProvider、三种@Test方法(一种使用数据提供程序的测试)和@After类。 数据提供程序包含 3 组数据(用户名和密码) 我只想知道如何按照以下顺序执行测试 --执行@Beforeclass - --转到测试并从数据提供程序打印第二组数据 --执行第

  • 我一个类有5到6个方法,想在不同的节点上并行运行方法,我有网格2设置,里面有4个节点。 下面是我的测试。xml 我有一个测试工具,它初始化了login、common和utils类 在我的测试类中,我扩展了测试工具,在@Beforemethod中,我调用了inilze方法 如果我运行测试,我会看到以下问题 两个浏览器在每个节点中打开一个,但只有一个浏览器启动应用程序,另一个不启动。 如果我遗漏了什么

  • 我试着运行这个简单的测试脚本。我试着从eclipse和cmd启动它。当我启动它时,我会得到提示消息 "无法从'C:\用户\C03049\AppData\本地\Temp\scoped_dir45'6_4977\内部'加载扩展。管理员禁用未打包扩展的加载。" 当我点击ok时,它会加载url,但随后我发现错误 “selenium.common.exceptions.WebDriverException: