Cucumber中的hook是什么?


Cucumber中的hook是什么?

在 Cucumber 中,hook 是代码块,可以使用@Before@After注释在步骤定义文件中为每个场景定义。这些@Before 和@After 注释创建了一个块,我们可以在其中编写代码。

黄瓜上钩

Cucumber hook帮助我们更好地处理代码工作流,也帮助我们减少代码冗余。

句法:

@Before setup ()  
{    
logic   

   } @  

Scenario  
Given  
When  
And  
Then  

@After cleanup (){    
      logic    
   }

根据代码逻辑,hook 的工作是在特定函数/方法之后启动和关闭 Web 驱动程序会话。因此,实际上,它与任何功能/方法或场景无关。

注意:Hook只能在步骤定义文件中定义。

Hook的需要

在测试时,我们可能会遇到需要在测试场景测试之前执行一些常规前提步骤的情况。

考虑以下先决条件以了解在测试时可能遇到的先决条件类型:

  • 启动网络驱动程序
  • 建立数据库连接
  • 测试数据的设置
  • 浏览器cookies的设置
  • 导航到某个页面

同样,在测试之后,总会有一些前提步骤可能会遇到:

  • 停止网络驱动程序
  • 关闭数据库连接
  • 清除测试数据
  • 清除浏览器 cookie
  • 从应用程序注销
  • 打印报告或日志
  • 错误截图

为了处理这些类型的常规前提步骤,使用cucumber hook是最佳选择。

Hook注释

与 TestNG Annotations 不同,cucumber 仅支持两个钩子:

  • @Before
  • @After

@Before

顾名思义,我们可以将@Before钩子与函数/方法一起使用,之后我们需要启动 Web 驱动程序。

@After

顾名思义,我们可以将@After钩子与函数/方法一起使用,然后我们需要关闭 Web 驱动程序。

让我们通过一个步骤定义文件的例子更好地理解这个概念。

例子:

下面是一个Maven 测试项目的步骤定义文件的实例。该项目是为测试 Web 应用程序 javaTpoint 而创建的。

为了使用钩子,我们在包javatpointTest下创建了名为hookTest.java的步骤定义文件。

package javatpointTest;    

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 hookDemo {   
   WebDriver driver = null;    

   @Before public void setUp(){    
      driver = new FirefoxDriver();    
   }    

   @Given("^User navigates to javatpoint$")    
   public void goToFacebook() {    
      driver.navigate().to("https://www.javatpoint.com/");   
   }    

  @When("^ user enter Username as \"([^\"]*)\" and Password as \"([^\"]*)\"$" ")    
   public void User_enter_Username_and_Password(String arg1, String arg2) {   
      driver.findElement(By.id("emailAddress")).sendKeys(arg1);   
      driver.findElement(By.id("password")).sendKeys(arg2);   
      driver.findElement(By.id("u_0_v")).click();    
   }    

   @Then("^login should be unsuccessful$")    
   public void validateRelogin() {    
      if(driver.getCurrentUrl().equalsIgnoreCase(   
         "https://www.javatpoint.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();    
   }    
}

当我们执行这段代码时,执行顺序如下:

  • 一开始,@Before注解将设置 web 驱动程序和其他必需的先决条件来执行测试。
  • 在设置了 web 驱动程序和其他先决条件后,将执行Given语句。
  • 执行Given语句后,将执行When语句。
  • 执行When语句后,将执行Then语句。
  • 现在最后,@ Afterhook将关闭Web 驱动程序并执行清理过程。

既然我们知道,要执行步骤定义文件,我们应该有一个完整的Maven 测试项目,所以首先在 eclipse 中创建它。

Tagged Hooks

钩子也可以与标签一起使用。我们可以在特定测试中使用@before@after钩子。

例子:

@Before ('@RegressionTest)  

@After ('@RegressionTest)

我们也可以使用带有逻辑和/或运算符的钩子的相同概念。

例子:

@Before ('@RegressionTest, @SmokeTest)  

@ After ('@RegressionTest, @SmokeTest)