单元测试框架-pytest
官网
常用插件
- pytest-html: 生成html报告
- pytest-xdist: 实现并发测试
- pytest-ordering: 实现测试用例顺序设置
- pytest-rerunfailures: 测试用例失败重试
- allure-pytest: 生成测试报告
引入依赖
在项目根目录下创建:requirements.txt
pytest
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures
allure-pytest
执行命令
pip install -r requirements.txt
验证安装成功
pytest --version
使用Pytest
规范
- 模块名必须以
test_
开头或者_test
结尾- 测试类必须以Test开头,并且不能有
__init__
方法- 测试方法必须以test开头
运行方式
主函数模式
pytest.main()
命令行模式
pytest
通过读取pytest.ini配置文件运行
- 一般放在项目根目录
- 编码:必须时ANSI,可以使用notepad++修改编码格式
- 作用:改变pytest默认行为
- 运行规则:主函数与命令行模式都会读取该文件
[pytest] #命令行参数,用空格分隔 addopts = -vs # 测试用例文件夹,可以自己配置 testpaths = ./testcase # 配置测试搜索的模块文件名称 python_files = test*.py # 配置测试搜索的测试类名 python_classes = Test* # 配置测试搜索的测试函数名 python_functions = test #测试分组 markers =g11n:国际化测试组i10n:本地化测试组
执行指定模块
pytest.main(['test_module.py'])
指定目录
pytest.main(['dir_name'])
通过nodeid指定测试用例运行:nodeid由模块名,分隔符,类名,方法名,函数名组成
pytest.main('./dir_name/module.py::class_name::fun_name')
参数详情
-
-s:显示测试用例的调试内容
-
-v:显示测试用例详细信息
-
-n:多线程执行测试用例
-
–reruns:设置重试次数
-
-x:只要有一个测试用例失败,停止测试
-
–maxfail:设置几个测试失败停止运行
-
-k:根据测试用例的部分字符串指定测试用例
-
-m:指定测试分组
执行顺序
-
unittest:按ascii的大小来运行
-
pytest:默认从上到下
指定测试用例顺序:需要安装pytest-ordering
@pytest.mark.run(order=)
分组测试
@pytest.mark.mark_name
- mark_name:为自定义的分组名称
运行测试
pytest -m "mark_name"
运行多个分组
pytest -m "mark1 or mark2"
跳过测试
-
无条件
@pytest.mark.skip(reason="原因")
-
条件跳过
@pytest.mark.skipif(expr, reason="原因")
生成报告
-
HTML
pytest --html ./save_path/report.html
-
Allure
下载
- 解压项目并配置到环境变量中,验证是否安装成功
allure --version
- 生成json格式临时报告
--alluredir ./temp
- 生成allure报告
allure generate ./temp -o ./report --clean
-o: 报告输出目录
–clean:对目录进行清除
测试夹具(前后置)
- setup_class:所有测试用例执行之前运行一次
- teardown_class:所有测试用例执行之后运行一次
- setup_method:每个测试用例执行之前运行一次
- teardown_method:每个测试用例执行完成执行一次
部分测试用例前后置实现:@pytest.fixture()
参数
- scope:作用域
- function 方法级别的前后置 (默认)
- class 类级别的前后置
- module 模块级别的前后置
- package/session 包级别的前后置
- params: 参数化
- 支持参数类型:(列表:[] 元组() 字典列表[{},{},{}],字典元组:({},{},{}))
- autouse: 自动执行 默认值:False 如果为False,需要将函数名作为需要调用的方法的参数
- ids: 当使用params参数化时,给参数列表每一个值设置一个变量名
- name: 表示的时被@pytest.fixture标记的方法取一个别名
# yield返回后面可以有代码,return后面不能有代码,返回值即为测试方法的所传入的参数
# 参数名必须为request,否则报错[not found]
# 使用name对标记的方法起别名后不能使用原函数名作为参数,否则报错
@pytest.fixture(scope='function', params=['赵姗姗', '马化腾', '张一鸣'], ids=['zss', 'mht', 'zym'], name='fixt')
def my_fixture2(request):print("前置")yield request.paramprint("后置")
conftest.py与fixture结合使用
- 通常在每个测试包下可以包含一个conftest.py文件,通常将前后置fixture定义在该文件中,在其他模块中无需导入即可使用
- 夹具可以使用当前包及其父包的conftest.py中所定义的,同级包无法使用
断言
assert
数据驱动
@pytest.mark.parametrize('args', ['zss', 'nan', 'lis'])def test_ddt(self, args):print(args)@pytest.mark.parametrize('name,age', [('张三', 21), ('李四', 22), ('王五', 23)])def test_ddt2(self, name, age):print(name)print(age)
- 参数1:迭代的变量名
- 参数2:迭代的value