转载自白月黑羽,pytest 框架 - 白月黑羽,仅作学习笔记用途,侵权联系删除
pytest 中灵活选择测试用例的多种方式
在实际自动化测试过程中,我们常常并不需要每次都执行所有测试用例,而是希望根据模块、类、方法、名称关键词或标签 等条件,灵活挑选要运行的部分用例。pytest
在这方面提供了非常丰富的控制手段,以下是常用的几种方式:
1. 按文件或目录指定测试范围
指定某个测试模块(文件)
如果你只希望运行某个特定的测试文件,可以直接通过路径指定:
python -m pytest cases/登录/test_错误登录.py
指定整个目录
执行某个目录下的全部测试用例:
python -m pytest cases
同时指定多个目录
如果测试分布在多个目录中,可以一次性指定多个目标路径:
python -m pytest cases1 cases2/登录
2. 精确到类或方法级别的选择
运行指定类下的所有测试方法:
python -m pytest cases/登录/test_错误登录.py::Test_错误密码
仅运行某个类中的某个测试方法:
python -m pytest cases/登录/test_错误登录.py::Test_错误密码::test_C001001
3. 通过关键词匹配(-k)
pytest
提供了 -k
参数用于模糊匹配用例名、类名、模块名或目录名等,只要包含指定关键词即可被选中。
示例:
python -m pytest -k C001001 -s
上述命令会运行所有名称中包含 C001001
的测试项。
多条件匹配:
-
排除某些用例:
python -m pytest -k "not C001001" -s
-
同时包含多个关键字:
python -m pytest -k "错 and 密码2" -s
-
满足任意关键字:
python -m pytest -k "错 or 密码2" -s
🔍 注意:关键词匹配是区分大小写的,并且不要求完全匹配,只需部分匹配成功即可。
4. 基于标签(mark)运行用例
给测试方法添加标签
使用 @pytest.mark.<标签名>
装饰器可为测试用例打标签,例如:
import pytest
class Test_错误密码2:
@pytest.mark.webtest
def test_C001021(self):
print('\n用例C001021')
assert 1 == 1
运行指定标签的用例:
python -m pytest cases -m webtest -s
给整个类加标签
@pytest.mark.webtest
class Test_错误密码2:
...
使用中文标签也是支持的:
@pytest.mark.网页测试
class Test_错误密码2:
...
运行方式相同:
python -m pytest cases -m 网页测试 -s
给用例添加多个标签:
@pytest.mark.网页测试
@pytest.mark.登录测试
class Test_错误密码2:
...
5. 为模块统一添加标签
你还可以为整个模块统一设置标签,通过定义模块级变量 pytestmark
:
import pytest
pytestmark = pytest.mark.网页测试
支持一次性设置多个标签:
pytestmark = [pytest.mark.网页测试, pytest.mark.登录测试]
6. 配置标签说明,避免警告
自定义标签在运行时,pytest 可能会抛出警告提示标签未注册。为避免此类警告,应在项目根目录创建 pytest.ini
配置文件,并添加以下内容:
[pytest]
markers =
critical: 关键测试
网页测试: 标记为网页端相关测试
登录测试: 标记为登录相关测试
通过这种方式,pytest 会正式识别这些标签,执行时不再提示警告信息。
小结
|---------|-----------------------------------------------|---------------|
| 方式 | 示例命令 | 应用场景 |
| 指定模块 | pytest test_xxx.py
| 只运行一个测试文件 |
| 指定目录 | pytest tests/
| 执行整个目录中的测试 |
| 精确到类或方法 | pytest test_file.py::TestClass::test_method
| 定位执行具体类或函数 |
| 关键字筛选 | pytest -k "关键字"
| 通过模糊匹配名称来选用例 |
| 标签筛选 | pytest -m 标签名
| 按测试类型、模块、功能筛选 |
| 模块统一标签 | pytestmark = [pytest.mark.标签1, ...]
| 整个文件统一打标签 |