Cucumber - 钩子

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)