Cucumber - 功能特性



一个特性(Feature)可以定义为项目的一个独立单元或功能。让我们以社交网站这个非常常见的例子为例。这个产品/项目的特性是什么样的呢?一些基本特性可以确定为:

  • 创建和删除社交网站的用户。

  • 社交网站的用户登录功能。

  • 在社交网站上分享照片或视频。

  • 发送好友请求。

  • 注销。

现在很清楚的是,在谈论 Cucumber 时,被测产品的每个独立功能都可以被称为一个特性。这是一个最佳实践,在你开始测试之后,在推导出测试脚本之前,我们应该确定要测试的特性。

一个特性通常包含该特性要测试的一系列场景。我们存储特性、特性描述和要测试的场景的文件被称为特性文件(Feature File)。我们将在下一章中详细了解特性文件。

在 Gherkin 中表示被测特性的关键字是“Feature”。建议的最佳实践是在特性文件中的特性标题下写一个简短的特性描述。这也能满足良好文档的需求。

示例

特性(Feature) - 社交网站的登录功能。

如果用户名和密码正确,用户应该能够登录社交网站。

如果用户名和密码不正确,应该向用户显示错误消息。

如果用户名和密码正确,用户应该被导航到主页。

特性文件

编写 Cucumber 测试的文件被称为特性文件(Feature Files)。建议为每个被测特性创建一个单独的特性文件。特性文件的扩展名需要是“.feature”。

可以根据需要创建任意数量的特性文件。为了组织结构清晰,每个特性应该只有一个特性文件。

例如:

序号 特性 特性文件名
1 用户登录 userLogin.feature
2 分享帖子 sharePost.feature
3 创建账户 createAccount.feature
4 删除账户 deleteAccount.feature

用于特性名称和特性文件名的命名约定取决于个人的选择。Cucumber 对名称没有硬性规定。

一个简单的特性文件包含以下关键字/部分:

  • 特性(Feature) - 被测特性的名称。

  • 描述(Description) (可选) - 描述被测特性。

  • 场景(Scenario) - 测试场景是什么。

  • 已知(Given) - 测试步骤执行之前的先决条件。

  • 当(When) - 为了执行下一步而应该匹配的特定条件。

  • 那么(Then) - 如果 WHEN 中提到的条件满足,应该发生什么。

示例

特性(Feature) - 社交网站上的用户登录。

当用户名和密码正确时,用户应该能够登录社交网站。

当用户名和密码不正确时,应该向用户显示错误消息。

如果用户名和密码正确,用户应该被导航到主页。

大纲(Outline) - 社交网站的登录功能。

给定的用户导航到 Facebook。当我输入用户名为“<username>”和密码为“<password>”时。那么,登录应该失败。

| username  | password  |
| username1 | password1 |

* AND 关键字用于显示两个条件之间的连接。AND 可以与其他关键字一起使用,例如 GIVEN、WHENTHEN

特性文件中没有编写逻辑细节。

步骤定义

我们已经准备好包含已定义测试场景的特性文件。但是,这并不是完成的工作。Cucumber 并不知道要为特性文件中概述的任何特定场景执行哪一部分代码。

这就需要一个中间件——步骤定义文件。步骤定义文件存储特性文件中定义的每个场景步骤与要执行的代码或函数之间的映射。

因此,现在当 Cucumber 执行特性文件中提到的场景步骤时,它会扫描步骤定义文件并确定要调用哪个函数。

步骤定义文件的示例

public void goToFacebook() { 
   driver = new FirefoxDriver(); 
   driver.navigate().to("https://www.facebook.com/"); 
} 
@When "^user logs in using 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(); 
}

因此,对于每个函数,无论你想用每个测试步骤(即 GIVEN/THEN/WHEN)执行什么代码,你都可以在步骤定义文件中编写它。确保为每个步骤定义了代码/函数。

此函数可以是 Java 函数,我们可以在其中使用 Java 和 Selenium 命令来自动化我们的测试步骤。

广告