Pytest-Bdd-Playwright 系列教程(10):配置功能文件路径 & 优化场景定义
- 前言
- 一、功能文件路径的配置
-
- [1.1 全局设置功能文件路径](#1.1 全局设置功能文件路径)
- [1.2. 在场景中覆盖路径](#1.2. 在场景中覆盖路径)
- 二、避免重复输入功能文件名
-
- [2.1 使用方法](#2.1 使用方法)
- [2.2 `functools.partial` 的背景](#2.2
functools.partial
的背景)
- 三、应用场景总结
前言
- 在实际应用的过程中,我们经常需要根据不同的测试需求来调整功能文件(.feature文件)的路径,以及优化测试场景的定义以减少重复代码;
- 本文将详细介绍如何配置功能文件路径以及如何使用 functools.partial 方法来优化场景定义,帮助大家更高效地管理和执行 BDD 测试。
一、功能文件路径的配置
默认情况下,pytest-bdd
会将当前模块路径作为功能文件(feature file)的查找路径。但我们可以通过以下方式调整此行为:
1.1 全局设置功能文件路径
在 pytest
的配置文件中(如 pytest.ini
、tox.ini
或 setup.cfg
),使用 bdd_features_base_dir
键指定一个新的路径。例如:
ini
# pytest.ini
[pytest]
bdd_features_base_dir = features/
这意味着,除非在单个场景中另有指定,否则所有的 BDD 特征文件(.feature 文件)都将从这个指定的路径下查找。在这个例子中,全局路径被设置为项目根目录下的features/路径。
1.2. 在场景中覆盖路径
我们可以通过 @scenario
装饰器的 features_base_dir
参数为单个场景设置不同的路径。例如:
python
from pytest_bdd import scenario
@scenario("foo.feature", "Foo 功能")
def test_foo():
pass
@scenario(
"demo.feature",
"Demo 功能",
features_base_dir="./test/features/",
)
def test_foo_local():
pass
这种方式允许在特定测试中灵活调整功能文件的路径。
第一个场景没有指定 features_base_dir 参数,因此它将使用全局设置的路径 features/;
第二个场景通过 @scenario 装饰器的 features_base_dir 参数指定了一个特定场景覆盖的路径:./test/features/,此时不会使用全局设置的路径。
二、避免重复输入功能文件名
当一个测试文件中包含多个场景时,重复输入相同的功能文件路径可能显得冗余且容易出错。为了解决这个问题,可以借助 Python 的 functools.partial
方法。
2.1 使用方法
在test_search.py
文件,通过 functools.partial
创建一个带有预设路径的 scenario
函数。例如:
python
import pytest
from steps.search_steps import *
from pytest_bdd import scenario
from functools import partial
scene = partial(scenario, 'search.feature')
@pytest.mark.smoke
@scene('成功搜索')
def test_successful_search():
pass
@pytest.mark.low
@scenario('search.feature', '失败搜索')
def test_failed_search():
pass
上述代码的优势在于只需指定一次功能文件路径 /features/search.feature
,即可简化后续的场景定义。
2.2 functools.partial
的背景
functools.partial
是 Python 标准库中的一个工具,允许创建一个新函数,该函数会固定原始函数的部分参数值。有关更多信息,请参考 Python 官方文档。
三、应用场景总结
- 全局配置路径:适用于大部分功能文件都在同一目录下的项目。
- 按场景配置路径:适合少量场景需要自定义路径的情况。
- 使用
partial
优化:非常适合多个场景都依赖同一个功能文件的情况。