依赖注入 - Cucumber Pico 容器
Dependency Injection - Cucumber Pico Container
在我的情况下,我很难理解和使用依赖注入。我想使用 Pico-container (https://cucumber.io/blog/2015/07/08/polymorphic-step-definitions)。
这是我的情况...我目前有一步定义 class,其中包含我所有的硒,并且变得太大了:
public class StepDefinitions{
public static WebDriver driver; // a driver is returned here from a static Driver Factory Class
LoginPage loginPage = new LoginPage(driver); //Page Object Model(s)
@Before("setup")
@After //screen snapshot
@After("destroy")
@Given //many methods with this tag
@When //many methods with this tag
@Then //many methods with this tag
}
现在我想 class 包含我的驱动程序、POM 和 Hooks:
public static WebDriver driver; //driver is returned from a static Driver Factory Class
LoginPage loginPage = new LoginPage(driver); //Page Object Model(s)
@Before("setup")
@After
@After("destroy")
另一个 class 包含我的 @Given
,一个 class 包含我的 @When
,另一个 class 包含我的 @Then
然后我需要正确连接所有东西,所以 所有 classes 都可以利用驱动程序、挂钩和 POM。 Cucumber 不支持继承,因此接口或依赖注入(Pico Container)是可行的方法。我不知道该怎么做,而且我已经在网上学习了,我只是无法理解所有这些。
您可能无法实现继承,但您可以在步骤定义class中使用构造函数来传递驱动程序对象引用 从一个 class 到另一个。
- 创建一个 base/foundation class 来初始化您的驱动程序对象/页面对象 classes。使用@Before 注释来定义设置,使用@After 来定义拆卸方法。
public class Step_Def_Base {
public static webDriverCreator test;
@Before
public void printScenario(Scenario scenario) {
test = new webDriverCreator(this.getClass().getSimpleName());
String className = this.getClass().getCanonicalName();
System.out.println("********************************************************");
System.out.println("Scenario: " + scenario.getName());
System.out.println("********************************************************");
}
@After
public void screenShotAndConsoleLog(Scenario result) {
test.takescreenshot.takeScreenShotOnException(result);
if (!(result.getStatus().contains("pass"))) {
throw new RuntimeException(result.getName() + " got failed");
}
test.closeBrowserSession();
}
}
- 在您的步骤定义 class 中,创建构造函数并使用上下文实例化 baseFoundation 对象。这就是 pico-container 发挥神奇作用的地方,它将步骤定义 class 的驱动对象与另一个 class 链接起来。
public class StepDefs_AltoroMutualLoginPage {
private Step_Def_Base contextStep;
private webDriverCreator test;
public StepDefs_AltoroMutualLoginPage(Step_Def_Base contextStep) {
// TODO Auto-generated constructor stub
this.contextStep = contextStep; // <-- This is where pico-containers starts working
test = contextStep.test; // <-- Linking your driver object reference from the point where it is instantiated , i.e the base foundation class
}
@Given("^I am on test fire login page \"([^\"]*)\"$")
public void alotoroMutualLoginPage(String url) {
test.launchApplication(url);
test.altoroMutual.launchLoginLink();
test.altoroMutual.verifyUserIsOnLoginPage();
}
现在您可以发挥创意,并相应地组织您的页面对象。我在返回 Web 驱动程序对象的包装器 class 中聚合并实例化了所有页面对象 classes。您可以在代码中看到,我正在从 test
对象访问 altoroMutual
pageObject class。
确保您正在使用 maven 来管理所有开发依赖项。以下依赖项应在您的项目中添加 pico 容器。
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-picocontainer</artifactId>
<version>1.2.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.picocontainer</groupId>
<artifactId>picocontainer</artifactId>
<version>2.14.3</version>
</dependency>
您可能对我的博客 post 感兴趣,我在其中使用 Pico Container 在两个不同的 Cucumber-JVM 步骤之间共享状态 类、http://www.thinkcode.se/blog/2017/04/01/sharing-state-between-steps-in-cucumberjvm-using-picocontainer
在我的情况下,我很难理解和使用依赖注入。我想使用 Pico-container (https://cucumber.io/blog/2015/07/08/polymorphic-step-definitions)。
这是我的情况...我目前有一步定义 class,其中包含我所有的硒,并且变得太大了:
public class StepDefinitions{
public static WebDriver driver; // a driver is returned here from a static Driver Factory Class
LoginPage loginPage = new LoginPage(driver); //Page Object Model(s)
@Before("setup")
@After //screen snapshot
@After("destroy")
@Given //many methods with this tag
@When //many methods with this tag
@Then //many methods with this tag
}
现在我想 class 包含我的驱动程序、POM 和 Hooks:
public static WebDriver driver; //driver is returned from a static Driver Factory Class
LoginPage loginPage = new LoginPage(driver); //Page Object Model(s)
@Before("setup")
@After
@After("destroy")
另一个 class 包含我的 @Given
,一个 class 包含我的 @When
,另一个 class 包含我的 @Then
然后我需要正确连接所有东西,所以 所有 classes 都可以利用驱动程序、挂钩和 POM。 Cucumber 不支持继承,因此接口或依赖注入(Pico Container)是可行的方法。我不知道该怎么做,而且我已经在网上学习了,我只是无法理解所有这些。
您可能无法实现继承,但您可以在步骤定义class中使用构造函数来传递驱动程序对象引用 从一个 class 到另一个。
- 创建一个 base/foundation class 来初始化您的驱动程序对象/页面对象 classes。使用@Before 注释来定义设置,使用@After 来定义拆卸方法。
public class Step_Def_Base {
public static webDriverCreator test;
@Before
public void printScenario(Scenario scenario) {
test = new webDriverCreator(this.getClass().getSimpleName());
String className = this.getClass().getCanonicalName();
System.out.println("********************************************************");
System.out.println("Scenario: " + scenario.getName());
System.out.println("********************************************************");
}
@After
public void screenShotAndConsoleLog(Scenario result) {
test.takescreenshot.takeScreenShotOnException(result);
if (!(result.getStatus().contains("pass"))) {
throw new RuntimeException(result.getName() + " got failed");
}
test.closeBrowserSession();
}
}
- 在您的步骤定义 class 中,创建构造函数并使用上下文实例化 baseFoundation 对象。这就是 pico-container 发挥神奇作用的地方,它将步骤定义 class 的驱动对象与另一个 class 链接起来。
public class StepDefs_AltoroMutualLoginPage {
private Step_Def_Base contextStep;
private webDriverCreator test;
public StepDefs_AltoroMutualLoginPage(Step_Def_Base contextStep) {
// TODO Auto-generated constructor stub
this.contextStep = contextStep; // <-- This is where pico-containers starts working
test = contextStep.test; // <-- Linking your driver object reference from the point where it is instantiated , i.e the base foundation class
}
@Given("^I am on test fire login page \"([^\"]*)\"$")
public void alotoroMutualLoginPage(String url) {
test.launchApplication(url);
test.altoroMutual.launchLoginLink();
test.altoroMutual.verifyUserIsOnLoginPage();
}
现在您可以发挥创意,并相应地组织您的页面对象。我在返回 Web 驱动程序对象的包装器 class 中聚合并实例化了所有页面对象 classes。您可以在代码中看到,我正在从 test
对象访问 altoroMutual
pageObject class。
确保您正在使用 maven 来管理所有开发依赖项。以下依赖项应在您的项目中添加 pico 容器。
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-picocontainer</artifactId>
<version>1.2.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.picocontainer</groupId>
<artifactId>picocontainer</artifactId>
<version>2.14.3</version>
</dependency>
您可能对我的博客 post 感兴趣,我在其中使用 Pico Container 在两个不同的 Cucumber-JVM 步骤之间共享状态 类、http://www.thinkcode.se/blog/2017/04/01/sharing-state-between-steps-in-cucumberjvm-using-picocontainer