BDD实践中需严格区分“写什么”(业务行为)和“做什么”(代码实现),feature文件只描述用户意图,如Given I am on the login page;步骤定义须精准映射、参数解析严谨;资源统一由conftest.py fixture管理;必须配置bdd_features_base_dir指定feature路径。

能直接用,但必须分清“写什么”和“做什么”两层逻辑,否则很快陷入步骤绑定混乱。
feature 文件里只写业务行为,不写代码细节
很多人一上来就在 login.feature 里写 Given I click the #login-btn,这是错的。Gherkin 的本质是描述“用户想干什么”,不是“你代码怎么点”。它要让产品经理也能看懂、能改、能确认。
- ✅ 正确写法:
Given I am on the login page、When I enter valid credentials、Then I should see the dashboard - ❌ 错误写法:
Given I find element by id "login-btn"、When I call driver.find_element(...).click() - feature 文件里不能出现任何 Python、Selenium 或 RPA 相关术语,否则就失去了 BDD 的协作价值
- 一个
Scenario应该对应一个完整业务闭环(比如一次登录成功),而不是一个 UI 操作动作
步骤定义(step definitions)必须一一映射,且参数解析要严谨
pytest-bdd 不会自动把 Given I enter "admin" and "123456" 拆成两个变量——你得自己用 parsers.parse 或正则明确告诉它怎么提取。
- 用
@given(parsers.parse('I enter "{username}" and "{password}"'))才能拿到username和password参数 - 如果写成
@given('I enter {username} and {password}')(没加parsers.parse),pytest-bdd 会报StepDefinitionNotFoundError - 同一个 step 文本只能绑定一个函数;若多个场景共用“点击登录按钮”,必须复用同一个
@when函数,不能各自定义 - 步骤函数里不要做断言——
Then步骤才负责验证,Given和When只负责状态准备和动作执行
conftest.py 是 fixture 和全局配置的唯一入口,别在 test_*.py 里重复初始化
浏览器驱动、API 客户端、测试数据清理这些资源,必须统一由 conftest.py 提供,否则每个 @scenario 都会独立启动新会话,既慢又难调试。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
立即学习“Python免费学习笔记(深入)”;
- 在
conftest.py中定义@pytest.fixture(scope='function')级别的browser或api_client - 所有步骤函数通过参数名(如
browser)自动注入,不需要手动 import 或实例化 - 别在
test_login.py里写driver = webdriver.Chrome()——这会导致 pytest-bdd 无法管理生命周期,也破坏了 fixture 复用性 - 如果用了 Playwright 或 RPA-Python,它们的上下文(如
page、desktop)也要走同一套 fixture 注入机制
运行时必须指定 feature 路径,否则 pytest-bdd 找不到场景
pytest 默认只扫描 test_*.py,不会自动发现 features/ 目录下的 .feature 文件。不配路径,@scenario 就像指向不存在的文件,直接报 FeatureNotFound。
- 在项目根目录加
pytest.ini,写明:[tool:pytest] bdd_features_base_dir = features
- 或者命令行运行时显式指定:
pytest --bdd-feature-base-dir=features - 路径必须是相对于当前工作目录的相对路径,不能用绝对路径或
../features - 如果 feature 文件放在
tests/features/下,那配置就得是bdd_features_base_dir = tests/features
最常被忽略的是步骤文本与函数签名的严格一致性——多一个空格、少一个引号、参数名拼错,都会导致绑定失败,而错误信息往往只提示 “step not found”,不告诉你具体哪一行不匹配。


















