Cucumber - 标签

当我们在一个功能文件中只有一个、两个或五个场景时,这看起来很简单。然而,在现实生活中,情况并非如此。对于每个正在测试的功能,我们可能在一个功能文件中有 10、20 或更多场景。它们可能代表不同的目的(冒烟测试/回归测试)、不同的前景(开发人员/QA/BA)、不同的状态(准备执行/正在进行中)等。如何管理如此大量的执行?

为此,Cucumber 已经提供了一种通过在功能文件中使用标签来组织场景执行的方法。我们可以用一个有用的标签来定义每个场景。稍后,在运行器文件中,我们可以决定我们希望 Cucumber 执行哪个特定标签(以及场景)。标签以"@"开头。在"@"之后,您可以使用任何相关文本来定义您的标签。让我们通过一个例子来理解这一点。

假设,一个功能文件中有两个或更多场景。我们只想执行一个场景作为烟雾测试的一部分。因此,第一件事是识别该场景,第二件事是在场景开头用"@SmokeTest"文本标记它。让我们深入了解一下 −

步骤 1 − 创建一个名为 cucumberTag 的 Maven 项目。

步骤 2 − 在 src/test/java 下创建一个名为 cucumberTag 的包

步骤 3 − 创建一个名为 cucumberTag.feature 的功能文件。

在文件中写入以下文本并保存。此功能文件包含两个场景,其中只有一个被标记为 SmokeTest 标签。

功能 − Cucumber 标签

场景概述 − 社交网站的登录功能。

给定用户导航到 Facebook

当我输入用户名作为"<username>"并将密码输入为"<password>"时

然后登录应该会失败

示例

| username  | password  | 
| username1 | password1 | 
| username2 | password2 |

#following 场景已被标记为 SmokeTest,应该执行。@SmokeTest

场景:

给定用户导航到 Facebook

当我输入用户名"<>"和密码"<>"时

然后用户应该被重定向到登录重试

步骤 4 −创建步骤定义文件。

  • 选择并右键单击包轮廓。

  • 单击"新建"文件。

  • 为文件命名,例如 cucumberTag.java

  • 在文件中写入以下文本并保存。

package cucumberTag;
 
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 cucumberTag { 
   WebDriver driver = null; 
	
   @Given("^user navigates to facebook$") 
   public void goToFacebook() { 
      driver = new FirefoxDriver(); 
      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(); 
   } 
	
   @Then("^User should be redirected to login retry$") 
   public void loginRetry() { 
      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(); 
   } 
}

步骤 5 − 创建一个运行器类文件。

  • 在包内创建一个名为 runTest.java 的运行器类。

  • 编写以下代码。

  • 保存文件。

package cucumberTag;
 
import org.junit.runner.RunWith; 
import cucumber.junit.Cucumber; 

@RunWith(Cucumber.class) 
@Cucumber.Options(format = {"pretty", "html:target/cucumber"}) 

public class runTest { }
  • 运行测试选项。

  • 右键单击并选择选项"以...身份运行"

  • 选择 JUnit 测试。

运行此类文件时,您将观察到以下情况。

  • Facebook 在新的 Firefox 网络浏览器实例中打开。

  • 用户名和密码字段将不提供任何值。

  • 将单击登录。

  • 将加载登录重试页面。

在功能文件中定义标签没有限制。根据您的需要,您可以派生要使用的标签和要执行的场景。

标签主要有两种类型 −

  • 默认标签 − 默认标签具有其预定义的含义。示例 @Dev,@Ignore

  • 自定义标签 − 自定义标签为您提供了充分的灵活性,可以选择合适的文本来定义您的标签。

标签也可以在功能级别定义。一旦您在功能级别定义了标签,就可以确保该功能文件中的所有场景都继承该标签。根据场景的性质,我们可以为单个功能使用多个标签。每当 Cucumber 找到合适的调用时,就会执行特定的场景。

Cucumber 还提供了一种反转标签选择的方法。考虑在 25 个定义的场景中,有 10 个被标记为冒烟测试。我们只需要执行回归测试场景。

为此,我们可以在 JUnit 运行器类中使用"~"来排除冒烟测试场景。它看起来如下所示。

@RunWith(Cucumber.class)
@Cucumber.Options(format = {"pretty", "html:target/cucumber"}, tags = {"~@SmokeTest"})

public class runTest { }

在定义多个标签时,我们还可以定义逻辑或/和逻辑与运算。

  • 在运行器类中定义逻辑或 − @dev,@wip − 它表示需要执行与此标签中的任何一个匹配的场景。

  • 在运行器类中定义逻辑或 − [@dev,~@wip] − 它表示需要执行与这两个标签匹配的场景。