Cucumber - 标签

当我们在一个特征文件中只有一个,两个或者五个场景时,它看起来很简单.但是,在现实生活中它不会发生.对于每个要测试的功能,我们可能在单个功能文件中有10个,20个或更多个方案.它们可能代表不同的目的(烟雾测试/回归测试),不同的预期(开发者/QA/BA),不同的状态(准备执行/正在进行的工作),等等.如何管理这样一个群众的执行?

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

假设一个特征文件中有两个或更多场景.我们只想执行一个场景作为冒烟测试的一部分.首先要确定那个场景,其次是在场景开头用"@SmokeTest"文本标记它.让我们仔细看看它 :

第1步 : 创建名为 cucumberTag 的Maven项目.

步骤2 : 在 src/test/java

下创建一个名为 cucumberTag 的包.

步骤3 : 创建名为 cucumberTag.feature 的要素文件.

在文件中写下以下文本并保存.此功能文件包含两个方案,其中只有一个标记为 SmokeTest 标记.

功能 : 黄瓜标签

场景大纲 : 社交网站的登录功能.

给定用户导航到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,@忽略

  • 自定义标记 : 自定义标记为您提供了选择适当文本以定义标记的完全灵活性.

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

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

为此,我们可以在JUnit runner类中使用"〜"来排除冒烟测试场景.它将如下所示.

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

public class runTest { }


在定义多个标签时,我们还可以定义逻辑或/和逻辑和操作.

  • 定义逻辑或运行程序类去; @ dev,@ wip : 它表示需要执行匹配任何此标记的方案.

  • 定义逻辑或运行时类; [@ dev,〜@ wip] :  它表示需要执行匹配这两个标记的方案.