如何编写或优化含重复步骤的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
相关产品推荐
相关产品推荐

