Cucumber 是什么?
Cucumber是一种支持行为驱动开发(BDD)的工具
Cucumber读取以纯文本编写的可执行规范,并验证软件是否按照这些规范所说的执行。规范由多个示例或场景组成。例如:
Feature: 用户登录功能
作为用户,我希望能够登录到系统中
Scenario: 成功登录
Given 用户已打开登录页面
When 用户输入正确的用户名和密码
Then 用户应成功登录到系统,并看到欢迎信息
每个场景都是Cucumber要完成的步骤列表。Cucumber验证软件是否符合规范,并生成一个报告,指示:
- ✅ 成功
- ❌ 每个场景的失败。
为了让Cucumber理解场景,它们必须遵循一些基本的语法规则,也就是Gherkin。
Gherkin 是什么
Gherkin 是一套语法规则,它使普通文本具有足够的结构,让Cucumber能够理解。
Gherkin 的作用:
- 明确的可执行规范
- 使用Cucumber进行自动化测试
- 记录系统的实际行为
Gherkin 文档存储在.feature文本文件中,通常与软件一起在源代码管理中进行版本控制。
什么是步骤定义(步骤函数)
步骤定义将Gherkin步骤与编程代码连接起来。步骤定义执行该步骤应执行的操作。因此,步骤定义将规范硬连接到实现。
在BDD(行为驱动开发)中,Step Definitions扮演着关键的角色。它们是将用自然语言编写的Gherkin格式的测试场景(如Feature、Scenario等)与实际的测试代码连接起来的桥梁。具体来说,Step Definitions的作用体现在以下几个方面:
-
翻译自然语言为代码:Step Definitions将Gherkin语言中描述的用户故事或场景步骤转换为可执行的测试代码。这样,BDD工具(如Cucumber)就能理解并执行测试场景中的每一个步骤。
-
提供测试逻辑:Step Definitions不仅翻译步骤,还包含了执行这些步骤所需的测试逻辑。这意味着它们包含了验证系统行为是否符合预期的实际代码。
-
增强可读性和可维护性:通过将测试逻辑封装在Step Definitions中,测试场景可以保持简洁和易于理解。这有助于提高测试代码的可读性,同时也使得维护变得更加容易。
-
促进跨团队协作:BDD鼓励跨团队协作,包括开发人员、测试人员、产品经理和业务分析师等。Step Definitions使得非技术人员(如产品经理或业务分析师)能够理解和参与测试过程,因为他们可以通过Gherkin语言描述测试场景,而不需要编写实际的测试代码。
-
提高代码复用性:在编写Step Definitions时,可以定义通用的步骤方法,这些方法可以在多个测试场景之间共享和复用。这有助于减少重复代码,提高测试代码的效率。
以Java语言对上面的登录的规格编写步骤函数,示例代码如下:
import io.cucumber.java.en.Given;
import io.cucumber.java.en.When;
import io.cucumber.java.en.Then;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.*;
public class UserLoginStepDefinitions {
private LoginPage loginPage;
private User user;
private SystemSystem system;
// 假设你有LoginPage和SystemSystem这样的类来模拟登录页面和系统行为
public UserLoginStepDefinitions(LoginPage loginPage, SystemSystem system) {
this.loginPage = loginPage;
this.system = system;
}
@Given("^用户已打开登录页面$")
public void 用户已打开登录页面() {
// 这里可以初始化登录页面,或者模拟用户打开登录页面的行为
// 例如,你可以创建一个登录页面的实例或者调用一个模拟方法
}
@When("^用户输入正确的用户名和密码$")
public void 用户输入正确的用户名和密码() {
// 这里应该包含用户输入用户名和密码的逻辑
// 假设user对象包含了正确的用户名和密码
user = new User("correctUsername", "correctPassword");
loginPage.login(user);
}
@Then("^用户应成功登录到系统,并看到欢迎信息$")
public void 用户应成功登录到系统并看到欢迎信息() {
// 这里验证用户是否成功登录,并看到欢迎信息
// 你可能需要调用system的某个方法来检查登录状态,或者验证登录页面的状态
assertTrue(system.isUserLoggedIn(user));
// 假设登录成功后,登录页面会显示欢迎信息
assertTrue(loginPage.containsWelcomeMessage());
}
}
术语
- Cucumber ,黄瓜,BDD测试的工具, 不同的语言对应不同的库。
- Gherkin 小黄瓜,小黄瓜语法