魏晓东 发表于 2024-12-5 19:16:45

【python主动化一】pytest的底子使用

1.pytest简述

pytest‌ 是一个功能强大且机动的Python测试框架,其主要是用于流程控制,具体用于UI还是接口主动化根据个人必要而定。且其具有丰富插件,使用时较为方便。咱们具体看下方的内容,本文按照使用场景睁开,不完全按模块分别,减少割裂感。
2.安装pytest

安装命令(已安装python及pip):
pip install -U pytest# cmd命令行中直接输入即可
https://i-blog.csdnimg.cn/direct/32482078e9a94927b22d0e5e7c64c949.png
检察是否已经安装成功:
pytest --version
https://i-blog.csdnimg.cn/direct/8f02214b43c0403697ed0d543b5aa066.png
参考文档:
链接: pytest文档
3.新建工程

1.新建工程

这里我们使用编译器pycharm直接新建一个工程
https://i-blog.csdnimg.cn/direct/587009ef35d54c0f8fac47395f0fa1f1.png
这个工程用的虚拟情况,这里我们为这个工程再安装一次pytest
https://i-blog.csdnimg.cn/direct/193a3425169248a89ca1605c77501f42.png
当然,要是盼望系统装的依赖可以使用,或者其他项目可以共用依赖,可以将这两个选项勾选上,就不用再额外安装了
https://i-blog.csdnimg.cn/direct/b67571d89ec34b369ddc9fcc053dc061.png
这里我们先先容下pytest的文件、类、方法的命名规范(当然也可以有其他的规则,这个我们背面再说,我们这里只界说一个规则)
1 pytest的测试类文件,文件名小写,且必须以test_开头,多个单词以_连接
2 测试类名必须以Test开头,大驼峰格式
3 测试方法名必须以test_开头,多个单词以_连接,全小写
上述都是针对测试方法和测试类,普通的方法类不要包含test字样,其它规则保持划一即可
2.新建测试类

https://i-blog.csdnimg.cn/direct/b07b9bfdff4648d286d66ceac691e8ee.png
如图所示,我们这边新建一个文件test_app1.py,文件中新建了一个测试类TestA,类中创建了4个方法,此中test开头的两个方法是有默认实行按键(向右的三角)的。这就是我们上面说的文件、类、函数的命名规则
3.运行方式

1.主函数运行

我们直接点击下方的主函数运行当前测试文件中的测试方法
https://i-blog.csdnimg.cn/direct/97668b7901de45f5ab09e2a13ad66f37.png
可以看到这边实行了两个测试方法
2.命令行运行

我们在下方命令行中输入
pytest 文件名
https://i-blog.csdnimg.cn/direct/f6f668487c734beb9395893619b82869.png
可以看到这里也体现有两个用例通过,但是注意这里是没有print信息打印的哦,我们在pytest后加-s即可打印print信息
https://i-blog.csdnimg.cn/direct/65077a680c7d4827a3812a70e4be6f4f.png
3.使用pytest.ini设置文件运行

pytest.ini文件是整个工程的设置文件,通常创建在工程的根目次下,里面的设置我们在实行工程时会主动调用。
这里我们先先容下pytest.ini的常用设置:
参数作用用于标志这个文件是pytest的设置文件addopts命令行参数,多个参数用空格隔断,例如上面的-s就可以加在这个参数背面testpaths实行用例的范围,如果工程中有多个目次,可以在这里设置python_files改变默认的文件搜索规则,这里指的就是以test开头的文件名python_classes改变默认的类名搜索规则,这里指的就是以Test开头的类名python_functions改变默认的方法名搜索规则,这里指的就是以test开头的方法名markers用例标志;当用例较多时,可用这个参数分类标志用例,实行时可按标志实行相应的用例 https://i-blog.csdnimg.cn/direct/ad9999cb9b144fbfba9078cee0168c1e.png
这里我们在pytest.ini中设置了实行参数-s,然后我们在命令行中直接实行pytest,它会主动带参数实行主动化工程(主函数和命令行实行都会默认带pytest.ini下设置的参数),这里我们没有设置python_files,python_classes,python_functions参数,但是它还是实行了这两个方法,说明它是按照默认规则来实行的。
这里我们也可以修改规则来是适配我们特别的规则
例如:
我们修改下文件方法的搜索适配规则
https://i-blog.csdnimg.cn/direct/83abf6b72859445a989a75ed372d8422.png
然后我们新建一个文件
https://i-blog.csdnimg.cn/direct/56a99afd079647fb917536ed96e2e42e.png
直接输入pytest,检察实行结果,可以看到只实行了两个符合规则的用例
https://i-blog.csdnimg.cn/direct/0934040984794c9da3b1f3915c4a3ab1.png
然后我们再参加testpaths这个参数
https://i-blog.csdnimg.cn/direct/d34942273b6c4a9891dc1cd6ab640766.png
可以看到实行的下面这个文件夹中的用例
https://i-blog.csdnimg.cn/direct/87c196afae2b43d483df25e150df0c2d.png
我们虽然可以修改用例的匹配规则,但建议不修改。修改后不一定所有人都能完全按照新规则编写,而且有时间新规则和默认规则会有辩论,不会完全修改默认规则(这里面还是有点坑的,慎踩),所以不建议修改。
然后我们再增补一点命令行实行参数,即加在addopts参数后的
具体可参考这篇文档
https://docs.pytest.org/en/stable/reference/reference.html#command-line-flags
4.流程控制

