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

如何编写或优化含重复步骤的Gherkin自动化测试场景?

针对重复步骤的Gherkin+Python自动化测试优化方案

一、Gherkin层面:用Scenario Outline消除重复场景

你的核心需求是测试CDIF滑块的「关闭/开启」两种状态,且每个状态都需要重复执行「打开设置窗口→切换滑块→关闭窗口」的流程。用Scenario Outline可以完美解决这个问题,既保留Given-When-Then的结构化,又避免编写重复的Scenario。

优化后的Feature文件示例

Feature: CDIF滑块状态切换验证
  Background:
    Given 已打开浏览器并进入目标事件页面

  Scenario Outline: 切换CDIF滑块至<目标状态>并验证生效
    When 打开全局可见性设置窗口
    And 将CDIF滑块切换为<目标状态>
    And 关闭全局可见性设置窗口
    Then 验证CDIF滑块状态为<目标状态>

    Examples:
      | 目标状态 |
      | 关闭     |
      | 开启     |

这种写法的优势:

  • Background只做一次前置操作(打开浏览器+选事件),避免重复执行
  • Scenario Outline通过<变量>抽象重复步骤,Examples枚举所有需要测试的状态
  • 每个例子都会完整执行「打开→切换→关闭→验证」的流程,符合测试逻辑

二、Python步骤实现:封装工具函数减少重复代码

在Python的Behave步骤定义中,把「打开设置窗口」「关闭设置窗口」「切换滑块」这些重复操作封装成独立工具函数,既简化步骤代码,也方便后续维护。

优化后的Python步骤示例

from behave import given, when, then
from selenium.webdriver.common.by import By

# 封装重复操作的工具函数
def open_visibility_settings(driver):
    driver.find_element(By.ID, "settings-menu-btn").click()
    driver.find_element(By.LINK_TEXT, "全局可见性").click()

def close_visibility_settings(driver):
    driver.find_element(By.CSS_SELECTOR, ".settings-modal .close-btn").click()

def set_cdif_slider_state(driver, target_state):
    slider = driver.find_element(By.ID, "cdif-toggle-slider")
    current_is_enabled = slider.get_attribute("aria-checked") == "true"
    target_is_enabled = (target_state == "开启")
    
    # 状态不一致时才执行切换
    if current_is_enabled != target_is_enabled:
        slider.click()

# Behave步骤绑定
@given("已打开浏览器并进入目标事件页面")
def step_impl(context):
    context.driver.get("https://your-test-domain.com/target-event")

@when("打开全局可见性设置窗口")
def step_impl(context):
    open_visibility_settings(context.driver)

@when("将CDIF滑块切换为{target_state}")
def step_impl(context, target_state):
    set_cdif_slider_state(context.driver, target_state)

@when("关闭全局可见性设置窗口")
def step_impl(context):
    close_visibility_settings(context.driver)

@then("验证CDIF滑块状态为{target_state}")
def step_impl(context, target_state):
    # 重新打开设置窗口验证状态
    open_visibility_settings(context.driver)
    slider = context.driver.find_element(By.ID, "cdif-toggle-slider")
    expected_state = "true" if target_state == "开启" else "false"
    assert slider.get_attribute("aria-checked") == expected_state, f"滑块状态不符合预期:{target_state}"
    close_visibility_settings(context.driver)

三、特殊场景处理:多次重复切换流程

如果需要测试「关闭→开启→关闭」这类连续重复切换的场景,可以扩展Scenario Outline的Examples,或者直接在Scenario中串联步骤:

连续切换的Scenario示例

Scenario: 连续切换CDIF滑块状态并验证
    Given 已打开浏览器并进入目标事件页面
    When 打开全局可见性设置窗口
    And 将CDIF滑块切换为关闭
    And 关闭全局可见性设置窗口
    Then 验证CDIF滑块状态为关闭
    When 打开全局可见性设置窗口
    And 将CDIF滑块切换为开启
    And 关闭全局可见性设置窗口
    Then 验证CDIF滑块状态为开启
    When 打开全局可见性设置窗口
    And 将CDIF滑块切换为关闭
    And 关闭全局可见性设置窗口
    Then 验证CDIF滑块状态为关闭

如果这类连续操作需要复用,也可以封装成一个复合步骤,比如:

When 执行CDIF滑块状态切换序列: 关闭→开启→关闭
Then 验证最后一次切换后滑块状态为关闭

然后在Python步骤中解析这个序列,循环执行打开-切换-关闭的流程即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:00:22