pytest单元测试框架简介
一、什么是单元测试框架
单元测试框架是指:在软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试。
二、单元测试框架的分类
Java: Juint、TestNG
Python: unnitest、pytest
三、单元测试框架是用来做什么的?
测试发现:从多个文件里面找到测试用例
测试执行:按照一定的顺序和规则去执行,并生成结果
测试判断:通过断言来判断预期结果和实际结果的差异
测试报告:统计测试进度、耗时、用例的通过率,生成测试报告
四、单元测试框架和自动化测试框架有什么区别?
(1)什么是自动化测试框架?
去完成一个指定的系统的自动化测试,而封装的一整套的,完善的代码框架。
(2)自动化测试框架的作用
提高测试效率,降低维护成本‘
减少人工干预,提高测试的准确性,增加代码的复用性
核心思想就是:让不懂代码的人也能够通过该框架实现自动化测试。
(3)pytest单元测试框架和自动化测试框架的关系
pytest单元测试框架只是自动化测试框架的部分之一。
pom:只是自动化测试框架的部分之一
数据驱动:
关键字驱动:
全局配置文件的封装
日志监控:
seleinumr、equests二次封装
断言
测试报告
邮件
五、pytest框架简介
1、pytest是一个非常成熟的python的单元测试框架,比unittest更灵活,更容易上手。
2、pytest可以和seleium、appinum、requests实现Web自动化,App 自动化,和接口自动化。
3、pytest可以实现测试用例的跳过,和reruns失败用例测重试
4、pytest可以结合,allure实现非常美观的测试报告
5、pytest可以和Jenkins实现持续集成。
6、pytest有非常多的强大的插件,并且这些插件可以实现很多实用的操作。
pytest
pytest-html (生成html格式的报告)
pytest-xdist (测试用例分布执行,多CPU分发)
pytest-ordering (用于改变测试用例的执行顺序)
pytest-rerunfailures (用于失败用例重试)
allure-pytest(用于生成美观的测试报告)
批量下载插件
放到requirements.txt文件中,执行 pip install -r requirements.txt 这个命令
六、使用pytest默认的测试用例的规则和基础使用
1、pytest的使用规则
模块名必须以test_开头或者_test结尾
测试类必须以Test开头,并且不能有init方法
测试方法必须以test开头
2、通过读取pytest.ini配置文件运行
七、pytest测试用例的运行方式
1、主函数模式
(1)运行所有:pytest.main()
(2)指定模块:pytest.main(["-vs", “test_login.py”])
(3)指定目录: pytest.main(["-vs", “./interface_testCase”])
(4)通过nodeid指定用例运行,nodeid由模块名,分隔符,类名和方法名组成
1 pytest.main(["-vs", “./interface_testCase/test_interface.py::test_04_func”]) 2 pytest.main(["-vs", “./interface_testCase/test_interface.py::TestInterface::test_03_shaheshang”])
2、命令行模式
(1)运行所有:pytest
(2)执行模块:cd web_testCase 切换到指定模块所在的目录
1 pytest -vs test_login.py
(3)指定目录: pytest -vs ./interface_testCase
(4)通过nodeid指定用例运行: pytest -vs ./interface_testCase/test_interface.py::test_04_func
3、通过读取pytest.ini配置文件运行
pytest.ini 这个文件它是pytest单元测试框架的核心配置文件。
位置:一般放在项目的根目录下。
编码:必须是ANSI
作用: 改变pytest默认的行为规则
运行的规则:不管是主函数的模式运行,还是命令行模式运行,都会去读取这个配置文件。
1 [pytest] 2 addopts = -vs # 命令行参数,用空格分隔 3 # 测试用例路径 4 testpaths = './web_testCase' 5 # 模块名规则 6 python_files = 'test*.py' 7 # 类名的规则 8 python_classes = Test* 9 # 方法名的规则 10 python_functions = test
4、参数详解
1 参数详解: 2 -s: 表示输出调试信息,包括print打印的信息 3 -v: 显示更详细的信息,包括用例所在的模块名和类名 4 -vs: 这两个参数可以一起使用 5 6 --reruns 2: 失败用例重跑 7 -x :表示只要有一个用例报错,那么测试停止 8 --maxfail=2: 表示出现两个用例失败就停止 9 -k: 根据测试用例的部分字符串指定测试用例 10 def test_01_sunwukong def test_02_xiaohong 11 eg: pytest -vs ./web_testCase -k 'on' 12 --html ./report/report.html 生成html格式的测试报告 13 -m : 执行指定标记的用例 eg: -m ’smoke‘ 标志只执行smoke用例 14 -n:支持多线程或者分布式运行测试用例 15 - 主函数模式 16 pytest.main(["-vs", "./web_testCase/test_login", "-n=2"]) 17 - 命令行模式书写 18 pytest -vs ./web_testCase/test_login -n 2 19 `如果有5个用例,分配两个线程来执行的话,那么第一个线程会执行1 3 5 用例,第二个线程会执行2 4 用例
八、失败用例重试
失败用例重试使用的参数是:–reruns==2
test_login中有5个用例,模拟让第二个用例执行失败
1 class TestLogin: 2 def test_01_sunwukong(self): 3 print("测试孙悟空") 4 5 def test_02_xiaohong(self): 6 print("测试小红") 7 assert 1 == 2 8 9 def test_03_huahua(self): 10 print("测试花花") 11 12 def test_01_xiaoming(self): 13 print("测试小明") 14 15 def test_01_dudu(self): 16 print("测试嘟嘟")
all.py
1 import pytest 2 3 if __name__ == '__main__': 4 pytest.main(["-vs", "./web_testCase", '--reruns=2'])
使用命令行模式执行:
1 pytest -vs ./web_testCase --reruns 2
九、pytest执行测试用例的顺序
unittest: 通过ASCII的大小来决定执行的顺序
pytest: 默认从上到下
安装:pytest-ordering 这个插件
该插件作用:用于改变测试用例的执行顺序
可以通过mark 标记来指定用例执行的顺序
1 @pytest.mark.run(order=1) 2 def test_07_xiaohong(self): 3 print("测试小红")
十、如何分组执行
1、分组执行使用场景
冒烟、分模块执行、分接口和web执行
smoke:冒烟用例,分布在各个模块里面
在pytest.ini 配置文件中添加
1 markers = 2 smoke: 冒烟用例 3 usermanage: 用户管理模块 4 productmanage:商品管理模块
在用例中添加标记
1 @pytest.mark.smoke 2 @pytest.mark.usermanager 3 def test_07_xiaohong(self): 4 print("测试小红")
pytest -vs -m ‘smoke’
pytest -vs -m ‘somke or usermanager’
或者在pytest.ini文件中,配置运行指定标记的用例
1 [pytest] 2 # 命令行参数,用空格分隔 3 addopts = -vs -m 'smoke' 4 # 测试用例文件夹,可自己配置 5 testpaths = './web_testCase' 6 # 配置测试搜索的模块文件名称 7 python_files = 'test*.py' 8 # 配置测试搜索的测试类名 9 python_classes = Test* 10 # 配置测试搜索的测试函数名 11 python_functions = test 12 markers = 13 smoke: 冒烟用例 14 usermanage: 用户管理模块 15 productmanage:商品管理模块
在test_login中,用例标记
1 @pytest.mark.smoke 2 def test_07_xiaohong(self): 3 print("测试小红")
在all.py文件中执行
1 import pytest 2 if __name__ == '__main__': 3 pytest.main(["-vs", "./web_testCase"])
十一、pytest跳过测试用例
使用场景:只执行正向用例,不执行反向用例,异常用例
在用例上添加skip标记
1 无条件跳过: 2 3 @pytest.mark.skip(reason=“不执行花花用例”) 4 5 有条件跳过: 6 7 @pytest.mark.skipif(age >= 18, “还未成年”)
浙公网安备 33010602011771号