Cucumber hook 使我们能够更好地管理代码工作流并帮助我们减少代码冗余.我们可以说这是一个看不见的步骤,它允许我们执行我们的场景或测试.
为了更好地理解这个概念,让我们举一个特征文件和步骤定义文件的例子. .
给定语句中突出显示的部分实际上完成了设置webdriver和结束webdriver会话的工作.因此,它实际上与"给定语句"的本质无关,它更像是测试的设置.此外,如果我们考虑更广泛的前景,那么在此功能的多个场景的情况下,此webdriver设置和清理将与每个给定语句一起运行.从逻辑上讲,只需执行一次设置和清理就可以了.
因此,为了实现优化,可以使用挂钩.更常见的是我们使用两种类型的钩子:"之前"钩子和"之后"钩子.即使方案通过或失败,方法/函数/代码片段在Before和After钩子中定义,总是运行.
顾名思义,钩子在任何钩子之前执行之前其他测试场景,以及在执行所有场景后执行钩子之后.
钩子仅在步骤定义文件中定义.
让我们自动化钩子之前和之后的例子.
第1步 : 创建Maven项目作为hookTest,在pom.xml中添加必要的依赖项.
步骤2 : 在 src/test/java
下创建一个名为hookTest的Java包.
步骤3 : 在包下创建名为 hookTest.java 的步骤定义文件.
package hookTest; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import cucumber.annotation.en.Given; import cucumber.annotation.en.Then; import cucumber.annotation.en.When; public class hookTest { WebDriver driver = null; @Before public void setUp(){ driver = new FirefoxDriver(); } @Given("^user navigates to facebook$") public void goToFacebook() { driver.navigate().to("https://www.facebook.com/"); } @When("^I enter Username as ([^]*) and Password as ([^]*)$") public void I_enter_Username_as_and_Password_as(String arg1, String arg2) { driver.findElement(By.id("email")).sendKeys(arg1); driver.findElement(By.id("pass")).sendKeys(arg2); driver.findElement(By.id("u_0_v")).click(); } @Then("^login should be unsuccessful$") public void validateRelogin() { if(driver.getCurrentUrl().equalsIgnoreCase( "https://www.facebook.com/login.php?login_attempt=1&lwv=110")){ System.out.println("Test Pass"); } else { System.out.println("Test Failed"); } driver.close(); } @After public void cleanUp(){ driver.close(); } }
第4步 : 在包下创建名为"hookTest.feature"的功能文件.
功能 : 场景大纲.
场景大纲 : 挂钩测试
鉴于用户导航到Facebook
当我输入用户名为"< username>"时和密码为"<密码>"
然后登录应该不成功
| username | password | | username1 | password1 |
第5步 : 创建一个运行器类文件.
在包dataTable中创建runTest.java作为runTest.java(参见场景概述一节)更详细的步骤.)
编写以下代码.
package hookTest; import org.junit.runner.RunWith; import cucumber.junit.Cucumber; @RunWith(Cucumber.class) @ Cucumber.Options(format = {"pretty","html:target/cucumber"}) public class runTest {}
保存文件.
使用选项运行测试;
从包资源管理器中选择runTest.java文件.
右键单击并选择"运行方式"选项.
选择JUnit测试.
所以现在当我们运行它时,以下将是执行.
在挂钩之前;设置webdriver和其他先决条件以运行测试.
给定语句
当陈述
然后声明
挂钩去;关闭webdriver并执行清理过程.
我们还可以指示是否我们希望钩子之前和之后仅使用特定标签执行. 示例 : @Before("@网络").标签逻辑的相同概念和/或也可以应用钩子. 示例 : @Before(@ dev,@ wip),@ Before(@ dev,〜@ wip)