一.pytest简介
1.1 pytest的概念
pytest是一个基于python的测试框架,支持简单的单元测试和复杂的功能测试,因其简单易用的特点广受开发者青睐。pytest可以结合其他如selenium或request实现web自动化和接口自动化,也可以结合allure生成测试报告文档。
1.2 pytest的基础架构
1.pytest的测试发现机制
pytest可以自动识别test_*.py或 *__test.py文件
pytest支持自动收集Test类及test_方法
支持通过(pytest.ini)来自定义发现规则
2.断言重写系统
原生assert自动提供详细失败信息
assert response.status_code == 200 # 失败时会显示实际值
3.插件体系结构
内置插件:tmpdir、capture等
外部插件:pytest-cov、pytest-mock等
自定义插件:通过conftest.py实现
二.pytest的安装
ps:由于pytest是基于python环境的测试框架,所以在开始pytest的学习之前应确保自己的设备已经配置了python环境,且要求python 3.8+,此外还需一个python IDE,本文使用pycharm
1.安装pytest,在命令行输入一下内容
pip install pytest
2.检查是否安装成功,在命令行输入以下内容,安装成功则会输出pytest版本信息
pytest --version
三.创建你的第一个pytest程序
在pycharm创建一个test_first_file.py文件,编写以下代码
def fun(x):return x+1
def test_first():assert fun(4) == 4
运行程序,如果没有问题,你的输出结果应该如下,恭喜你成功编写了你的第一个测试程序!
============================= test session starts =============================
collecting ... collected 1 itemtest_first_file.py::test_first FAILED [100%]
test_first_file.py:2 (test_first)
5 != 4Expected :4
Actual :5
<Click to see difference>def test_first():
> assert fun(4) == 4
E assert 5 == 4
E + where 5 = fun(4)test_first_file.py:4: AssertionError============================== 1 failed in 0.25s ==============================Process finished with exit code 1
四.pytest几种测试用例的运行方式
1.主函数模式
运行所有测试脚本:pytest.main()
指定模块脚本:pytets.main(['-vs','test_login.py'])
指定目录下的脚本:pytest.main(['-vs','./tetscase'])
2.命令行模式
运行所有测试脚本: pytest
运行指定模块:pytest -vs test_login.py
指定目录:pytest -vs ./testcase
参数注释:-s : 表示输出调试信息,包括print打印的信息-v: 显示更详细的信息-vs : 这两个参数可以一起用-n : 支持多线程或者分布式运行测试用例-x : 表示只要一个用例报错,那么测试停止-k : 根据测试用例的部分字符串指定测试用例。--html ./report/report.html : 生成html的测试报告
3.读取pytest.ini文件
五.更加详细的断言
1.python原生的assert
assert formula , "result"
在python的原生assert中,formula可以看作一个表达式,如果该表达式的结果为'true',则执行pass,反之,如果结果为’failure‘,则抛出AssertError,并打印错误信息’result‘。
2.pytest的断言
在软件测试工作中,经常会遇到断言失败的情况,如果每次失败都需要测试工程师去排查错误原因,那工作量将是十分巨大的,而pytest中的断言完美解决了这个问题,在pytest中,当断言失败的时候,控制台会打印出详细的错误信息,大大减少了测试工程师的工作量。
就我们的第一个测试程序来说,控制台打印信息详细写出了期望结果与实际结果,并记录了是那一段代码造成的错误。
============================= test session starts =============================
collecting ... collected 1 itemtest_first_file.py::test_first FAILED [100%]
test_first_file.py:2 (test_first)
5 != 4Expected :4
Actual :5
<Click to see difference>def test_first():
> assert fun(4) == 4
E assert 5 == 4
E + where 5 = fun(4)test_first_file.py:4: AssertionError============================== 1 failed in 0.25s ==============================Process finished with exit code 1