gpt4 book ai didi

selenium - 使用 dataprovider 执行并行 TestNG selenium 测试的驱动程序行为

转载 作者:行者123 更新时间:2023-12-02 20:05:54 27 4
gpt4 key购买 nike

我想在 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"}
};
}
}

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

这是 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="Your dataProvider's name"。在testng.xml中,使用parallel=instances而不是parallel=methods。

    上述方法的缺点是,当您收到报告时;可能是maven-Surefire、testng Eclipse 报告或 reportNG 报告,您看不到向上传递的参数正面。为了克服这个问题,您可以使用以下方法。

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

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

关于selenium - 使用 dataprovider 执行并行 TestNG selenium 测试的驱动程序行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17724073/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com