我有一个基于Selenium WebDriver的混合框架。运行我现在拥有的测试套件大约需要2-3个小时。什么是开始并行运行测试的最佳方法在同一台机器上(即使我使用Selenium Grid,我可以在一台机器上最多有多少个节点,前提是我也必须使用与Hub相同的机器?)。我有使用一台物理机器的约束,我没有使用Test NG。
答案 0 :(得分:1)
使用 failsafe plugin 使用 maven 运行它,方法是配置与多个线程并行运行。
下面是在 5 个线程中运行junit测试的示例代码,其中包含测试类(位于默认位置src/test/java
并使用默认的类inclusion规则)并行运行。 webdriver
中的BeforeClass
被实例化,并在AfterClass
方法中被销毁。 webdriver实例存储在静态ThreadLocal
变量中,以便将它们分开。
pom.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>
BaseClass -
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();
}
}
ThreadLocal -
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();
}
}
您甚至可以使用sharedwebdriver概念,其中只有在JVM关闭时才会关闭驱动程序。这个链接使用黄瓜,但很容易修改只是为了使用硒。删除前后挂钩并在junit挂钩中处理此部件。