学做网站好就业吗,商务型网站模板,发送电子邮件,东莞seo推广优化排名目录
一、前言pytest是一个非常成熟的全功能的Python测试框架#xff0c;主要特点#xff1a;
二、pytest安装
2.1、安装 pip install -U pytest
2.2、验证安装 pytest --version # 会展示当前已安装版本
2.3、pytest文档 官方文档#xff1a;https:…目录
一、前言pytest是一个非常成熟的全功能的Python测试框架主要特点
二、pytest安装
2.1、安装 pip install -U pytest
2.2、验证安装 pytest --version # 会展示当前已安装版本
2.3、pytest文档 官方文档https://docs.pytest.org/en/latest/contents.html
三、pytest框架的约束
3.1、 python的命名规则
3.2、 pytest的命名规则
四、pytest的运行方式
4.1、主函数运行编辑main中可使用的参数有
4.2、命令行运行
4.3、pytest.ini配置文件方式运行常用 mian执行方式还是命令执行都会去读取pytest.ini文件编辑
五、pytest配置文件pytest.ini文件
六、pytest的常用插件
七、pytest中conftest.py文件
7.1、conftest.py的特点
7.2、conftest.py的示例目录最顶层的 conftest一般写全局的 fixture
八、pytest中fixtrue装饰器
8.1、前言
8.2、fixtrue的优势
8.3、Fixture的调用方式pytest.fixture(scope function,paramsNone,autouseFalse,idsNone,nameNone)
8.4、Fixture的作用范围
8.5、fixtrue参数详解-scope
8.5.1、scope “function”
8.5.2、scope “class”测试类内的每一个测试方法都调用了fixturefixture只在该class下所有测试用例执行前执行一次
8.5.3、scope “module”与class相同只从.py文件开始引用fixture的位置生效
编辑
8.5.4、scope “session”
8.6、fixtrue参数详解-autouse
默认False,若为True刚每个测试函数都会自动调用该fixture,无需传入fixture函数名由此我们可以总结出调用fixture的三种方式 1.函数或类里面方法直接传fixture的函数参数名称 2.使用装饰器pytest.mark.usefixtures()修饰 3.autouseTrue自动调用无需传仍何参数作用范围跟着scope走谨慎使用让我们来看一下当autouseture的效果编辑
8.7、fixtrue参数详解params
8.8、fixtrue参数详解-ids
8.9、fixtrue参数详解-name
九、pytest跳过测试用例skip、skipif
9.1、pytest.mark.skip跳过执行测试用例有可选参数 reason跳过的原因会在执行结果中打印
9.2、pytest.skip()函数基础使用作用在测试用例执行期间强制跳过不再执行剩余内容类似在Python的循环里面满足某些条件则break 跳出循环编辑
9.3、 pytest.skip(msg“”,allow_module_levelFalse)
9.4、 pytest.skip(msg“”,allow_module_levelFalse)
9.5、跳过标记
9.6、pytest.importorskip( modname: str, minversion: Optional[str] None, reason: Optional[str] Nonse )作用如果缺少某些导入则跳过模块中的所有测试参数列表
9.7、使用自定义标记 mark
十、Pytest参数化 pytest.mark.parametrize
10.1、函数数据参数化
十一、pytest标记为失败函数和失败重试
十二、pytest生成测试报告
1、下载Allure插件
2、生成临时的json报告过度
3、生成html报告 4、allure测试报告优化
十三、pytest中管理日志
1、日志级别
2、分析解释
3、日志输出-控制台
4、日志输出-文件
5、日志输出-控制台和文件
6、format常用格式说明
7、捕捉异常traceback记录编辑
8、日志滚动和过期删除按时间编辑
十四、总结 一、前言 pytest是一个非常成熟的全功能的Python测试框架主要特点 1、简单灵活非常方便的组织自动化测试用例 2、支持参数化可以细粒度地控制要测试的测试用例 3、能够支持简单的单元测试和复杂的功能测试比如web端selenium/移动端appnium等自动化测试、request接口自动化测试 4、pytest具有很多第三方插件并且可以自定义扩展比如测试报告生成失败重运行机制 5、测试用例的skip和fail处理 6、结合业界最美的测试报告allureJenkins持续集成
二、pytest安装 2.1、安装 pip install -U pytest
2.2、验证安装 pytest --version # 会展示当前已安装版本
2.3、pytest文档 官方文档https://docs.pytest.org/en/latest/contents.html
三、pytest框架的约束 3.1、 python的命名规则
1py文件全部小写多个英文用_隔开2class名首字母大写驼峰3函数和方法名小写多个英文用_隔开4全局变量前面要加global5常量字母必须全大写如AGE_OF_NICK
3.2、 pytest的命名规则
1模块名py文件必须是以test_开头或者_test结尾2测试类class必须以Test开头并且不能带init方法类里的方法必须以test_开头3测试用例函数必须以test_开头
四、pytest的运行方式 4.1、主函数运行 main中可使用的参数有
参数描述案例-v输出调试信息。如打印信息pytest.main([‘-v’,‘testcase/test_one.py’,‘testcase/test_two.py’])-s输出更详细的信息如文件名、用例名pytest.main([‘-vs’,‘testcase/test_one.py’,‘testcase/test_two.py’])-n多线程或分布式运行测试用例-x只要有一个用例执行失败就停止执行测试pytest.main([‘-vsx’,‘testcase/test_one.py’])– maxfail出现N个测试用例失败就停止测试pytest.main([‘-vs’,‘-x2’,‘testcase/test_one.py’]–htmlreport.html生成测试报告pytest.main([‘-vs’,‘–html./report.html’,‘testcase/test_one.py’])-m通过标记表达式执行-k根据测试用例的部分字符串指定测试用例可以使用andor 4.2、命令行运行 4.3、pytest.ini配置文件方式运行常用 mian执行方式还是命令执行都会去读取pytest.ini文件 pytset.ini文件尽可能不要出现中文。 五、pytest配置文件pytest.ini文件 pytest的配置文件通常放在测试目录下名称为pytest.ini命令行运行时会使用该配置文件中的配置
六、pytest的常用插件 插件列表网址https://plugincompat.herokuapp.com包含很多插件包大家可依据工作的需求选择使用。
七、pytest中conftest.py文件
7.1、conftest.py的特点
pytest 会默认读取 conftest.py里面的所有 fixtureconftest.py 文件名称是固定的不能改动conftest.py 只对同一个 package 下的所有测试用例生效不同目录可以有自己的 conftest.py一个项目中可以有多个 conftest.py测试用例文件中不需要手动 import conftest.pypytest 会自动查找
7.2、conftest.py的示例目录最顶层的 conftest一般写全局的 fixture 八、pytest中fixtrue装饰器 8.1、前言 虽然setup和teardown可以执行一些前置和后置操作但是这种是针对整个脚本全局生效的 如果有以下场景 用例一需要执行登录操作 用例二不需要执行登录操作 用例三需要执行登录操作则setup和teardown则不满足要求。 fixture可以让我自定义测试用例的前置条件
8.2、fixtrue的优势 命名方式灵活不限于setup和teardown两种命名conftest.py可以实现数据共享不需要执行import 就能自动找到fixturescopemodule可以实现多个.py文件共享前置scope“session” 以实现多个.py 跨文件使用一个 session 来完成多个用例 8.3、Fixture的调用方式 pytest.fixture(scope function,paramsNone,autouseFalse,idsNone,nameNone) 8.4、Fixture的作用范围 8.5、fixtrue参数详解-scope
用于控制Fixture的作用范围作用类似于Pytest的setup/teardown默认取值为function函数级别控制范围的排序为session module class function
8.5.1、scope “function” 场景一做为参数传入 从运行结果可以看出fixture做为参数传入时会在执行函数之前执行该fixture函数。再将值传入测试函数做为参数使用这个场景多用于登录
场景二Fixture的相互调用
即使fixture之间支持相互调用但普通函数直接使用fixture是不支持的一定是在测试函数内调用才会逐级调用生效有多层fixture调用时最先执行的是最后一层fixture而不是先执行传入测试函数的fixture上层fixture的值不会自动return,这里就类似函数相互调用一样的逻辑
8.5.2、scope “class” 测试类内的每一个测试方法都调用了fixturefixture只在该class下所有测试用例执行前执行一次 测试类中的测试方法使用了fixture函数名fixture只在该class下第一个使用fixture函数的测试用例位置开始算后面所有的测试用例执行前只执行一次。而该位置之前的测试用例就不管。 语法
1pytest.fixture(scopeclass) 8.5.3、scope “module”与class相同只从.py文件开始引用fixture的位置生效 8.5.4、scope “session”
session的作用范围是针对.py级别的module是对当前.py生效seesion是对多个.py文件生效session只作用于一个.py文件时作用相当于module所以session多数与contest.py文件一起使用做为全局Fixture
8.6、fixtrue参数详解-autouse 默认False,若为True刚每个测试函数都会自动调用该fixture,无需传入fixture函数名 由此我们可以总结出调用fixture的三种方式 1.函数或类里面方法直接传fixture的函数参数名称 2.使用装饰器pytest.mark.usefixtures()修饰 3.autouseTrue自动调用无需传仍何参数作用范围跟着scope走谨慎使用 让我们来看一下当autouseture的效果
8.7、fixtrue参数详解params
Fixture的可选形参列表支持列表传入 默认None每个param的值 fixture都会去调用执行一次类似for循环 可与参数ids一起使用作为每个参数的标识详见ids 被Fixture装饰的函数要调用是采用Request.param(固定写法如下图) 8.8、fixtrue参数详解-ids 用例标识ID与params配合使用一对一关系配置了IDS后 8.9、fixtrue参数详解-name fixture的重命名 通常来说使用 fixture 的测试函数会将 fixture 的函数名作为参数传递但是 pytest 也允许将fixture重命名 如果使用了name,那只能将name传如函数名不再生效 调用方法pytest.mark.usefixtures(‘fixture1’,‘fixture2’) 九、pytest跳过测试用例skip、skipif 9.1、pytest.mark.skip 跳过执行测试用例有可选参数 reason跳过的原因会在执行结果中打印 9.2、pytest.skip()函数基础使用 作用在测试用例执行期间强制跳过不再执行剩余内容 类似在Python的循环里面满足某些条件则break 跳出循环 9.3、 pytest.skip(msg“”,allow_module_levelFalse) 当 allow_module_levelTrue 时可以设置在模块级别跳过整个模块 9.4、 pytest.skip(msg“”,allow_module_levelFalse)
方法skipif(condition, reasonNone)参数condition跳过的条件必传参数reason标注原因必传参数使用方法pytest.mark.skipif(condition, reason“xxx”) 9.5、跳过标记 可以将 pytest.mark.skip 和 pytest.mark.skipif 赋值给一个标记变量在不同模块之间共享这个标记变量若有多个模块的测试用例需要用到相同的 skip 或 skipif 可以用一个单独的文件去管理这些通用标记然后适用于整个测试用例集# 标记skipmark pytest.mark.skip(reason不能在window上运行)skipifmark pytest.mark.skipif(sys.platform win32, reason不能在window上运行啦啦啦) 9.6、pytest.importorskip( modname: str, minversion: Optional[str] None, reason: Optional[str] Nonse ) 作用如果缺少某些导入则跳过模块中的所有测试 参数列表
modname模块名minversion版本号reason跳过原因默认不给也行
pexpect pytest.importorskip(pexpect, minversion0.3)pexpectdef test_import(): print(test) 9.7、使用自定义标记 mark 命令运行
pytest -s -m model test_one.py如何避免warnings创建一个 pytest.ini 文件加上自定义markpytest.ini 需要和运行的测试用例同一个目录或在根目录下作用于全局
十、Pytest参数化 pytest.mark.parametrize pytest允许在多个级别启用测试化参数 1pytest.fixture()允许fixture有参数化功能 2pytest.mark.parametrize 允许在测试函数和类中定义多组参数和fixtures 3pytest_generate_tests允许定义自定义参数化方案或扩展
def parametrize(self,argnames, argvalues, indirectFalse, idsNone, scopeNone):argnames含义参数值列表格式字符串arg1,arg2,arg3例如pytest.mark.parametrize(“name,pwd”, [(“yy1”, “123”), (“yy2”, “123”)])argvalues:含义参数值列表格式必须是列表如[ val1,val2,val3 ]如果只有一个参数里面则是值的列表如pytest.mark.parametrize(“username”, [“yy”, “yy2”, “yy3”])如果有多个参数例则需要用元组来存放值一个元组对应一组参数的值如pytest.mark.parametrize(“name,pwd”, [(“yy1”, “123”), (“yy2”, “123”), (“yy3”, “123”)])ids含义用例的id格式传一个字符串列表作用可以标识每一个测试用例自定义测试数据结果的显示为了增加可读性indirect作用如果设置成 True则把传进来的参数当函数执行而不是一个参数下一篇文章即讲解 10.1、函数数据参数化
方便测试函数对测试属于的获取。 方法 parametrize(argnames, argvalues, indirectFalse, idsNone, scopeNone) 常用参数 argnames参数名 argvalues参数对应值类型必须为list 当参数为一个时格式[value] 当参数个数大于一个时格式为:[(param_value1,param_value2…),(param_value1,param_value2…)] 使用方法: pytest.mark.parametrize(argnames,argvalues) ️ 参数值为N个测试方法就会运行N次 十一、pytest标记为失败函数和失败重试 安装第三方插件pytest-rerun、pytest-rerunfailures
失败重试【–reruns1】,用例执行失败后会立即开始重试一次此用例再执行下一条用例 失败重运行【–if】 用例集或用例执行完成之后再次pytest.main()会收集失败的用例再次运行如果没有失败的用例会执行全部 一个run文件可以同时写多条pytest.main()执行pytest的命令 注意如果用例数较多第一次运行全部成功的情况第二个pytest.main()是会收集所有的用例再执行一遍建议使用失败重试次数–reruns1失败一次后立刻执行一次也可减少用例的失败率
失败重试方式:1、可在命令行 –reruns1 reruns_delay2 失败后重运行1次延时2s2、使用装饰器进行失败重运行pytest.mark.flaky(reruns1, reruns_delay2)使用方式命令行参数–reruns n重新运行次数–reruns-delay m等待运行秒数装饰器参数rerunsn重新运行次数reruns_delaym等待运行秒数
重新运行指定的测试用例:
注意
1.如果指定了用例的重新运行次数在命令行添加的 --reruns 对这些用例是不会生效的2.不可以和 fixture 装饰器pytest.fixture()一起使用3.该插件与 pytest-xdist 的 --looponfail 标志不兼容4.该插件与核心 --pdb 标志不兼容 十二、pytest生成测试报告 1、下载Allure插件 官方地址allure官方下载地址bin目录放到path变量当中 验证是否安装成功allure -- version
2、生成临时的json报告过度 pytest.ini文件中addopts中加上一个--alluredir./temps --clean-alluredir 清除上次的数据
3、生成html报告 pytest框架自带一个测试报告内容也相对全面但是可读性差点allure生成的测试报告可改造性强看起来也美观 4、allure测试报告优化 在allure测试报告页面可以选择中英文切换我个人比较倾向使用【功能/Behaviors】这个菜单里面的信息因为这里可以看到更多详细的内容也比较容易对我们的测试用例进行规范化
1、增加功能模块描述、测试点描述及测试步骤
方法先import allure然后在类上添加装饰器allure.feature(生成账单)在方法上添加装饰器allure.story(批量生成账单)在方法里面添加步骤with allure.step(1.进入[社区管理]菜单):
使用及效果图
(feature相当于一个功能一个大的模块将case分类到某个feature中报告中在behaviore中显示相当于testsuite)
(story相当于对应这个功能或者模块下的不同场景分支功能属于feature之下的结构报告在features中显示相当于testcase) 2、执行断言失败截图、成功截图
一条case可以在中间步骤进行断言可以在最后进行断言看测试需要。我们想要的一个结果是断言失败的截图并放到allure测试报告中。
现在项目下面建一个screenshot文件夹用来放截取的图片然后allure再获取该图片。houseInfoFail.png这个是自己定义的图片的文件名。
如果断言成功了也截取一张图片并放到allure报告中。完整代码如下 houseInfo.png这个是执行成功截取的图片注意和上面执行失败截取的图片文件名区分一下。 十三、pytest中管理日志
1、日志级别 默认生成的root logger的level是logging.WARNING低于该级别的就不输出了
级别排序CRITICAL ERROR WARNING INFO DEBUG
debug : 打印全部的日志详细的信息通常只出现在诊断问题上 info : 打印infowarningerrorcritical级别的日志确认一切按预期运行 warning : 打印warningerrorcritical级别的日志一个迹象表明一些意想不到的事情发生了或表明一些问题在不久的将来(例如。磁盘空间低”)这个软件还能按预期工作 error : 打印errorcritical级别的日志更严重的问题软件没能执行一些功能 critical : 打印critical级别一个严重的错误这表明程序本身可能无法继续运行
这时候如果需要显示低于WARNING级别的内容可以引入NOTSET级别来显示 2、分析解释 Logging.Formatter这个类配置了日志的格式在里面自定义设置日期和时间输出日志的时候将会按照设置的格式显示内容。
Logging.LoggerLogger是Logging模块的主体。 进行以下三项工作
为程序提供记录日志的接口判断日志所处级别并判断是否要过滤根据其日志级别将该条日志分发给不同handler
常用函数有
Logger.setLevel() 设置日志级别Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个HandlerLogger.addFilter() 添加一个Filter过滤作用Logging.HandlerHandler基于日志级别对日志进行分发如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。
常用函数有
setLevel() 设置级别setFormatter() 设置Formatter
3、日志输出-控制台 上面代码通过logging.basicConfig函数进行配置了日志级别和日志内容输出格式
4、日志输出-文件 5、日志输出-控制台和文件 只要在输入到日志中的第二步和第三步插入一个handler输出到控制台 创建一个handler用于输出到控制台
ch logging.StreamHandler() ch.setLevel(logging.WARNING) # 输出到console的log等级的开关
第四步和第五步分别加入以下代码即可
ch.setFormatter(formatter) logger.addHandler(ch) 6、format常用格式说明 %(levelno)s: 打印日志级别的数值 %(levelname)s: 打印日志级别名称 %(pathname)s: 打印当前执行程序的路径其实就是sys.argv[0] %(filename)s: 打印当前执行程序名 %(funcName)s: 打印日志的当前函数 %(lineno)d: 打印日志的当前行号 %(asctime)s: 打印日志的时间 %(thread)d: 打印线程ID %(threadName)s: 打印线程名称 %(process)d: 打印进程ID %(message)s: 打印日志信息
7、捕捉异常traceback记录
需要将日志不上报错误仅记录可以写成exc_infoFalse
8、日志滚动和过期删除按时间
说明
filename日志文件名的prefixwhen是一个字符串用于描述滚动周期的基本单位字符串的值及意义如下“S”Seconds“M”Minutes“H”Hours“D”Days“W”Week day (0Monday)“midnight”Roll over at midnightinterva滚动周期单位有when指定比如when’D’,interval1表示每天产生一个日志文件backupCount表示日志文件的保留个数
十四、总结 如果你看到了总结那么恭喜你看到了总结总结是全文的精华而精华是全文的内容。相对Unittest框架优先选择Pytest。希望此文对你有所帮助谢谢关注和点赞收藏。