Pytest测试框架
测试用例发现规则
- 默认从
当前或者指定文件夹下
递归查找文件名以test_开头
或者_test
结尾的.py文件 - 以
Test
开头且(不继承自unittest.TestCase
或者含有init方法的类)的类 - 函数名以
test_
开头的测试用例方法
自定义测试用例发现规则
我们也可以在pytest.ini
配置文件指定测试发现策略
# 设置递归查找的测试用例文件夹
testpaths = ./testcases
# 改变模块查找规则
python_files = test_*.py
# 改变类的查找规则
python_classes = Test*
# 改变函数的查找规则
python_function = test_*
测试用例执行规则
测试用例的默认执行方式有两种
-
通过pytest.main()方法执行测试用例
if __name__ == "__main__": pytest.main(["testcase/test_api.py::TestApi", "-vs"]) # 将命令以列表的形式传参
-
通过命令行的方式执行测试用例
pytest ./testcase
(直接调用pytest命令执行)python -m pytest
(调用python解释器,以pytest模块化的方式执行测试用例,推荐)
当然,我们可以针对性的使用参数来指定对应的测试用例的执行:
-
-k 匹配函数名执行用例
pytest -k "test_login or test_register" # 选择测试用例名称为test_login or test_register的用例执行
-
-m 指定测试用例标签执行
@pytest.mark.smoke # 将该用例添加到smoke标签内 def test_01(self): pass
pytest -m "smoke" # 执行smoke标签的用例
我们也可以在pytest.ini声明标签的种类
markers = smoke: 冒烟测试用例 user: 用户管理模块用例
pytest.ini配置文件
pytest.ini
文件是 pytest
的配置文件,用于设置全局选项、标记、自定义行为以及插件的配置。它允许你定义某些 pytest
参数的默认值,从而减少在命令行中重复输入参数的需要。pytest.ini
文件通常放在项目的根目录下,pytest 在命令行或是主函数
时都会自动加载并应用其中的配置。
pytest.ini常见配置
[pytest]
# 执行命令默认添加参数
addopts = -vs -m "smoke"
# 指定测试目录
testpaths = /testcase
# 基础路径,测试用例可以直接传入使用
base_url: https://api.weixin.qq.com
# 自定义标记
markers =
slow: 标记慢速测试
smoke: 标记冒烟测试
login: 标记与登录相关的测试
# 配置日志级别
log_cli = true
log_cli_level = INFO
log_file = pytest.log
log_file_level = DEBUG
# 配置最大失败数
maxfail = 2
# 添加 Python import 路径
pythonpath = src
pytest常见插件
pytest
pytest-html pytest html测试报告
pytest-xdist 多线程执行
pytest-ordering 控制用例的执行顺序
pytest-rerunfailures失败用例重跑
pytest-base-url 基础路径
allure-pytest 生成allure测试报告
安装pytest第三方插件,将以下内容写入requirements.txt文件,执行命令pip install -r .\requirements.txt
一键下载
pytest
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures
pytest-base-url
allure-pytest
pytest常见参数
# pytest 常见参数示例
# 1. 控制输出详细程度
pytest -v # 增加输出详细信息
pytest -q # 减少输出详细信息
pytest -s # 禁用捕获标准输出和标准错误输出
# 2. 测试执行控制
pytest -x # 在第一个测试失败后停止
pytest --maxfail=2 # 失败两次后停止
pytest --lf # 只运行上次失败的测试
pytest --ff # 优先运行上次失败的测试
# 3. 选择性测试
pytest -k "expression" # 通过表达式筛选测试用例
pytest -m "marker" # 通过标记筛选测试用例
# 6. 并行执行
pytest -n <num> # 使用多进程并行执行测试
# 8. 日志输出
pytest --log-cli-level=INFO # 设置命令行日志输出级别
pytest --log-file=log.txt # 将日志输出到文件
# 10. 仅收集测试
pytest --collect-only # 仅收集测试用例,不执行
pytest.fixture固件
pytest固件主要作用是在执行测试用例/类/模块/会话前后做一些操作。
在测试用例前后执行操作
def setup(self):
print("测试用例前执行操作")
def teardown(self):
print("测试用例后执行操作")
def setup_class(self):
print("测试类前执行操作")
def teardown_class(self):
print("测试类后执行操作")
在pytest当中引入了一个强大的功能fixture,可以取代setup/teardown方法实现前后置操作,也可以实现传参功能
@pytest.fixture(
scope="function", # 作用域:function/class/module/session
autouse=False, # 是否自动执行:True/False
params=["mysql", "redis"], # 传入参数(每次只传入一个值,有多少个参数执行多少遍case)
ids=["m", "r"], # 传入参数别名(也可以为case取别名)
name="cm", # 夹具别名,当声明之后只能用这个别名
)
fixture实现前后置操作
@pytest.fixture(
scope="function", # 设置执行级别为function
autouse=True, # 每个测试用例前后默认执行
)
def connect_mysql():
logger.info("前置操作")
yield # 测试用例执行
logger.info("后置操作")
fixture实现参数传递
@pytest.fixture(
scope="function",
autouse=False,
params=["mysql", "redis"], # 传入参数(每次只传入一个值,有多少个参数执行多少遍case)
ids=["m", "r"], # 传入参数别名(也可以为case取别名)
name="cm", # 夹具别名,当声明之后只能用这个别名
)
def connect_mysql(request): # 传参需要传递request
logger.info("前置操作")
yield request.param # 传参固定写法
logger.info("后置操作")
def test_01(self,cm): # 传入fixture别名
logger.info(cm) # 接受并打印夹具传来的参数 # mysql、redis
test_01测试用例会根据传入参数的个数去执行,执行的结果如下:
一般而言我们把fixture存放在当前文件夹内的conftest.py文件,表示当前fixture可适用于该文件夹内的全部测试用例。便于代码的管理维护。