You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cucumber场景大纲执行多增待办项及断言错误,是否可改用普通Scenario?

问题根因

你遇到的报错、执行后出现多余新增项的问题,核心是Scenario Outline的使用逻辑错误:

  • Scenario Outline会遍历Examples的每一行,完整执行一次整个场景流程,并非将Examples中同过滤条件的待办项合并为列表传入用例
  • 你的场景中固定写死了I filter the list to show Completed tasks步骤,但Examples里还包含了Active类型的测试数据,运行时逻辑和数据完全不匹配
  • 添加完3个待办后的第一个断言步骤,仅校验单个<Item Displayed>,意味着前两次运行时,加完3个待办后分别只断言存在#1、#2,本身逻辑就不符合预期

解决方案

方案1:使用普通Scenario(完全满足需求,最直观)

你的测试场景并不复杂,完全不需要强行使用Scenario Outline,直接拆分两个普通Scenario即可,逻辑清晰无冗余:

Feature: 筛选待办事项

  As a working adult with busy schedules
  I want to use todo app to filter todo item
  so that I can check todo item by status

  Scenario: 筛选已完成待办
    Given 我的待办列表为空
    When 我添加"First todo item #1"
    And 我添加"next todo item #2"
    And 我添加"next todo item #3"
    Then 我的待办列表应包含以下内容:
      | First todo item #1 |
      | next todo item #2  |
      | next todo item #3  |
    When 我将"First todo item #1"标记为已完成
    Then 待办项"First todo item #1"应被标记为已完成
    And 我筛选列表显示已完成任务
    Then 我的待办列表应包含以下内容:
      | First todo item #1 |

  Scenario: 筛选未完成待办
    Given 我的待办列表为空
    When 我添加"First todo item #1"
    And 我添加"next todo item #2"
    And 我添加"next todo item #3"
    Then 我的待办列表应包含以下内容:
      | First todo item #1 |
      | next todo item #2  |
      | next todo item #3  |
    When 我将"First todo item #1"标记为已完成
    And 我筛选列表显示未完成任务
    Then 我的待办列表应包含以下内容:
      | next todo item #2  |
      | next todo item #3  |

如果要匹配你原有英文步骤,把中文步骤替换回你原来的英文表述即可。

方案2:正确使用Scenario Outline(如需复用流程可选择)

如果你确实要复用添加、标记完成待办的流程,需要把过滤类型也作为参数传入场景,修改后的用例如下:

Feature: filter todo item

  As a working adult with busy schedules
  I want to use todo app to filter todo item
  so that I can check todo item by status

  Scenario Outline: Filter todo item
    Given my todo list is empty
    When I add "First todo item #1"
    And I add "next todo item #2"
    And I add "next todo item #3"
    Then my todo list should has followings:
      | First todo item #1 |
      | next todo item #2  |
      | next todo item #3  |
    When I complete "First todo item #1"
    Then the todo item called "First todo item #1" should be marked as completed
    And I filter the list to show <Filter> tasks
    Then my todo list should has followings:
      | <Item Displayed> |

    Examples:
      | Filter    | Item Displayed     |
      | Completed | First todo item #1 |
      | Active    | next todo item #2  |
      | Active    | next todo item #3  |

注意修改后过滤步骤的过滤类型改为了变量<Filter>,和Examples里的Filter列对应,运行时就不会出现逻辑和数据不匹配的问题。

额外排查点

如果你修改用例结构后还是出现标记完成的断言报错,需要检查两个点:

  • 每次场景运行前是否清空了应用缓存和数据,避免上一次用例的执行结果影响本次运行
  • completeTodo.isCompleted()方法是否正确:是否是从整个待办数据集判断完成状态,而非仅从当前页面显示的待办项判断(如果筛选后页面不展示对应待办,直接查询页面元素会返回false)

内容的提问来源于stack exchange,提问作者user2201789

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:57:01