我有一个基于Selenium WebDriver的混合框架。运行我现在拥有的测试套件大约需要 2-3 个小时。在同一台机器上开始并行运行测试的最佳方法是什么(即使我使用 Selenium Grid,一台机器上最多可以有多少个节点,前提是我还必须使用与 Hub 相同的机器?我有只使用一台物理机的限制,并且我没有使用测试 NG。
通过配置为与多个线程并行运行,使用故障安全插件使用maven运行它。
下面是在5个线程中运行 junit 测试的示例代码,其中测试类(放置在默认位置src/test/java
并使用默认类包含规则)并行运行。webdriver
在BeforeClass
中实例化,并在AfterClass
方法中销毁。Web 驱动程序实例存储在静态ThreadLocal
变量中,以使它们保持独立。
绒球.xml -
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<parallel>classes</parallel>
<threadCount>5</threadCount>
</configuration>
<executions>
<execution>
<id>integration-test</id>
<phase>integration-test</phase>
<goals>
<goal>integration-test</goal>
</goals>
</execution>
<execution>
<id>verify</id>
<phase>verify</phase>
<goals>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
基类 -
public class BaseTestIT {
@BeforeClass
public static void setup() {
System.setProperty("webdriver.chrome.driver", "");
WebDriver driver = new ChromeDriver();
ThreadWebDriver.set(driver);
}
@AfterClass
public static void teardown() {
ThreadWebDriver.get().quit();
ThreadWebDriver.remove();
}
}
线程本地 -
public class ThreadWebDriver {
private static final ThreadLocal<WebDriver> threadWebDriver = new InheritableThreadLocal<WebDriver>();
private ThreadWebDriver() { }
public static WebDriver get() {
return threadWebDriver.get();
}
public static void set(WebDriver driver) {
threadWebDriver.set(driver);
}
public static void remove() {
threadWebDriver.remove();
}
}
TestOneClass -这两个方法将在同一线程中运行。
public class FirstTestIT extends BaseTestIT {
@Test
public void testOne() {
System.out.println(Thread.currentThread().getId());
WebDriver driver = ThreadWebDriver.get();
driver.get("https://junit.org/junit4/");
driver.manage().window().maximize();
}
@Test
public void testTwo() {
System.out.println(Thread.currentThread().getId());
WebDriver driver = ThreadWebDriver.get();
driver.get("https://junit.org/junit5/");
driver.manage().window().maximize();
}
}
TestTwoClass -单个方法将在单独的线程中运行。
public class ThirdTestIT extends BaseTestIT{
@Test
public void test() {
System.out.println("third one");
WebDriver driver = ThreadWebDriver.get();
driver.get("https://stackoverflow.com/questions/tagged/selenium");
driver.manage().window().maximize();
}
}
您甚至可以考虑使用共享Web驱动程序概念,其中驱动程序仅在JVM关闭时关闭。此链接使用黄瓜,但很容易修改,仅用于硒的使用。移除前后钩子,并在 junit 钩子中处理此部分。