1.类中界说的setup和teardown方法

和多数主动化测试框架一样,pytest也支持在类中增加setup和teardown方法,直接上个例子
https://i-blog.csdnimg.cn/direct/6b8ed4258f6b41ee961701f42e1e496d.png
在类中我添加了方法和类的setup和teardown方法
这里可以看到其实行序次为
   2.用fixture来实现前后置操纵

我们先先容下装饰器@pytest.fixture()
其函数名为:
def fixture(
    fixture_function: FixtureFunction | None = None,
    *,
    scope: _ScopeName | Callable[, _ScopeName] = "function",
    params: Iterable | None = None,
    autouse: bool = False,
    ids: Sequence | Callable[, object | None] | None = None,
    name: str | None = None,
)
此中我们主要关注的参数为:
参数作用scope作用域,Literal[‘session’, ‘package’, ‘module’, ‘class’, ‘function’]params方法入参,用例可从这个参数里取到入参autouse是否主动见效ids可和上方的params共同使用。作为每个参数的标识name用于对fixture函数的重命名 下面我们先容各个参数的具体用法
1.scope

scope为该方法的作用范围
取值说明function函数级,即每个用例前后都会调用class类级,每个类前后都会调用module模块级,每个py文件前后都会调用package包级,每个模块包前后会调用session会话级,即实行主动化工程前后会调用 这里我们举两个例子:
1、我们scope取值为function,可以看到每个用例前都实行了一次
https://i-blog.csdnimg.cn/direct/f924aebe17aa44f4b2ad1eaf8dc2cec0.png2、我们scope取值为class,可以看到每个类前都实行了一次,注意:这里有两个方法是不在类下面的,这两个方法之前也实行了fixture方法,说明类外的用例方法前都是实行scope作用域为class的fixture
https://i-blog.csdnimg.cn/direct/1c2cefb9309d4b4b934cac54b1b66540.png
3、接下来我们讲一下module、package和class级的,要注意这几个都是会在多个文件前后实行的。上面我们先容的fixture方法是写在一个py文件中的,在实行时不会作用到其他py文件中去,哪怕scope取值为function和class也一样,我们有时间在每个用例或每个类前后都要实行公共操纵,这样每个文件里写一个方法,显然很不方便。这里引入一个文件:
conftest.py

如果我们盼望多个py文件可以共享fixture方法,可以将fixture方法放在conftest.py文件中,这样工程中所有的文件都会共享到这些fixture方法
https://i-blog.csdnimg.cn/direct/e4d74ab9d30e4fdb9c4a66cfde08b919.png
这里可以看到两个py文件都使用了这些方法
https://i-blog.csdnimg.cn/direct/243bd43d0d3b4d07a612dc7ade5b6d72.png
当然,除了工程根目次下可以建conftest.py文件,其他目次或者包下也可以存放conftest.py,但是要注意作用域范围,一样寻常实行的优先级为(根目次>二级目次>三级目次…)
这里有两点要注意:
1.conftest.py文件名不能写错,写错无法找到fixture方法
2.fixture方法名不能一样,否则会辩论,只实行一个
4.这里我们再讲一下scope为session的
https://i-blog.csdnimg.cn/direct/d635b0f53d3445f981789b9e266a3aba.png
这里我们看到只在整个工程实行之前实行了一次,平常我们自己实行工程也就会实行一次,比如像一些登录或初始化的动作可以写在这个方法里;但是我们大批量实行主动化时,大概主动化工程分散在多个实行机或多个批次实行时,那这个方法就会实行多次,即每次输入实行pytest时,实行一次session方法
2.autouse

