- Cucumber 教程
- Cucumber - 首页
- Cucumber - 概述
- Cucumber - 环境
- Cucumber - Gherkins
- Cucumber - 特性
- Cucumber - 场景
- Cucumber - 注解
- Cucumber - 场景大纲
- Cucumber - 标签
- Cucumber - 数据表
- Cucumber - 注释
- Cucumber - Hooks
- Cucumber - 命令行选项
- Cucumber - JUnit 运行器
- Cucumber - 报告
- Cucumber - 调试
- Cucumber - Java 测试
- Cucumber - Ruby 测试
- Cucumber 有用资源
- Cucumber - 快速指南
- Cucumber - 有用资源
- Cucumber - 讨论
Cucumber - Hooks
Cucumber 的**钩子**允许我们更好地管理代码工作流,并帮助我们减少代码冗余。我们可以说它是一个看不见的步骤,它允许我们执行我们的场景或测试。
为了更好地理解这个概念,让我们以一个特性文件和一个步骤定义文件为例。
给定语句中突出显示的部分实际上完成了设置 webdriver 和结束 webdriver 会话的工作。所以,它实际上与“给定语句”的本质无关,更像是测试的设置。此外,如果我们从更广阔的角度来看,那么对于此特性的多个场景,此 webdriver 设置和清理将与每个给定语句一起运行。从逻辑上讲,只有执行一次设置和清理才有意义。
因此,为了进行优化,可以使用钩子。我们通常使用两种类型的钩子:“Before”钩子和“After”钩子。在 Before 和 After 钩子中定义的方法/函数/代码片段始终运行,即使场景通过或失败。
顾名思义,before 钩子在任何其他测试场景之前执行,after 钩子在执行完所有场景后执行。
钩子仅在步骤定义文件中定义。
让我们自动执行 before 和 after 钩子的示例。
**步骤 1** - 创建名为 hookTest 的 Maven 项目,在 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://#/");
}
@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://#/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>”和密码为“<password>”时
则登录应不成功
示例
| username | password | | username1 | password1 |
**步骤 5** - 创建一个运行器类文件。
在 dataTable 包内创建运行器类为 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 测试。
因此,现在当我们运行它时,执行顺序如下。
Before 钩子 - 设置 webdriver 和运行测试的其他先决条件。
给定语句
当语句
则语句
After 钩子 - 关闭 webdriver 并执行清理过程。
带标签的钩子
我们还可以指示是否希望仅使用特定标签执行 before 和 after 钩子。**示例** - @Before(‘@Web’)。标签逻辑与或的概念也可以应用于钩子。**示例** - @Before(@dev,@wip), @Before(@dev,~@wip)