一、pytest是什么
pytest:python的第三方框架,需要先安装后使用。用于接口自动化测试的用例管理框架。
pip install pytest
python:unittest / pytest
java: junit / testng
二、作用
1.发现用例:根据每个框架默认的规则去发现并且加载测试用例
2.执行用例:将测试用例按照一定的顺序和条件执行,并生成结果
3.判断结果:通过断言来判断实际结果和预期结果是否相同
4.生成报告:统计测试进度、耗时、通过率、生成报告
三、单元测试框架和自动化测试框架有什么关系?
1、pytest单元测试框架只是自动化测试框架的组成部分之一。(pytest解决了用例层面的问题)
pytest参数化:
2、pom设计模式也是自动化测试框架的组成部分之一。(pom解决页面层面的问题)
Page Object Model:页面对象 设计模式
- 使用对象代表页面
- 使用对象的属性代表页面的元素
- 使用对象的方法代表页面的操作
定义过程:
- 1、定义BasePage(抽象类)
- 2、定义Page(页面类)
- 3、定义元素的交互(对象方法)
使用过程:
- 1、打开页面,实例化Page
- 2、调用Page方法,完成交互
好处:
- 1、使用POM测试用例非常简洁
- 2、封装了BasePage,元素定位非常简单
- 3、封装Page,相似的交互动作,不用写重复的代码
web封装日志和截图:
定位前截图
定位后截图
3、自动化测试框架还包括
数据驱动、关键字驱动、全局配置文件的封装、日志监控 selenium,requests二次封装、断言、报告邮件、等等
4、什么是自动化测试框架
是自动化测试组长针对一个项目开发的一个代码框架,这个框架封装了很多基础模块,报告模块等等
-
作用?
① 提高测试效率,降低自动化用例的维护成本 ② 减少人工的干预,提高测试的准确性,增加代码的重用性 ③ 核心思想是让不懂代码的人也能通过这个框架去实现自动化
四、pytest
1、pytest简介
1、是一个非常成熟的python用例测试框架,它可以和selenium,requests,appium分别实现web自动化、接口自动化、app自动化
2、可以实现测试用例的跳过以及reruns失败用例重试
3、它可以和allure结合生成美观的报告以及和Jenkins实现持续集成
4、最重要的是,它有很多插件:
pytest-html:生成html报告插件
pytest-xdist:多线程,测试用例分布式执行,多cpu分发
pytest-ordering:标记测试用例的执行顺序(默认从上到下)
pytest-rerunfailuers:失败用例重跑
pytest-base-url:管理基础路径
allure-pytest:生成allure报告
requests
pytest (查看版本:pytest --version)
pyyaml
使用requirements.txt 文件保存插件,并通过命令:pip install -r requirements.txt安装
2、基于pytest单元测试框架,默认测试用例的规则
1.模块名(.py文件)必须以test_开头或_test结尾
2.类名必须Test开头
3.用例名必须以test_开头
这个规则是为了让pytest能找到你的用例,是寻找用例的一种机制
3、pytest测试用例的运行方式
① 主函数模型
在if name == 'main':主函数中
1、运行所有模块:
pytest.main()
2、指定模块:
pytest.main(['-vs','test_login.py'])
3、指定目录:
pytest.main(['-vs','./interface_testcase'])
4、通过nodeid指定用例运行:nodeid由模块名,分隔符,类名、方法名或函数名组成
① 模块名+分隔符(::)+函数名
pytest.main(['-vs','./interface_testcase/test_interface.py::test_02_func'])
② 模块名+分隔符(::)+类名+方法名
pytest.main(['-vs','./interface_testcase/test_interface.py::TestLogin::test_01_zhixing'])
② 命令行模式
在终端运行
1、运行所有模块:
pytest
2、指定模块:
pytest -vs test_login.py
3、指定目录:
pytest -vs ./interface_testcase
4、指定用例运行:
pytest -vs ./interface_testcase/test_interface.py::test_02_func
③ 运行时参数详解
1、-s:表示输出调试信息,包括print打印的信息
2、-v:显示更详细的信息
3、-vs:常一起使用
4、-n:支持多线程或者分布式运行
如:终端方式:
pytest -vs ./testCase -n 2
主函数方式:
pytest.main(['-vs','./testCase','-n=2'])
5、-reruns NUM: 失败用例重跑
终端:
pytest -vs ./testCase/test_login.py --reruns 2
主函数:
pytest.main(['-vs','./testCase','--reruns=2'])
6、-x:表示只要一个用例报错,那么测试停止
终端命令行:
pytest -vs ./testCase/test_login.py -x
主函数:
pytest.main(['-vs','./testCase','-x'])
7、--maxfail=2(NUM) :出现两个用例失败就停止
终端:
pytest -vs ./testCase/test_login.py --maxfail=2
8、-k:根据测试用例的部分字符串指定测试用例
终端:
pytest -vs ./testCase/test_login.py -k "11"
9、--html ./report/report.html:生成html的测试报告
④ 通过读取pytest.ini配置文件运行(是pytest单元测试框架的核心配置文件)
1、位置:一般放在项目的根目录
2、编码:必须是ANSI,可以使用notepad++修改编码格式
[pytest]
addopts = -vs # 命令行的参数,用空格分隔
testpaths = ../testCase # 测试用例的路径
python_files = test_*.py # 模块名的规则
python_classes=Test* # 类名的规则
python_functions = test # 方法名的规则
makers = smoke:冒烟测试
usermanage:用户管理模块
productmanage:商品管理模块
3、作用:改变pytest默认的行为
4、运行的规则:不管是主函数的模式运行,还是命令行模式运行,都会去读取这个配置文件
4、pytest执行测试用例的顺序是怎样
unittest:按照ASCII码的大小来决定执行的顺序
pytest:默认从上到下,改变默认的执行顺序:使用mark标记
@pytest.mark.run(order=1)
5、如何分组执行(冒烟、分模块执行,分接口和web执行)
smoke:冒烟用例,分布在各个模块里面
冒烟用例——终端输入:
pytest -vs -m "smoke"
pytest -vs -m "smoke or usermanage"
6、pytest跳过测试用例
① 无条件跳过
@pytest.mark.skip(reason="不需要测试登录接口1")
② 有条件跳过
age = 18
@pytest.mark.skipif(age>=18,reason='已成年')
7、pytest框架实现一些前后置(固件,夹具)的处理,常用三种
1、setup/teardown, setup_class/teardown_class
注意:和unittest不一样,全是小写
2.使用fixture装饰器来实现部分用例or全部用例的前后置(更灵活)
装饰器:@pytest.fixture(scope="",params="",autouse="",ids="",name="")
scope:作用域
function(函数,用例,默认)
class:类
module:模块
package/session :会话
params:参数化
支持列表[ ]、元组( )、字典列表[{ },{ },{ }]、字典元组( { },{ },{ } )
params = ['成龙',,'甄子丹','李四'],这里的params是参数名,有s
request.param 这里是属性名,是没有s的
同时有前后置,又得到相应的值
autouse=True:自动执行,默认False
ids:当使用params参数化时,给每个值设置一个变量名,意义不大
name:给表示的是被@pytest.fixture标记的方法取一个别名,当取了别名之后,原来的名称就用不了了
3.通过conftest.py和@pytest.fixture( )结合使用实现全局的前置应用(比如:项目的全局登录,模块的全局处理)
1.conftest.py文件是单独存放的一个夹具配置文件,名称是不能更改的
2.用处可以在不同的py文件中使用同一个fixture函数
3.原则上conftest.py需要和运行的用例放到统一层,并且不需要做任何的import导入的操作
总结:
1、setup/teardown,setup_class/teardown_class它是作用于所有用例或者所有的类
2、@pytest.fixture()它的作用既可以部分也可以全部前后置
3、confest.py和@pytest.fixtrue( )结合使用,作用于全局的前后置
8、pytest结合allure-pytest插件生成allure测试报告
之前:pytest-html
现在:allure-pytest
1.下载,解压,配置path路径
https://github.com/allure-framework/allure2/releases
系统变量中配置path路径:D:\Neo4j\allure-2.18.1\allure-2.18.1\bin
验证:allure --version
1. cmd,dos命令
2. pytcharm命令行(失败就重启)
2.加入命令生成json格式的临时报告
--alluredir ./temp
3.生成allure报告
os.system('allure generate ./temp -o ./report --clean')
allure generate 命令,固定的
./temp 临时的json格式报告的路径
-o 输出output
./report 生成的allure报告的路径
--clean 情况这个目录下的所有内容