默认值为False,即默认不实行,如果设置为True,则默认调用
可以看到上面举scope的例子的时间,autouse都是赋值的True,这样它就会默认在每个类/方法前主动调用了。
我们不赋值时,就是默认不调用了,如果我们某些方法必要调用呢,可以手动调用;手动调用则直接在用例方法中传入fixture方法名即可(这里为了方便截图,我还是把fixture方法写在同一个py文件中)
https://i-blog.csdnimg.cn/direct/6f62d07c31a84e739eb97c0fb7c38566.png
可以看到,这里只有test_2方法前实行了fixture方法。
如果这里的作用域是class呢,同一个class中多次手动调用fixture方法,它只会在第一次调用时实行
https://i-blog.csdnimg.cn/direct/66d861fd064143a49c41822e1a750e85.png
到这里,我们只先容了如何实行前置步骤,如果我们必要后置步骤,或者前置步骤中必要传值出来呢
要想传值出来,我们有两种方法
1.关键字return

https://i-blog.csdnimg.cn/direct/99a900e46d6a42188f2a32375c8b44fd.png
可以看到我们调用函数名即可获取其返回值
此外,fixture函数可以多层调用,如果我们有两个fixture方法,第二个方法调用第一个方法
https://i-blog.csdnimg.cn/direct/2259dfe867054ac590c28e68481ed128.png
可以看到,第二个方法调用了第一个方法,test_2用例方法又调用了第二个方法,其先实行的是第一个fixture方法,即先实行最内层被调用的方法,一层一层向外实行,如果必要用到这种场景,可以参考
2.关键字yield

yield关键字可以用来返回值和操纵后置步骤,yield后跟返回值,yield下面则跟后置步骤
https://i-blog.csdnimg.cn/direct/60d170dbaee141218935bdd302e2e50a.png
可以看到,我们这里的fixture作用域是class,且是主动调用的,所以在test_1那里就调用了前置步骤,test_2处调用了其返回值,test_3后即整个class后调用了后置步骤
3.params和ids

params可以向fixture中传入参数,而且可以与ids一起使用,作为每个参数的标识。
fixture将params列表中传入的每一组值都会实行一遍,与此对应的testcase也都会实行多遍,具体调用如下,用request关键字来承接入参,并使用request.param来获取入参
https://i-blog.csdnimg.cn/direct/548f28a7d9944065a134bd1b206c99fc.png
https://i-blog.csdnimg.cn/direct/7303855df83e49ddbae681a6fea75f6c.png
可以看到test_2方法实行了3次,每次都输出了从fixture方法中获取的值,而且可以看到我这边params中传入的值不是一个类型的,所以params整个是一个大数组,具体每个数组位是什么类型的值都不影响,且类型不一样也可以。
这时间我们可以再加个ids
https://i-blog.csdnimg.cn/direct/9224ad1b77144e9183dbd278cf24c5a2.png
可以看到这里就体现ids了,我们背面集成allure体现陈诉时也会用到(现实使用看个人必要了,一样寻常场景下可不用)
4.name

fixture方法的重命名,一样寻常我们调用fixture方法时,直接写其方法名即可,如果使用了name参数,则调用时只能使用name后赋值的新函数名,使用原函数名会报错
这里我们重命名一下fixture函数,但是调用时还调用原函数名,就报错找不到这个函数
https://i-blog.csdnimg.cn/direct/abf58c30956749f0a0e989360f1cf227.png
我们调用重命名的setup,即可调用成功
https://i-blog.csdnimg.cn/direct/a13e04bf96ba431fa3f2af61f2e6bd45.png
综上所述:fixture方法用得比较多的就是scope和autouse两个参数,其他几个参数请根据各自场景选用。
注:本文纯手打,有疏漏之处可留言指出。后续会继续更新主动化工程的其他部门。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【python主动化一】pytest的底子使用