pytest框架学习1
1.pytest特点:
- 简单灵活,容易上手,文档丰富
- 支持参数化,可以细粒度地控制要测试的测试用例
- 支持简单的单元测试,复杂的功能测试,还可以做selenium/appnium等自动化测试,接口自动化测试(pytest+requests)
- pytest具有很多第三方库插件,并且可以自定义扩展。比较好用的如pytest-html(完美的html测试报告),pytest-rerunfailures(失败case重复执行),pytest-xdist(多CPU分发)等
- 测试用例的skip和xfail处理
- 很好的和CI工具结合,例如Jenkins
2.pytest用例编写规范:
- 测试文件以test开头(以test结尾也可以)
- 测试类以Test开头,并且不能带有init方法
- 测试函数以test_开头
- 断言使用基本的assert即可
3.Console参数介绍:
- -v 用于显示每个测试函数的执行结果
- -s 用于显示测试函数中print()函数输出
- -q 只显示测试整体测试结果
- -x,--exitfirst 在第一个错误或测试失败时立即退出
- -h 帮助
4.执行方法:
- 配置PyCharm执行:设置 -> 工具 -> 测试下拉框选择pytest
- main方法:pytest.main(['-s','-v','test1.py'])
- 命令行:pytest -s -v 模块名
实例:
import pytest def test1(): print("test1") def test2(): print("test2") if __name__ == '__main__': pytest.main(['-sv','test1.py'])
pytest.main(['参数','模块名'])
5.给用例打标签:
注册标签通过.ini配置文件,格式如下:
保存文件pytest.ini
[pytest] markers= do: do undo: undo
实例:
import pytest @pytest.mark.do def test1(): print("test1") @pytest.mark.undo def test2(): print("test2") if __name__ == '__main__': pytest.main(['-sv','test1.py'])
控制台输入:pytest -m do test1.py
结果:标记为do的用例被执行了
6.pytest参数化处理
使用工具:pytest.mark.parametrize(argnames,argvalues)
argnames:表示参数名称,argvalues:表示参数值
数据可以是列表,元祖,字典或自定义id
实例:
import pytest # 列表 data = ['123', '456'] @pytest.mark.parametrize('pwd', data) def test1(pwd): print(pwd) # 元祖 data2 = [ (1, 2, 3), (4, 5, 6) ] @pytest.mark.parametrize('a,b,c', data2) def test2(a, b, c): print(a, b, c) # 字典 data3 = ( {'user': 1, 'pwd': 2}, {'age': 23, 'email': 'tom@qq.com'} ) @pytest.mark.parametrize('dic', data3) def test3(dic): print(dic) data_1 = [ pytest.param(1, 2, 3, id="(a+b):pass"), # id的值可以自定义 只要能清晰描述用例即可 pytest.param(4, 5, 10, id="(a+b):fail") ] def add(a, b): return a + b class TestParametrize(object): @pytest.mark.parametrize('a, b, expect', data_1) def test_parametrize_1(self, a, b, expect): assert add(a, b) == expect
7.pytest fixture 实现用例之间的调用
- 定义fixture和定义普通的函数差不多,唯一的区别就是在函数上加个装饰器@pytest.fixture()
- fixture命名不要以test开头,跟用例区分,fixture是有返回值的,没有返回值默认为None
- 用例调用fixture的返回值,直接就把fixture的函数名称当做变量名称

浙公网安备 33010602011771号