一、pytest单元测试框架
-
什么是单元测试框架?
软件开发过程中针对软件的最小单位(函数、方法)进行正确性的检查测试
-
单元测试框架有哪些?
Java:Junit testng
python:pytest&unittest
-
单元测试框架主要做什么?
1、测试发现:从多个文件里面找到测试用例
2、测试执行:按照一定顺序和规则执行测试用例,并生成测试结果
3、测试判断:通过断言判断预期结果和实际结果的差异
4、测试报告:统计测试进度、耗时、通过率、生成测试报告
二、单元测试框架和自动化测试框架的关系
-
什么是自动化测试框架?
为了完成一个项目的自动化而封装的一个框架,主要封装的是自动化的基础模块,管理模块和统计模块。
-
自动化框架的作用
1、提高测试效率,降低维护成本
2、减少人工干预,提高测试的准确性,增加代码的重用性
3、核心思想是让不懂代码的人也能够通过这个框架去实现自动化测试
-
pytest单元测试框架和自动化测试框架的关系
单元测试框架:只是自动化测试框架中的组成部分之一(自动化测试框架还包含:pom设计模式,数据驱动,关键字驱动,全局配置文件的封装,日志监控,selenium,requests二次封装。断言体系,报告邮件等等)
三、pytest简介
-
什么是pytest
1、是一个非常成熟的python的单元框架,比unittest更灵活更容易上手
2、可以和selenium,requests,appium结合实现web自动化,接口自动化,app自动化
3、可以实现测试用例的跳过和reruns失败用例重试
4、可以和allure生成美观的测试报告
5、可以和Jenkins持续继承
6、有很多插件,并且这些插件能够实现很多使用的操作
pytest-html 生成html格式的自动化测试报告
pytest-xdist 测试用例分布式执行,多CPU分发
pytest-ordering 改变测试用例的执行顺序(unittest是按照ascii码顺序执行的,或者是testsuit顺序)
pytest-rerunfailures 用力失败重跑
allure-pytest 生成美观的测试报告
如何快速安装pytest插件:
1、进入项目文件夹下,新建一个名为reqirment.txt(名字随便取)
2、把所有要安装的插件名称都写到里面 注意不要有中文
![](https://img-blog.csdnimg.cn/20210707173713113.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1bnhpYW9wZW5nMTAxMjExNA==,size_16,color_FFFFFF,t_70)
3、在terminal中输入:pip install -r 【文件名】 回车
![](https://img-blog.csdnimg.cn/20210707173713114.png)
4、验证 terminal输入pytest --version 有版本返回即为安装成功。 注意这里安装的是局部的,只针对当前venv有效 如果想要安装全局的 使用cmd安装
![](https://img-blog.csdnimg.cn/20210707173713126.png)
四、使用pytest,默认的测试用例规则和基础应用
-
模块名必须以test_开头或_test结尾
-
测试类必须以Test开头,并且不能有__init__方法
-
测试方法必须以test开头
五、pytest测试用例的运行方式
-
主函数模式main
-
运行所有用例:pytest.main()
-
运行指定模块:main中增加 '要运行的py文件名'
-
运行指定文件夹:main中增加 '要运行的文件夹名'
-
通过nodeid指定用例运行:nodeid由模块名,分隔符,类名,方法名,函数名组成单独执行某个函数: pytest.main([ '-s' , '-v' , './second_demo/test_2-1.py::test2_2' ])执行某个类下的方法: pytest.main([ '-s' , '-v' , './second_demo/test_2-1.py::Test2_1::test2_1' ])
-
-
命令行模式
-
运行所有用例:直接terminal输入pytest
-
运行指定模块:pytest 【pytihon文件名】
-
运行指定文件夹:pytest 【文件夹名】
-
nodeid指定用例运行:pytest -v -s ./second_demo/test_2-1.py::test2_2
-
-
参数详解:-s 输出用例里面的调试信息,比如print-v 输出详细的模块信息-n 支持多线程或者分布式运行测试用例 例如:pytest -vs second_demo -n 2表示分配两个线程 pytest.main([ '-s' , '-v' , 'second_demo' , '-n=2' ])-reruns NUM 失败用例重跑 例如:pytest -vs second_demo -reruns 2表示重跑两次 pytest.main([ '-s' , '-v' , 'second_demo' , '--reruns=2' ])-x 只要有一个用例报错测试用例停止 例如:pytest -vs second_demo -x pytest.main([ '-s' , '-v' , 'second_demo' , '-x' ])-maxfail 2 出现两个用例失败就停止 例如:pytest -vs second_demo -maxfail 2 pytest.main([ '-s' , '-v' , 'second_demo' , '--maxfail=2' ])-k 根据测试用例的部分字符串指定测试用例 例如:pytest -vs second_demo -k "2" pytest.main([ '-s' , '-v' , 'second_demo' , '-k="2' ])
-
读取pytest.ini配置文件运行
-
位置:一般放在项目的根目录
-
编码:必须是ANSI,可以用notepad++修改编码格式
-
作用:改变pytest的默认行为。比如命名方式
-
运行的规则:不管是主函数的模式运行还是命令行的模式运行都会去读取这个配置文件[pytest]addopts = -vs #命令行参数,用空格分隔testpaths = ./second_demo #测试用例文件夹,可自己配置python_files = test*.py #配置测试搜索的模块文件名称python_classes = Test* #配置测试搜索的测试类名称python_functions = test #配置测试搜索的测试函数名称
-
格式:
-
六、pytest执行测试用例的顺序
-
uinittest:ascii码顺序执行
-
pytest:按照默认用例顺序执行
-
可以使用使用装饰器order来控制执行顺序:@pytest.mark.run(order=1)
-
七、如何分组执行
-
smoke:冒烟用例,分布在各个模块第一步:pytst.ini中配置markers = smoke第二步:要执行的函数或者方法前增加装饰器第三步:执行的时候带-m "smoke" 如果想执行多个模块就使用-m "A_name or B_name"
八、pytest跳过测试用例
-
无条件跳过
-
有条件跳过
九、生成报告
-
生成html报告: pytest --html=report.html ./(pytest.ini中配置后,执行pytest时无法指定文件夹运行)
-
生成allure测试报告1、下载、解压、配置path路径 全局变量下载后解压,并添加到全局环境变量中D:\Software\allure-2.14.0\bin验证:cmd 输入allure --version如果dos可以验证但是pycarm无法验证,则重启pycharm。因为刚刚配置了全局变量2、加入命令生成json格式的临时报告3、生成allure报告
十、pytest框架实现一些前后肢的处理,常见有三种
-
setup/teardown,setup_class/teardown_class:小写
-
使用@pytest.fixture装饰器来实现部分用例的前后置:被fixture标记的函数里面的return可以传到使用fixture的函数或方法中即可以所有用例执行前后置,又可以实现部分用例的前后置scope:表示的是被标记的方法的作用域。session>module>class>function 默认functionparams:参数化 支持列表[],元组(),字典列表[{},{},{}],字典元组({},{},{})autouse:自动执行,默认falseids:当使用params时,给每个值设置一个变量名name:给被标识的方法起个别名:取了别名后原来的函数名就无法使用了
十一、通过conftest.py和@pytest.fixture()结合使用实现全局的前置应用(比如:项目的全局登录,模块的全局)
-
conftest.py文件是单独存在的一个夹具(装饰器)配置文件,名称不能更改
-
可以在不同的py文件中使用同一个fixture函数
-
原则上conftest.py需要和运行的用例放到同一层(不同层也可以用),并且不需要做任何inport的导入操作。fixture执行的顺序和函数前后顺序相同
十二、断言
-
assert