我将courgette-jvm 与cucumber-guice 结合使用以在没有ThreadLocal 的情况下并行化测试。它将小黄瓜中的场景特定信息输入到 ui 中,不需要任何 ThreadLocal 或 pool 。它也不需要你清洁任何东西。此设置会自动为每个场景创建单独的 webdriver 实例并并行运行单独的浏览器。我将它与 selenium hub 一起使用,并在需要时将其扩展到 docker
import courgette.api.CourgetteOptions;
import courgette.api.CourgetteRunLevel;
import courgette.api.CucumberOptions;
import courgette.api.testng.TestNGCourgette;
import org.testng.annotations.Test;
@Test
@CourgetteOptions(
threads = 10,
runLevel = CourgetteRunLevel.SCENARIO,
rerunFailedScenarios = true,
rerunAttempts = 1,
showTestOutput = true,
reportTitle = "Courgette-JVM Example",
reportTargetDir = "build",
environmentInfo = "browser=chrome; git_branch=master",
cucumberOptions = @CucumberOptions(
features = "src/test/resources/com/test/",
glue = "com.test.stepdefs",
//tags = {"@post or @get"},
publish = true,
plugin = {
"pretty",
"json:target/cucumber-report/cucumber.json",
"html:target/cucumber-report/cucumber.html"}
))
class AcceptanceIT extends TestNGCourgette {
}
相关的pom元素
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-testng</artifactId>
<version>6.9.1</version>
</dependency>
<dependency>
<groupId>io.github.prashant-ramcharan</groupId>
<artifactId>courgette-jvm</artifactId>
<version>5.11.0</version>
</dependency>
<dependency>
<!-- httpclient dpendendecy is to resolve courgette-jvm error - NoClassDefFoundError: org/apache/http/conn/ssl/TrustAllStrategy -->
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.10</version>
</dependency>
RemoteWebdriver 配置
protected RemoteWebDriver createDriver() throws MalformedURLException {
String hubURL =
"http://192.168.1.3:"+"selenium hub port here"+"/wd/hub";
ChromeOptions options = new ChromeOptions();
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
return (RemoteWebDriver) (driver = new RemoteWebDriver(new URL(hubURL), capabilities));
}
@Override
public RemoteWebDriver getDriver() throws MalformedURLException {
this.createDriver();
return (RemoteWebDriver) driver;
}
cucumber-guice 相关配置
import io.cucumber.guice.ScenarioScoped;
@ScenarioScoped
public class Global {
public RemoteWebDriver driver;
public Global() throws MalformedURLException, IOException {
driver = new DriverFactory().getManager();
// getManager() should have driver from above createDriver()
}
}
在您的 stepdefs 中注入 Global 类,如下所示(进行必要的导入)。您也可以注入辅助类,guice 将在每个场景中提供它
@Inject
Global global;
//then you can do
global.driver.get(site);
黄瓜酱的 pom
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-guice</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>