标签表达式

在 Cucumber 中,标签(tags)用于对测试场景进行分类和管理,允许用户灵活地选择和执行特定的测试集。标签表达式提供了一种强大的工具,可以基于标签来选择特定的场景子集。

可视模式下编辑时,可以双击某个元素的开始部分添加标签。如果你输入的标签没有 @,编辑器会在你输入完成后自动为你添加它。

什么是标签表达式?

标签表达式是一个内嵌的布尔表达式,用于选择符合特定标签条件的场景。你可以通过标签表达式选择需要执行的场景或绑定特定的 hooks。以下是一些常见的应用场景:

标签表达式示例

以下是一些标签表达式及其解释:

表达式 描述
@fast 选择标记为 @fast 的场景
@wip and not @slow 选择标记为 @wip 但没有标记 @slow 的场景
@smoke and @fast 选择同时标记为 @smoke@fast 的场景
@gui or @database 选择标记为 @gui@database 的场景

如果需要定义更复杂的标签筛选条件,可以使用括号来提高表达式的可读性或调整运算符的优先级。例如:

(@smoke or @ui) and (not @slow)

该表达式的意思是:选择带有 @smoke@ui 标签的场景,但这些场景不应该带有 @slow 标签。

执行时过滤

1. 选择性执行测试

标签可以用于选择性地执行某些测试场景。通过在命令行中指定标签,可以只运行被该标签标记的测试。

示例:

# language: zh-CN
功能: 用户登录
  描述: 验证用户能够成功登录

  @smoke
  场景: 成功登录
    假如 用户在登录页面
    当 用户输入有效的用户名和密码
    并且 点击登录按钮
    那么 用户应看到欢迎信息

  @regression
  场景: 登录失败
    假如 用户在登录页面
    当 用户输入无效的用户名和密码
    并且 点击登录按钮
    那么 用户应看到错误信息

在命令行中运行带有@smoke标签的场景:

cuke run --tags @smoke

2. 排除某些测试

可以使用标签来排除不需要运行的测试场景。在命令行中使用not来表示排除某标签。

示例:

cuke run --tags "not @regression"

3. 组合多个标签

可以使用多个标签来组合运行特定的测试场景。标签之间可以使用逻辑andor操作符。

示例: 运行同时带有@smoke@important标签的场景:

cuke run --tags "@smoke and @important"

运行带有@smoke@regression标签的场景:

cuke run --tags "@smoke or @regression"

4. 环境特定的测试

可以使用标签来区分不同的测试环境,例如开发环境、测试环境、生产环境等。

示例:

# language: zh-CN
功能: 数据库操作
  描述: 验证不同环境下的数据库操作

  @dev
  场景: 开发环境的数据库连接
    假如 用户在开发环境
    当 用户尝试连接数据库
    那么 数据库连接应成功

  @prod
  场景: 生产环境的数据库连接
    假如 用户在生产环境
    当 用户尝试连接数据库
    那么 数据库连接应成功

运行开发环境的测试:

cuke run --tags @dev

5. 持续集成和交付

在持续集成和持续交付过程中,可以使用标签来控制哪些测试在每次构建时运行,哪些测试只在特定构建时运行。

示例: 在CI中,只运行冒烟测试(smoke test):

cuke run --tags @smoke

6. 临时禁用某些测试

在开发过程中,如果某些测试场景临时不可用,可以使用特定的标签将它们排除在外,而不需要删除或修改代码。

示例:

# language: zh-CN
功能: 订单管理
  描述: 验证订单的创建、更新和删除

  @disabled
  场景: 创建订单
    假如 用户在订单创建页面
    当 用户输入订单信息
    并且 点击保存按钮
    那么 订单应成功创建

排除带有@disabled标签的场景:

cuke run --tags "not @disabled"

在Hooks中使用

在Cucumber中,hooks(钩子)用于在场景执行前后运行特定的代码。使用标签可以控制哪些hooks应用于哪些场景,从而实现更精细的控制。

1. 在特定标签的场景之前运行代码

可以使用标签来指定某个hook只在具有特定标签的场景之前运行。

示例:

JavaScript
Before({tags: "@foo and @bar"}, function () {
  // 这个hook将在使用@foo和@bar标记的场景之前执行
});

2. 在特定标签的场景之后运行代码

同样,可以指定某个hook只在具有特定标签的场景之后运行。

示例:

JavaScript
After({tags: "@smoke"}, function () {
  // 这个hook将在使用@smoke标记的场景之后执行
});

3. 设置特定环境的前后置条件

可以使用标签在不同的环境中执行不同的前置和后置代码。例如,在开发环境和生产环境中执行不同的初始化和清理操作。

示例:

JavaScript
Before({tags: "@dev"}, function () {
  // 在开发环境中执行的前置操作
});

After({tags: "@prod"}, function () {
  // 在生产环境中执行的后置操作
});

4. 测试数据准备

在某些场景中,可能需要在场景执行之前准备特定的数据,可以使用标签来控制这些数据准备步骤。

示例:

JavaScript
Before({tags: "@database"}, function () {
  // 在带有@database标签的场景之前准备数据库数据
});

5. 清理操作

在场景执行之后,可以使用标签来控制清理操作,确保每个场景的环境是独立和干净的。

示例:

JavaScript
After({tags: "@cleanup"}, function () {
  // 在带有@cleanup标签的场景之后执行清理操作
});

通过合理使用hooks中的标签,可以实现对测试场景的精细控制,提高测试的可维护性和灵活性。

总结

通过灵活使用标签和标签表达式,结合hooks中的标签控制,可以更有效地管理和执行自动化测试,提高测试的效率和覆盖率。这些功能使得测试过程更加灵活、可控,适应不同的测试需求和环境。

results matching ""

    No results matching ""