pytest「conftestpytest参数化重运行出测试报告」
Posted 软件测试小dao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytest「conftestpytest参数化重运行出测试报告」相关的知识,希望对你有一定的参考价值。
文章总览图
一、conftest问题整理:
1.这个conftest.py分路径吗?如果在TestCases下建这个包可以直接用吗?
TestCases这里有ModeA和ModeB,想在ModeA或ModeB下面用这个conftest.py里面的,一样全部都可以用。
看目录结构,conftest.py是顶级目录的。实际工作过程中,ModeA和ModeB是个独立的模块,这个独立的模块下有属于自己的前置后置。如果ModeA和ModeB下面有5个模块,把5个模块的前置后置全部放在conftest.py里面,会觉得太多也太繁琐了,同样存在问题。
conftest也支持包的层级,注意一定要是包。 为什么命令行当中提示我引入失败呢?
那是因为这个地方没有创建成包的形式,一定要以Python包的形式创建:
在ModeA或ModeB下面同样可以右键创建conftest,可以作为本模块下的conftest,名字照样是conftest,因为它只有一个名字。
2.在这个文件夹里创建的conftest,可以针对本模块做一些事情。
但是会存在一些问题,这个conftest和最外层的conftest,它有函数名称是重复的。如果存在函数名称重复,按照常规的思路,优先使用自己模块下的conftest,相当于是在子级的conftest当中,对它去做重写。
类和对象当中有学过,子类当中会覆盖父类的同名函数。这里本质上的意思是一样的,虽然我没有定义成类和对象。
如图,有个和它重名的conftest,那么在ModeB下面就用自己模块下的conftest里面的函数。
所以,它是允许分层创建的。也允许在外面放个大的conftest:
这个大的conftest里面可以放ModeA和ModeB这样的模块里面都涉及到的前置和后置。如果是ModeA或ModeB独有的前置和后置,那么就放在它们自己目录下的conftest里面就可以了。所以它是支持层级的。
3.一个文件夹下不宜放太多的.py文件,不然你会发现一个文件夹下的文件列表会很长。
具体怎么放,视实际情况而定,切记不可死读书。
二、pytest参数化
pytest当中不能使用ddt。流程性质的东西,在pytest里面叫做参数化。
1.pytest和ddt的方式很像,但是还是有区别的:
@pytest.mark.parametrize(“参数名”,列表数据)
你看,它后面跟了2个变量,ddt当中只要跟一个变量就可以了。比如现在有好几组数据,那在我们ddt当中用一个*号就可以解决它。但是这里不行。
这里最基本的用法是这样的:
2.首先在这里整个参数名,这个参数名的作用是什么?
因为你这个数据是要给测试用例用的。那么这个参数名就是用来接收每一组数据,如果你这个列表当中有10组数据,那么参数名就依次接收这10组数据。
参数名是放在测试用例当中的参数。列表数据就是那10组数据。
它是作为函数的参数传进来的。
3.这个参数名能都叫data吗?
当然可以。
4.运行的时候它告诉我搜集了多少测试用例,没有报错就证明没问题。
要么从文件开头开始运行,要么从文件结束开始运行。
5.为什么会报错?
登录用例当中用到了pytest当中的fixture,access_web是我们的前置条件。它代表了它的返回值,我们有修改,但是我们在这个地方并没有修改:
第一张图,我们可以看到,搜集了8个用例,那就证明这样的写法是没错的。
6.接收下access_web。前置条件中返回的driver对象以及login的对象。
7.为什么我这里不是py开头?
可以这样设置:
8.在控制台运行,如果有多个文件夹,是不是要先切换到当前的文件夹,再用pytest?
Terminal里面直接是当前的工程路径。和多个文件夹没关系,是从当前路径下面一层一层去找到对应的就行了。
三、重运行
Web自动化中还重视重运行。
在调试的时候会发现用例有的时候能运行成功,有的时候它不能运行成功。Web自动化的用例,准确来说是不太稳定的。它和网页网速、渲染的速度、服务器的状态和自己写脚本的能力都有关系。这些都导致脚本不是特别稳定。
写的每条测试用例应该在本地连续运行3-5次以上。如果没有报错,都能够执行通过,那这种情况下才算在本地调试通过。但是在本地调试通过,不代表在其它的电脑上就一定能调试通过。这是个正常的现象,不要怀疑。
因为不同的电脑,环境也是不一样的。但是你的脚本是一样的,所以大家把代码写好放在其它服务器上去运行的时候,还是需要有一个调试的过程。 但是你在本地调试通过后,再去其它的服务器上调试,问题就会少很多,只有一些小问题需要调试下了。
针对这个现象,Web自动化中有个机制叫做重运行。重运行是专门针对失败的测试用例去重新运行一下。
如果第一次有8个测试用例,运行成功后有2个失败了。那么这2个会重运行。
1.是在这个用例失败后马上重运行,还是等全部用例执行完成后再去把这些失败的用例选出来再去运行?
pytest它的重运行原则是当前这个用例失败后马上重运行。
它的重运行也是命令行,但是需要装插件。插件的名称是rerunfailures(翻译为重运行失败的用例)
安装命令:pip install pytest-rerunfailures
我想在jenkins上直接看到测试报告(方便测试经理或产品经理看这个项目的测试结果)。只需自己 登录jenkins上看下最新的测试结果数据。
1.xml就是给jenkins集成这样的东西。我们可以进一步解析xml文件,接口测试中有一种数据表达方式就是xml,xml是用来存储数据。我们拿到这样的数据就可以解析。
第一,如果想二次定制更漂亮的测试报告,可以解析这个xml。
第二,外部的一些软件想要获取测试结果,放到别人的平台上去。那就是通过xml的解析。
2.result log就是在控制台中看到输出的样子。这个格式基本没啥用。
3.html和Htmltestrunner的区别是比较大的。
以上3种测试报告都有自己的命令格式。xml和result log这2种是自带的,只有Html是需要安装插件的。
命令:
pytest -m demo --reruns 2 --reruns-delay 5 -s --junitxml=Outputs/reports/report.xml --html=Outputs/a.html
怎么写命令,根据实际情况而定,有时候配置了pycharm后,命令也不一样,所以不可死读书。
命令的顺序没有要求,可随便放。
相对路径:相对于当前的工程。
不支持绝对路径,只支持相对路径。
出来的html报告是这个样子的:
路径这个东西表达的方式也是相对路径,因为我们运行的时候是在当前工程这个目录下,所以相对的都是工程的路径。
自己写的logging也可以配置参数在这里输出日志。
最后:【可能给予你一定的帮助】
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
关注我的微信公众号【软件测试小dao】免费获取~
我的学习交流群:644956177 群里有技术大牛一起交流分享~
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
以上是关于pytest「conftestpytest参数化重运行出测试报告」的主要内容,如果未能解决你的问题,请参考以下文章
pytest文档69-Hook函数之参数化生成测试用例pytest_generate_tests
pytest文档74-参数化parametrize加marks标记(pytest.param)