用途:整理 pytest-qt(PySide6/Qt 控件)与 pytest-bdd(Gherkin 场景)测试中该技术栈特有的易错点,覆盖 GUI 测试与行为规格测试。
pytest-qt 要点:不要用固定时间等待,qtbot.wait(ms) 在 CI 负载下易 flake;应等待信号或条件,例如 with qtbot.waitSignal(widget.completed, timeout=5000): widget.start_operation(),或 qtbot.waitUntil(lambda: widget.isEnabled(), timeout=5000)。禁止直接调用 QCoreApplication.processEvents()。模态对话框(如 QMessageBox.question)必须用 monkeypatch 替换静态方法,否则 headless 下会挂起。Signal/Slot 配线本身是验证对象,不应 mock,应实际 emit 并用 waitSignal 接收。headless 运行:Linux/容器加 QT_QPA_PLATFORM=offscreen,例如 QT_QPA_PLATFORM=offscreen uv run pytest -m gui;Windows 可原生运行。gui 标记表示访问 Qt 但无需显示,gui_show 表示需要真实绘制,后者应从 headless CI 排除。
pytest-bdd 要点:BDD 不限于 E2E,可作为行为规格表达形式用于 Service 层及以上。适合用户功能流、Service 层业务规则(去重、校验等)、缺陷回归(先写复现场景);不适合内部重构、UI 外观调整、Repository 层简单 CRUD。新增步骤:在 tests/bdd/features/ 建 .feature(支持日文 Gherkin),在 tests/bdd/steps/ 建 test_<feature名>.py,用 scenarios() 批量注册,路径基于 file 绝对解析,避免相对路径依赖启动目录。步骤间状态用 target_fixture 传递,避免模块全局变量污染。复用 conftest.py 中已有 fixture。步骤实现保持薄,只调用 Service/Repository。参数解析用 parsers.parse(如 {name:d}),必要时 parsers.re 或 parsers.cfparse。bdd 标记由 tests/bdd/conftest.py 的 pytest_collection_modifyitems 自动添加,不要手写。数据驱动用 Scenario Outline + Examples,表用 datatable 接收。检测未实现步骤:uv run pytest --generate-missing --feature tests/bdd/features tests/bdd/steps/。
限制:资料未提供具体版本要求、安装命令、覆盖率策略与 CI 过滤规则(由 rules/testing.md 负责),也未提供价格或平台信息。