一、pytest测试框架优势:
- 不需要写setUP()、tearDown()这样的方法,可以直接开始测试;
- 可以自动识别测试用例,不需要向unittest一样将测试用例放进TestSuite里组装;
- pytest提供了丰富的测试夹具功能(Test Fixtures),包括参数化的功能,使得测试数据的组织和调试更加便捷;
- pytest测试框架支持错误重试;
二、安装
命令行:pip install -U pytest
安装成功后,通过以下命令查看安装的版本
pytest --version
三、执行测试用例脚本
-
1.pytest命令行常用运行参数
- 静态挑选:
- pytest . 执行所有当前文件夹及子文件夹下的测试用例
- pytest ../tests 执行根当前文件夹同级的tests文件夹及子文件夹下的测试用例
- pytest [.py文件绝对路劲] 按测试文件挑选并执行测试用例
- 动态挑选:
- pytest -m [...] 执行特定的测试用例
- 首先给测试用例打标签,需要在测试类、测试方法上添加装饰器,测试类本身及测试方法均可打标签;格式 : @pytest.mark.xxx
- 注:xxx是测试类,测试方法的标签名,在运行测试时,可以通过标签名来运行特定的测试用例,例如:
- pytest -m "mark1 and mark2" 运行带有mark1和mark2的标签测试用例;
- pytest -m "mark1 not mark2" 仅运行带有mark1标签的测试用例;
- pytest -m "mark1 or mark2" 运行带有mark1或mark2的标签测试用例;
- pytes -k [...] 执行用例包含“关键字”的用例
- pytest -q [...] 简化控制台输出
- pytest -v [...] 可以输出用例更加详细的执行信息
- pytest -s [...] 输出用例中的调试信息
- 静态挑选:
-
2.pytest.main()运行
- pytest支持在程序中运行(一般情况在main.py)测试用例,需注意的是pytest参数必 须放在一个列表或者元祖里
- pytest.main([...])
- pytest支持在程序中运行(一般情况在main.py)测试用例,需注意的是pytest参数必 须放在一个列表或者元祖里
用例通过示例:
用例执行失败示例 2 !=1:
3.运行状态码:
-
- 退出码 0 :所有测试均被收集并且运行全部成功;
- 退出码 1 : 测试虽已收集并且被运行,但有些测试用例失败了;
- 退出码 2 :测试运行被用户中断;
- 退出码 3: 运行测试时发生了内部错误;
- 退出码 4 :pytest命令行用法错误;
- 退出码 5 :没有收集到任何测试用例
4.忽略测试用例
-
- 使用 --ignore参数忽略测试文件,比如忽略test_order.py文件下所有测试用例 终端执行--> pytest --ignore = test_order.py
- 使用 --deselect 参数忽略测试文件
- 使用@pytest.mark.skip装饰器忽略测试文件
5.失败测试用例重试
背景:持续部署平台自动触发的测试,偶尔网络不稳定,会出现测试用例偶发失败,避免浪费调试成本,常常设置测试用例失败自动重试机制。
安装: pytest install -U pytest-rerunfailures
语法:--reruns Num ,其中num是重试的次数
执行:pytest ./test_order.py --reruns 1 #定义失败后重试两次
四、测试用例命名规范及查找规则
1).py测试文件必须以“test_”开头(或“_test”结尾)
2)测试方法必须以“test_”开头
3)测试类必须以Test开头,并且不能有init方法
4)测试用例默认查找规则:
①、未指定任何参数,从已配置的testpaths中查找,如果没有配置testpaths,则从当前目录开始查找;
②、查找这些目录及子目录下以test开头或者test结尾的.py文件;
③、在查找到.py文件中,继续查找测试类或者测试函数,如果是测试方法,则以test开头的测试方法即被认为是测试文件,如果是测试类,则以test开头的类方法即被认为是测试文件(测试类不能有__init__方法)
④、执行-->直接在根目录下输入 pytest + 回车。
五、测试用例执行顺序
(1)默认执行顺序-->@pytest.mark.run(order = n)
(2)使用pytest-ordering自定义顺序
import pytest
@pytest.mark.run(order = 5)
def test_one():
expect = 2
actual = 2
assert expect == actual
@pytest.mark.run(order = 4)
def test_two():
expect = 1
actual = 1
assert expect == actual
@pytest.mark.run(order = 2)
def test_pay():
print('pay...')
@pytest.mark.run(order = 3)
def test_login():
print('login...')
@pytest.mark.run(order = 1)
def test_order():
print('oreder...')
--------------------执行结果---------------
C:\Users\钟坤\PycharmProjects\Api_test\venv>pytest -v test_one.py
===================== test session starts =====================
platform win32 -- Python 3.7.9, pytest-7.3.1, pluggy-1.0.0 -- d:\python\python37\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.7.9', 'Platform': 'Windows-10-10.0.19041-SP0', 'Packages': {'pytest': '7.3.1', 'pluggy': '1.0.0'}, 'Plugins':
{'allure-pytest': '2.9.45', 'html': '3.2.0', 'metadata': '3.0.0', 'ordering': '0.6', 'rerunfailures': '10.2'}, 'JAVA_HOME': 'C:\\Progr
am Files\\Java\\jdk1.8.0_281'}
rootdir: C:\Users\钟坤\PycharmProjects\Api_test\venv
plugins: allure-pytest-2.9.45, html-3.2.0, metadata-3.0.0, ordering-0.6, rerunfailures-10.2
collected 5 items
test_one.py::test_order PASSED [ 20%]
test_one.py::test_pay PASSED [ 40%]
test_one.py::test_login PASSED [ 60%]
test_one.py::test_two PASSED [ 80%]
test_one.py::test_one PASSED [100%]
========== 5 passed in 0.03s ===========
六、常用断言类型
等于:== 不等于:!= 大于:> 小于:< 属于:in
不属于:not in 大于等于:>= 小于等于:<= 不是:is not
七、pytest数据驱动核心用法
数据驱动是在自动化测试中处理测试数据的方式,通常采用的是测试数据与功能函数分离的方式,在自动化测试运行时,数据驱动框架会读取数据源中的数据,把数据作为参数传递到功能函数中,再根据数据的条数多次运行同一个功能函数,后面的内容将以yaml作为数据源来讲解。
实现:使用pytest内置装饰器@pytest.mark.parametrize,一个参数以字符串的形式存在,它代表被测试函数接受的参数,如果有多个参数,则以逗号分隔;另一个参数用于保存测试数据,如果只有一组数据,则以列表的形式存在,如果有多组数据则以列表嵌套元祖的形式存在,例如[0,1]或者[(0,1),(23,5)]
# 单次循环
@pytest.mark.parametrize("a",["b"])
def test_parametrize(a):
print(a)
# 多次循环
@pytest.mark.parametrize("a,b",[("c","d"),("e","f")])
def test_parametrize(a,b):
print(a,b)
# 参数值为字典形式
@pytest.mark.parametrize("hero",[{"name":"张三"}])
def test_parametrize(hero):
print(hero["name"])
八、yaml文件格式
安装yaml:pip install pyyaml
安装配置文件:pip install configparser
对象:即键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary);
数组:一组按次序排列的值,又称为序列(sequence)/列表(list);
纯量:单个的、不可再分的值
对象:
key:
child-key: value
child-key2: value2
#等于-->{"key": {"child-key": "value","child-key2": "value2"}
#数组:
key:
- A
- B
- C
#等于-->{"key": [A,B,C]}
#组合:
key:
- child-key: value
child-key2: value2
#等于-->{"key": [{"child-key": "value","child-key2": "value2"}]}
#数组嵌套:
key:
-
- A
- B
- C
等于-->{"key": [[A,B,C]]}
九、Allure 测试报告
安装:pip install pytest-html
作用:Allure测试报告非常美观,提供各种维度的测试分析,Allure测试报告的总览页面如下:
了解Allure测试报告各个装饰器的作用
添加项目信息:
report目录下创建environment.properties文件,配置环境信息,例如:
运行:allure serve ./report ,运行后,点击网址,可打开测试报告
今日的分享到此结束了,后续章节中将逐步搭建我们的测试框架,感兴趣的的同学可点赞+收藏,持续更新,最后在分享四个常用的网站,大家可提前熟悉,后面的讲解会持续使用这几个网站:
1.yaml文件格式校验:https://www.bejson.com/validators/yaml_editor/
2.json格式化校验:https://www.bejson.com/json/format/
3.在线jsonpath解释器:https://www.lddgo.net/string/jsonpath
4.文心一言:https://yiyan.baidu.com/