Cucumber-Java8-在lambda表达式中使用@Before
我有一个使用cucumber的JavaSelenium项目。步骤定义位于一组文件中,这些文件重用BaseDefinitions文件中的代码,如下所示:Cucumber-Java8-在lambda表达式中使用@Before,java,selenium,cucumber,Java,Selenium,Cucumber,我有一个使用cucumber的JavaSelenium项目。步骤定义位于一组文件中,这些文件重用BaseDefinitions文件中的代码,如下所示: public class BaseDefinitions { private WebDriver driver; @Before public void setUp(Scenario scenario) throws Exception { String path = getClass()
public class BaseDefinitions {
private WebDriver driver;
@Before
public void setUp(Scenario scenario) throws Exception {
String path = getClass()
.getClassLoader()
.getResource("chromedriver.exe")
.getPath();
System.setProperty("webdriver.chrome.driver", path);
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@After
public void teardown() {
driver.close();
try {
driver.quit();
}
catch(Exception e) {
System.out.println("Caught driver error on quit.");
}
}
public WebDriver getDriver() {
return driver;
}
}
(示例缩减为第一个@给定语句):
BaseDefinitions文件(短版本)如下所示:
public class BaseDefinitions {
private WebDriver driver;
@Before
public void setUp(Scenario scenario) throws Exception {
String path = getClass()
.getClassLoader()
.getResource("chromedriver.exe")
.getPath();
System.setProperty("webdriver.chrome.driver", path);
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@After
public void teardown() {
driver.close();
try {
driver.quit();
}
catch(Exception e) {
System.out.println("Caught driver error on quit.");
}
}
public WebDriver getDriver() {
return driver;
}
}
这工作良好-胶水代码等都设置正确。然而,随着更新,Cucumber现在生成的是lambda表达式,而不是以前使用的格式。我对如何实施这些措施感到困惑
- 如果我在构造函数中实现它们(如前所述),那么BaseDefinitions文件的@Before语句只在我运行该功能时的测试之后执行——这是没有用的李>
- 如果我将它们放在一个方法中,如图所示,当我运行功能文件时,它会运行@Before语句,但找不到步骤定义李>
,您可以使用下面的代码片段实现缺少的步骤:
:
public class lambdaTestDefinitions implements En {
private BaseDefinitions baseDefinitions;
private WebDriver driver;
public lambdaTestDefinitions(BaseDefinitions baseDefinitions) {
this.baseDefinitions = baseDefinitions;
this.driver = baseDefinitions.getDriver();
}
private void testLambdaSteps () {
Given("I try to navigate to www.google.co.uk", () -> {
driver.get("http://www.google.co.uk");
});
Then("I should be on the Google home page", () -> {
// Write code here that turns the phrase above into concrete actions
Assert.assertEquals(driver.getCurrentUrl(), "http://www.google.co.uk");
});
}
}
很明显,我遗漏了一些东西——我如何才能让它发挥作用
编辑:这是我的身材。据我所见,我没有使用Cucumber的Java8版本,我也不太理解:
buildscript {
repositories {
mavenCentral()
}
}
plugins {
id 'java'
//id "com.github.spacialcircumstances.gradle-cucumber-reporting" version "0.1.2"
}
group 'org.myorg'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
jcenter()
}
project.ext {
cucumberVersion = '4.0.0'
}
dependencies {
compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.5.1'
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile 'io.cucumber:cucumber-java:' + cucumberVersion
testCompile 'io.cucumber:cucumber-junit:' + cucumberVersion
testCompile group: 'com.browserstack', name: 'browserstack-local-java', version:'1.0.1'
testCompile group: 'io.cucumber', name: 'cucumber-picocontainer', version: '2.1.0'
testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3'
testCompile group: 'org.testng', name: 'testng', version: '6.9.10'
testCompile 'io.github.prashant-ramcharan:courgette-jvm:3.1.0'
}
test {
systemProperties System.getProperties()
ignoreFailures = true
systemProperty "localBrowser", System.getProperty("localBrowser")
systemProperty "browserstackLocal", System.getProperty("browserstackLocal")
systemProperty "browser", System.getProperty("browser")
testLogging.showStandardStreams = true
test.outputs.upToDateWhen {false}
}
这工作良好-胶水代码等都设置正确。然而,随着更新,Cucumber现在生成的是lambda表达式,而不是以前使用的格式
您将cucumber-java8
而不是cucumber-java
添加到依赖项中
如果我将它们放在一个方法中,如图所示,当我运行功能文件时,它会运行@Before语句,但找不到步骤定义
这只适用于一些扩展Cucumber的框架。但是,eclipse插件支持这两种符号
如果我在构造函数中实现它们(如这里所讨论的),那么BaseDefinitions文件的@Before语句只在我运行该功能时的测试之后执行——这是没有用的
您将黄瓜步骤的执行与步骤定义的创建混为一谈。步骤定义的创建发生在对其调用任何步骤之前<代码>this.driver=baseDefinitions.getDriver()创建GoogleDefinitions
时调用code>,因此始终在创建驱动程序的方法之前调用
相反,您应该延迟调用,直到调用该步骤
public class lambdaTestDefinitions implements En {
public lambdaTestDefinitions(BaseDefinitions baseDefinitions) {
Given("I try to navigate to www.google.co.uk", () -> {
baseDefinitions.getDriver().get("http://www.google.co.uk");
});
Then("I should be on the Google home page", () -> {
// Write code here that turns the phrase above into concrete actions
assertEquals(baseDefinitions.getDriver().getCurrentUrl(), "http://www.google.co.uk");
});
}
}
您也可能有兴趣调查这个问题。您可以使用和。它们可以帮助您设置在Cucumber启动场景之前需要设置的内容 多谢各位。将驱动程序调用添加到步骤中已解决此问题。奇怪的是(请参见上面的编辑),我的build.gradle没有指定cucumber-java8(就我所能看到的而言),我不确定它为什么要使用它。还感谢您指出PicoContainers阅读,这可能是一个更好的方法。更新:cucumber-java8已经通过一个未知的路径潜入到我的项目依赖项中。我已经删除了它,正在获取旧的注释片段。然而,这给了我两种方法来实现同样的目标,这很好。