一、ptest单元测试框架
1)什么是单元测试框架
单元测试是指在软件开发当中,针对软件的最小单位(函数、方法)进行正确的检查测试
2)单元测试框架
java:junit和testing
python:unittest和pytest
3)单元测试主要做什么?
1、测试发现:从多个文件里面去找到我们测试用例
2、测试执行:按照一定顺序和规则去执行,并生成结果
3、测试判断:通过断言判断预期结果和实际结果的差异
4、测试报告:统计测试进度、耗时、通过率、生成测试报告
二、单元测试框架和自动化测试框架有什么关系?
1)什么是自动化测试框架
2)作用
1、提高测试效率、降低维护成本
2、减少人工干预,提高测试的准确性,增加代码的重要性
3、核心思想史让不懂代码的人也能够通过这个框架去实现自动化测试
3)pytest单元测试框架和自动化测试框架的关系
单位测试框架:只是自动化测试框架中的组成部分之一
pom设计模式:只是自动化测试框架中的组成部分之一
数据驱动...
关键字驱动
全局配置文件的封装
日志监控
selenium,requests二次封装
断言
报告邮件
更多.....
三、pytest简介
1、pytest是一个非常成熟的python的单元框架、比unittest更灵活、容易上手
2、pytest可以和selenium,requests,appium结合实现web自动化,app自动化,接口自动化
3、pytest可以实现测试用例的跳过以及reruns失败用例重试
4、pytest可以和allure生成非常没关的测试报告
5、pytest可以和jenkins持续集成
6、pytest有很多非常强大的插件,并且这些插件能够实现很多的使用操作
#插件介绍
pytest-html(生成html格式的自动化测试报告,此场景用于如testReport中点击index.html)
pytest-xdist(测试用例分布式执行多CPU分发,此场景用于-n参数使用前必须安装的插件)
pytest-ordering(用于改变用例的执行顺序,此场景用于装饰器@pytest.mark.run(order=NUM)使用前必须安装的插件)
pytest-rerunfailures(用于失败用例重跑)
allure-pytest(用于生成美观的测试报告,此场景用于-reruns NUM参数使用前必须安装的插件)
一个一个安装有点麻烦,可以新建一个requirements.txt文件,通过在pycharm的Terminal中pip install -r requirements.txt一次性安装
四、使用pytest,默认的测试用例的规则以及基础应用
1、模块名必须以test_开头或者以_test结尾
2、测试类必须以Test开头,并且不能有init方法
3、测试方法必须以test开头
五、参数详解
-v:将调式信息展示出来,包括print打印信息
-s:将详细执行的哪条信息展示出来
-vs:结合以上信息
-n:多线程、分布式运行测试用例,提升执行用例时间(命令用法:“pytest -vs ./testcase -n 2”;主函数用法:pytest.main(["-vs","./testcase","-n=2"]))
--reruns NUM:失败用例重跑,NUM等于几就重跑几次(命令用法:pytest -vs ./testcase --reruns 2;主函数用法:pytest.main(["-vs","./testcase","--reruns=2"])
-x:只要有一个用例报错,那么测试停止(命令用法:pytest -vs ./testcase -x;主函数用法:pytest.main(["-vs","./testcase","-x"])
-maxfail=2 :只要有两个用例报错,那么测试停止(命令用法:pytest -vs ./testcase -maxfail 2;主函数用法:pytest.main(["-vs","./testcase","-maxfail=2")]
-k:根据测试用例的部分字符串指定测试用例,如只想执行所有带user字符串的用例(命令用法:pytest -vs ./testcase -user "user";主函数用法:pytest.main(["-vs","./testcase","-k=user"))
--html ./TestReport/index.html:生成html测试报告(pytest -vs --html ./TestReport/index.html)TestPeport为自己新建放报告的文件夹,index为具体报告生成名
六、pytest测试用例的运行方式
1、主函数(main)
1)运行指定模块如testcase下test_article_addHotCnt.py,此方法场景运用于运行该模块中所有用例(如放到单个模块下调试用)
if __name__ == '__main__':
pytest.main(['-vs','test_article_addHotCnt.py'])
2)运行指定目录如testcase下所有用例,此方法场景运用于运行该目录下所有test_开头的所有用例(如放到testRun里)
if __name__ == '__main__':
pytest.main(['-vs','./TestCase'])
3)运行指定目录下指定模块下的指定用例,此方法场景运用于指定某个单条用例
if __name__ == '__main__':
pytest.main(['-vs','./TestCase/test_article_addHotCnt.py::Test_article_addHotCnt::test_addHotCnt_success'])
4)直接运行所有test_或_test结尾的用例
if __name__ == '__main__':
pytest.main(['-vs'])
2、命令
1)运行指定模块(模块中所有用例将被执行)
pytest -vs test_article_addHotCnt.py
2)运行指定目录(目录下所有模块的所有用例将被执行)
pytest -vs TestCase
3)运行指定目录下指定模块,指定模块下指定类,指定类下的指定方法(指定模块下的指定的用例将被执行)
pytest -vs ./TestCase/test_article_addHotCnt.py::Test_article_addHotCnt::test_addHotCnt_success
4)直接运行所有test_或_test结尾的用例
pytest -vs
3、通过读取pytest.ini配置文件运行
pytest.ini这个文件它是pytest单位测试框架的核心配置文件
1、位置:一般放到项目根目录
2、编码:必须是ANSI可以使用notpad++修改编码格式
3、作用:改变pytest默认的行为
4、运行规则:不管是主函数还是命令行模式运行,都会去读取这个配置文件
5、配置文件的固定写法
[pytest]
#命令行参数,用空格分隔
addopts = -vs -n --reruns 2...
#测试用例路径(测试用例文件夹,可自己配置,比如你想把testcase换成hahah这里就写../hahah)
testpaths = ../testcase
#模块名的规则(配置测试搜索的测试类名,可以自己配置,比如你想把testcase下所有模块改为haha开头才会被执行,这里就写haha_*.py)
python_files = test_*.py
#类名的规则(配置测试搜素的测试类名,可以自己配置,比如你想把类名已haha开头才会被执行,则改为Haha*)
python_classes = Test*
#方法名的规则(配置测试搜索的函数名,可以自己配置,比如你想函数名以aaa开头的才会被执行,则改为aaa)
python = test
#定义被标记执行的用例,标记名自定义非固定(比如:smoke可以自定义为aaa)
markers =
smoke:冒烟测试
article:文章模块
patient:患者模块
...
七、pytest执行测试用例顺序
1)默认从上到下执行
2 )装饰器@pytest.mark.run(order=NUM),用于改变默认的执行顺序,标记用例执行顺序,放到用例前,NUM等于几用例就第几个执行
八、如何分组执行(场景:冒烟、分模块执行、同一个项目里面分接口和ui执行)
在用例前使用装饰器@pytest.make.“标记名”,标记名取配置文件markers中自定义的名称
smoke:冒烟用例,分布在各个模块里面
pytest -vs -m“smoke” #执行所有标记了@pytest.make.smoke的用例
pytest -vs -m“smoke or article” #执行所有标记了@pytest.make.smoke和@pytest.make.article的用例
九、跳过用例
1、无条件跳过
@pytest.mark.skipif(reason='跳过测试')
2、有条件跳过
例:定义一个变量age=18
@pytest.mark.skipif(age>=18,reason='测试有条件跳过') #当装饰器中有age=18这个条件才跳过,如果是小于或者大于18则不跳过