pytest「conftest、pytest参数化、重运行、出测试报告」

文章总览图

pytest「conftest、pytest参数化、重运行、出测试报告」

一、conftest问题整理:

1.这个conftest.py分路径吗?如果在TestCases下建这个包可以直接用吗?

pytest「conftest、pytest参数化、重运行、出测试报告」

TestCases这里有ModeA和ModeB,想在ModeA或ModeB下面用这个conftest.py里面的,一样全部都可以用。

看目录结构,conftest.py是*目录的。实际工作过程中,ModeA和ModeB是个独立的模块,这个独立的模块下有属于自己的前置后置。如果ModeA和ModeB下面有5个模块,把5个模块的前置后置全部放在conftest.py里面,会觉得太多也太繁琐了,同样存在问题。

conftest也支持包的层级,注意一定要是包。 为什么命令行当中提示我引入失败呢?

那是因为这个地方没有创建成包的形式,一定要以Python包的形式创建:

pytest「conftest、pytest参数化、重运行、出测试报告」

在ModeA或ModeB下面同样可以右键创建conftest,可以作为本模块下的conftest,名字照样是conftest,因为它只有一个名字。

pytest「conftest、pytest参数化、重运行、出测试报告」

2.在这个文件夹里创建的conftest,可以针对本模块做一些事情。

pytest「conftest、pytest参数化、重运行、出测试报告」

但是会存在一些问题,这个conftest和最外层的conftest,它有函数名称是重复的。如果存在函数名称重复,按照常规的思路,优先使用自己模块下的conftest,相当于是在子级的conftest当中,对它去做重写

类和对象当中有学过,子类当中会覆盖父类的同名函数。这里本质上的意思是一样的,虽然我没有定义成类和对象。

如图,有个和它重名的conftest,那么在ModeB下面就用自己模块下的conftest里面的函数。

所以,它是允许分层创建的。也允许在外面放个大的conftest:

pytest「conftest、pytest参数化、重运行、出测试报告」

这个大的conftest里面可以放ModeA和ModeB这样的模块里面都涉及到的前置和后置。如果是ModeA或ModeB独有的前置和后置,那么就放在它们自己目录下的conftest里面就可以了。所以它是支持层级的。

3.一个文件夹下不宜放太多的.py文件,不然你会发现一个文件夹下的文件列表会很长。

具体怎么放,视实际情况而定,切记不可死读书。

二、pytest参数化

pytest当中不能使用ddt。流程性质的东西,在pytest里面叫做参数化。

pytest「conftest、pytest参数化、重运行、出测试报告」

1.pytest和ddt的方式很像,但是还是有区别的:

@pytest.mark.parametrize("参数名",列表数据)

你看,它后面跟了2个变量,ddt当中只要跟一个变量就可以了。比如现在有好几组数据,那在我们ddt当中用一个*号就可以解决它。但是这里不行。

这里最基本的用法是这样的:

2.首先在这里整个参数名,这个参数名的作用是什么?

因为你这个数据是要给测试用例用的。那么这个参数名就是用来接收每一组数据,如果你这个列表当中有10组数据,那么参数名就依次接收这10组数据。

参数名是放在测试用例当中的参数。列表数据就是那10组数据。

pytest「conftest、pytest参数化、重运行、出测试报告」

它是作为函数的参数传进来的。

pytest「conftest、pytest参数化、重运行、出测试报告」pytest「conftest、pytest参数化、重运行、出测试报告」

3.这个参数名能都叫data吗?

当然可以。

4.运行的时候它告诉我搜集了多少测试用例,没有报错就证明没问题。

pytest「conftest、pytest参数化、重运行、出测试报告」

要么从文件开头开始运行,要么从文件结束开始运行。

5.为什么会报错?

pytest「conftest、pytest参数化、重运行、出测试报告」

登录用例当中用到了pytest当中的fixtureaccess_web是我们的前置条件。它代表了它的返回值,我们有修改,但是我们在这个地方并没有修改:

pytest「conftest、pytest参数化、重运行、出测试报告」

第一张图,我们可以看到,搜集了8个用例,那就证明这样的写法是没错的。

6.接收下access_web。前置条件中返回的driver对象以及login的对象。

pytest「conftest、pytest参数化、重运行、出测试报告」

7.为什么我这里不是py开头?

pytest「conftest、pytest参数化、重运行、出测试报告」

可以这样设置:

pytest「conftest、pytest参数化、重运行、出测试报告」pytest「conftest、pytest参数化、重运行、出测试报告」

8.在控制台运行,如果有多个文件夹,是不是要先切换到当前的文件夹,再用pytest?

Terminal里面直接是当前的工程路径。和多个文件夹没关系,是从当前路径下面一层一层去找到对应的就行了。

三、重运行

Web自动化中还重视重运行

在调试的时候会发现用例有的时候能运行成功,有的时候它不能运行成功。Web自动化的用例,准确来说是不太稳定的。它和网页网速、渲染的速度、服务器的状态和自己写脚本的能力都有关系。这些都导致脚本不是特别稳定。

写的每条测试用例应该在本地连续运行3-5次以上。如果没有报错,都能够执行通过,那这种情况下才算在本地调试通过。但是在本地调试通过,不代表在其它的电脑上就一定能调试通过。这是个正常的现象,不要怀疑。

因为不同的电脑,环境也是不一样的。但是你的脚本是一样的,所以大家把代码写好放在其它服务器上去运行的时候,还是需要有一个调试的过程。 但是你在本地调试通过后,再去其它的服务器上调试,问题就会少很多,只有一些小问题需要调试下了。

针对这个现象,Web自动化中有个机制叫做重运行。重运行是专门针对失败的测试用例去重新运行一下

如果第一次有8个测试用例,运行成功后有2个失败了。那么这2个会重运行。

1.是在这个用例失败后马上重运行,还是等全部用例执行完成后再去把这些失败的用例选出来再去运行?

pytest它的重运行原则是当前这个用例失败后马上重运行。

它的重运行也是命令行,但是需要装插件。插件的名称是rerunfailures(翻译为重运行失败的用例)

pytest「conftest、pytest参数化、重运行、出测试报告」

安装命令:pip install pytest-rerunfailures

四、出测试报告

pytest「conftest、pytest参数化、重运行、出测试报告」

我想在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

pytest「conftest、pytest参数化、重运行、出测试报告」

怎么写命令,根据实际情况而定,有时候配置了pycharm后,命令也不一样,所以不可死读书。

命令的顺序没有要求,可随便放。

相对路径:相对于当前的工程。

不支持绝对路径,只支持相对路径。

出来的html报告是这个样子的:

pytest「conftest、pytest参数化、重运行、出测试报告」pytest「conftest、pytest参数化、重运行、出测试报告」

路径这个东西表达的方式也是相对路径,因为我们运行的时候是在当前工程这个目录下,所以相对的都是工程的路径。

自己写的logging也可以配置参数在这里输出日志。


欢迎扫码关注!

pytest「conftest、pytest参数化、重运行、出测试报告」

上一篇:android defStyleAttr/defStyleRes


下一篇:SQLServer 根据表名生成实体类