当前设置是maven并行执行黄瓜,执行webdriver,执行chromedriver来测试我的软件:
行家:
<project>
...
<build>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
<parallel>both</parallel>
<threadCount>3</threadCount>
<runOrder>random</runOrder>
</configuration>
</plugin>
</plugins>
</build>
</project>
小黄瓜:
Function: Example
Scenario: Example 1
When I do something
Then I expect something
Scenario: Example 2
When I do some other thing
Then I expect some other thing
黄瓜JVM / Webdriver-JVM / Chromedriver:
@Before
public void setUp() {
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--window-size=1920,1080");
driver = new ChromeDriver(options);
driver.navigate().to(baseUrl);
}
@After
public void tearDown() {
if (driver != null) {
driver.quit();
}
}
原则上,这很好。按照maven pom的指示,测试以并行且随机的顺序执行,setUp()
在每个场景之前被调用,tearDown()
在每个场景之后被调用。
但是,ChromeDriver显然在一个浏览器会话中运行了多个测试,因此Cookies等在Function和Scenarios之间共享,导致它们之间无法正确隔离,从而导致Cookies,Session等问题进一步出现。
通过Cucumber-JVM并行运行Webdriver时,如何正确隔离每个测试用例(ChromeDriver会话)?
答案 0 :(得分:2)
我们还需要确保开发可以同时执行的测试,我们需要开发遵循某些最佳实践的测试。
它们是
独立测试方法:测试应相互独立。
线程安全引用的用法:测试应使用线程安全变量。例如,避免在测试中使用静态引用。
可重复:对于相同版本的应用程序和测试输入,测试应始终返回相同的结果。
您似乎正在使用WebDriverManager,并且在调用chromedriver()
function时,它会从instanceMap返回static的相关WebDriver实例,这似乎是根本原因你的问题。最好坚持使用ThreadLocal pattern,这样您就可以确信每个WebDriver实例都是绝对独立的。
如果您的资源允许,您可以在您的surefire插件配置中添加<forkMode>always</forkMode>
行,这样Maven将为每个线程创建一个新的JVM实例,因此您将不再遭受竞争状况的困扰,但是您的测试将开始消耗方式更多的RAM。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
<parallel>both</parallel>
<threadCount>3</threadCount>
<runOrder>random</runOrder>
<forkMode>always</forkMode> <!--this should help-->
</configuration>
</plugin>
</plugins>
</build>