pytest是一个单元测试框架,在python中比较主流,另一个比较主流的就是unittest。
可以来干嘛呢?可以做自动化,接口也行,UI也可以,可以配合其它的测试工具(或模块)丰富自身,比如测试报告、断言和参数化;可以做别的(目前我没有接触,手动捂脸)。
unittest这个是官方库,python自带的框架;而pytest是在unittest基础上进一步封装的,可以兼容unittest脚本。
pytest的有点有什么呢?
1.资料丰富、入门简单、容易上手;
2.支持简单的单元测试和复杂的功能测试;
3.支持参数化;
4.执行过程用例可跳过,可标记预期失败;
5.支持失败case重复执行;
6.兼容unittest编写的case;
7.可使用html测试报告;
8.可与jenkins集成;
9.第三方插件丰富,支持自定义扩展。
怎么安装呢?
cmd中操作:
pip install pytest pip install pytest --default-timeout=6000 -i https://pypi.tuna.tsinghua.edu.cn/simple # 如果超时可以更换清华源
安装完成后查看pytest版本:
pytest --version
pytest编写用例的时候需要按照规范来编写,否则用例将不能被pyterst识别并执行:
- 文件名要以test_*.py或*_test.py命名
- 函数以test_开头
- 类以Test开头,且不能包含__init__方法
- 方法(类里的)以test_开头
- 所有的包必须有__init__.py文件
这里我用的pycharm进行测试的,所以要在pycharm中设置一下执行框架,方便操作。
用例的执行规则(cmd中执行pytest命令)
可以使用命令行参数执行 pytest -h 或者 pytest -help查看 pytest 帮助文档
下面说一下常用的参数
- 某个目录下的所有用例
- pytest
- 执行当前文件夹下的所有文件
- pytest 文件名/
- 执行具体的某一个测试文件
- pytest 脚本.py
- 匹配用例名称
- pytest -k "case" test_one.py # 执行用例名称包含case的所有用例
- pytest -s -k "not case" test_one.py # 执行用例名称不包含case的用例
- pytest -s -k "unionPay or weChat" test_one.py # 执行用例名称包含unionPay或者weChat的用例
- 按节点运行
- pytest test_moudle.py::test_func 执行某个模块下的某个方法
- pytest test_module.py::TestClass::test_func 执行某个模块下某个类下的某个方法
- 遇到错误是停止测试 -x
- pytest strart.py -x
- 当用例错误个数达到指定数量时停止测试 --maxfail=num
- pytest start.py --maxfail=6
- 详细打印用例的执行结果 -s, -v更详细
- pytest -s start.py
- 简单打印用例执行结果
- pytest -q start.py
常用的断言
pytest使用python自带的assert关键字进行断言: assert A==B 如果A==B为True,断言通过,A==B为False,单元失败,用例执行失败。
先看一个断言成功的例子:
class TestClass(object): # def __init__(self): # print('初始化函数') def test_func1(self): print('测试用例1==========') result = 10 assert result == 10
执行结果如下:
在看一下断言失败的情况:
执行结果如下:
总结一下pytest断言常用的几种情况:
- assert A: 判断 A 是否为真
- assert not A: 判断 A 是否为假
- assert A in B: 判断B是否包含A
- assert A==B: 判断A是否等于B
- assert A!=B: 判断A是否不等于B
结合上面的断言,用例执行完成后可以有一下几种状态:
- passed:执行通过
- failed:执行失败,也就是断言失败
- error:代码问题导致执行错误
- xfail:预期失败,结合@pytest.mark.xfail()使用