关于自动化测试框架pytest的Fixture固件

什么是固件

Fixture 翻译成中文即是固件的意思。它其实就是一些函数,会在执行测试方法/测试函数之前(或之后)加载运行它们,常见的如接口用例在请求接口前数据库的初始连接,和请求之后关闭数据库的操作。

我们之前在APP UI自动化系列中已经介绍过 unittest 的相关测试固件,如setupteardown等。而 pytest 中提供了功能更加丰富的Fixture,用于实现setupteardown功能。

定义方式

使用@pytest.fixture()进行定义,简单示例如下:

1

2

3

4

5

import pytest

  

@pytest.fixture()

def before():

    print("连接数据库")

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

调用方式

调用单个fixture函数

  • 方式一,使用fixture函数名作为参数

1

2

3

4

5

6

7

8

9

10

import pytest

  

@pytest.fixture()

def before():

    print("连接数据库")

  

  

# 调用before

def test_01(before):

    print("执行test_01")

  • 方式二,使用 @pytest.mark.usefixtures('fixture函数名')装饰器

1

2

3

4

5

6

7

8

9

10

import pytest

  

@pytest.fixture()

def before():

    print("连接数据库")

  

# 调用before

@pytest.mark.usefixtures('before')

def test_01():

    print("执行test_01")

  • 方式三,使用autouse参数自动执行fixture函数

1

2

3

4

5

6

7

8

9

10

11

import pytest

  

# fixture函数定义的时候使用autouse参数,作用域范围内的测试用例会自动调用该fixture函数

@pytest.fixture(autouse=True)

def before():

    print("连接数据库")

  

     

# 自动调用before

def test_01():

    print("执行test_01")

三种方式调用后的结果都如下:

我们可以看到,先执行了fixture函数,再执行测试函数。

调用多个fixture函数

1

2

3

4

5

6

7

8

9

10

11

12

13

import pytest

  

@pytest.fixture()

def before():

    print("连接数据库")

  

@pytest.fixture()

def before_s():

    print("初始化数据")

  

  

def test_01(before, before_s):

    print("执行test_01")

调用多个 fixture 函数时,由前至后依次执行,所以test_01()调用时先执行before,再执行before_s

对fixture函数重命名

定义fixture函数时,可以利用name参数进行重命名,方便用于调用,示例如下:

1

2

3

4

5

6

7

8

9

import pytest

  

@pytest.fixture(name='db')

def connect_order_db():

    print("连接数据库")

  

  

def test_01(db):

    print("执行test_01")

使用fixture传递测试数据

在执行完fixture函数后,有时需要将该fixture中得到到某些数据传递给测试函数/测试方法,用于后续的执行。

fixture中提供普通传递和参数化传递两种数据传递方式。

普通传递

示例如下:

1

2

3

4

5

6

7

8

9

10

11

import pytest

  

@pytest.fixture()

def before():

    print("连接数据库")

    return "连接成功!"

  

  

def test_01(before):

    print("执行test_01")

    assert before == "连接成功!"

注意,如果自定义的fixture函数有返回值,需要使用上面说的方式一调用才能获取fixture函数的返回值并传入测试函数中,方式二就无法获取返回值。

参数化传递

fixture函数进行参数化时,需要使用参数params,并且需要传入参数request,简单示例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import pytest

  

test_params = [1, 2, 0]

@pytest.fixture(params=test_params)

def before(request):

    result = request.param

    return result

  

def test_02(before):

    print("执行test_02")

    assert before

  

  

if __name__ == '__main__':

    pytest.main()

执行结果:

可以看到,因为所调用的fixture函数进行了参数化,虽然只有一个测试函数但执行了3次。

conftest.py

上面我们举的例子都是把fixture函数放在测试用例模块里面,但如果很多测试模块需要引用同一个fixture函数怎么办,这是时候就需要把它放在命名为conftest的模块里,这样同级或以下目录中的测试用例便能调用这些自定义的fixture函数。

例如,有如下目录:

1

2

3

4

5

6

7

8

├─testcase

│  │

│  ├─test_module_01

│  │      test_case_1.py

│  │      test_case_2.py

│  │

│  ├─test_module_02

│  │      test_case_3.py

test_module_01 中的test_case_1.pytest_case_2.py都需要调用同一个 fixture 函数,那么我们只需要在 test_module_01 中新建conftest.py并编写这个fixture函数即可,示例如下:

1

2

3

4

5

6

7

8

9

├─testcase

│  │

│  ├─test_module_01

│  │      conftest.py

│  │      test_case_1.py

│  │      test_case_2.py

│  │

│  ├─test_module_02

│  │      test_case_3.py

conftest.py:

1

2

3

4

5

import pytest

  

@pytest.fixture(autouse=True)

def before():

    print("连接数据库")

test_case_1.py

1

2

def test_01():

    print("执行test_01")

test_case_2.py

1

2

def test_02():

    print("执行test_02")

这样,执行这两个模块的测试用例时会自动先去调用conftest.py中的before()函数。

假设 test_module_02 中的 test_case_3.py 也需要调用这个before()函数,那么这个时候我们就需要在上一层即 testcase 中新建conftest.py并编写这个before()函数,才能在 test_case_3.py 中调用,如下:

1

2

3

4

5

6

7

8

9

10

├─testcase

│  │  conftest.py

│  │

│  ├─test_module_01

│  │      conftest.py

│  │      test_case_1.py

│  │      test_case_2.py

│  │

│  ├─test_module_02

│  │      test_case_3.py

conftest.py只作用于同级以下目录中的测试模块,且需要注意,当以下层级中存在了另一个conftest.py,那么以下层级将由另一个conftest.py文件接管。

作用域

pytest 的 fixture 作用域分sessionmoduleclassfunction四个级别。在定义 fixture 函数的时候通过scope参数指定作用范围,默认为function

  • session,每次会话执行一次
  • module,每个测试模块执行一次
  • class,每个测试类执行一次
  • function,每个测试方法执行一次

注意,对于单独定义的测试函数,class、function 都会起作用,可以从下列示例中看出来。

测试目录结构如下:

1

2

3

4

5

6

7

8

9

10

├─apiAutoTest

│  │  run.py

│  │

│  ├─testcase

│  │  │  conftest.py

│  │  │

│  │  ├─test_module_02

│  │  │  │  conftest.py

│  │  │  │  test_case_3.py

│  │  │  │  test_case_4.py

其中conftest.py代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

import pytest

  

@pytest.fixture(scope="session", autouse=True)

def session_fixture():

    print("这是一个作用于session的fixture")

  

@pytest.fixture(scope="module", autouse=True)

def module_fixture():

    print("这是一个作用于module的fixture")

  

@pytest.fixture(scope="class", autouse=True)

def class_fixture():

    print("这是一个作用于class的fixture")

  

@pytest.fixture(scope="function", autouse=True)

def function_fixture():

    print("这是一个作用于function的fixture")

test_case_3.py代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

import pytest

  

class TestOrder:

  

    def test_a(self):

        print("test_a")

         

    def test_b(self):

        print("test_b")

  

def test_c():

    print("test_c")

test_case_4.py代码如下:

1

2

def test_e():

    print("test_e")

run.py代码如下:

1

2

3

4

import pytest

  

if __name__ == '__main__':

    pytest.main(["-s"])

运行run.py,结果如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

collected 4 items

  

testcase\test_module_02\test_case_3.py

这是一个作用于session的fixture

这是一个作用于module的fixture

这是一个作用于class的fixture

这是一个作用于function的fixture

test_a

.这是一个作用于function的fixture

test_b

.这是一个作用于class的fixture

这是一个作用于function的fixture

test_c

.

testcase\test_module_02\test_case_4.py

这是一个作用于module的fixture

这是一个作用于class的fixture

这是一个作用于function的fixture

test_e

.

  

============================== 4 passed in 0.04s ==============================

从结果可以看出来:

  • 作用于session的fixture函数只在所有测试用例执行之前调用了一次
  • 作用于module的fixture函数在每个测试模块执行之前调用了一次
  • 作用于class的fixture函数在每个测试类执行之前调用了一次
  • 作用于function的fixture函数在每个测试方法/测试函数执行之前调用了一次

注意,在定义的测试函数(如test_c()test_e())执行之前也会调用scope=class的fixture函数。

总结

与 unittest 框架比较,pytest 中的Fixture更加丰富,可扩展性更高。Fixture还有很多更加优雅的用法用于自动化测试项目中,本文只是以最简单的示例进行说明。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/195857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hana Studio打开BW失败

Hana Studio打开BW失败 JCo initialization failed with java.lang.UnsatisfiedLinkError: D:\ycy\BW培训\HANA\configuration\org.eclipse.osgi\357\0.cp\lib\sapjco3.dll: Can’t find dependent libraries 这个提示应该是VC版本问题,按如下链接中的地址下载安装…

使用SD-WAN新方式,解锁分公司访问总部私有云

某企业是一家跨地区运营的大型企业,总部位于上海,拥有多个分公司遍布全国。其中北京分公司作为该企业在北方地区的重要分支机构,负责着该地区的市场开拓和业务发展。 为了实现分公司与总部之间的有效沟通和信息共享,北京分公司使用…

Linux快速配置拨号

在Linux上进行ADSL拨号配置,通常需要使用pppoeconf命令进行设置。pppoeconf是一个用于配置pppoe连接的工具,它可以帮助用户快速设置pppoe连接并生成配置文件。下面是一个详细的步骤指南,以帮助您在Linux上进行ADSL拨号配置。 步骤1&#xff…

ToDesk优惠码来了,需要的不容错过

最近发现Todesk也有活动了,很多小伙伴不知道,除了中秋国庆双节,ToDesk另有专享优惠码,输入优惠码最高立减25元,即使是活动日也能折上折,不影响此优惠码的折扣力度! Todesk作为国内优良的远程控制…

Centos系列:Centos7下的DNS服务器部署(每一步图文结合超详细,适用于初学者)

Centos7下的DNS服务器部署(每一步图文结合超详细,适用于初学者) Centos7下的DNS服务器部署引言部署步骤实验环境DNS服务端:DNS客户端: 正向解析安装DNS(DNS服务端,客户端都要操作)修…

ubuntu 创建conda 环境失败 HTTP 000 CONNECTION FAILED

如有帮助点赞收藏关注! 如需转载,请注明出处! 现在内存分配好了,创建一个专门的conda环境处理文件,报错了,创建不成功! 什么情况,之前明明可以的。 百度吧。 参照一些博客修改了文档…

深入解析Linux内核网络-拥塞控制系列(一)

谈起网络拥塞控制,大家可能很熟悉八股文中的"加法增大“、”乘法减小“、”慢开始“、“拥塞避免”、“快重传”、“快恢复”等概念。没错,这是一种经典网络拥塞控制算法的基础理论,但在实际的实现时不同的拥塞控制算法,有很…

Redis事务管理

概述 事务的本质是一组命令的集合。一个事务中的所有命令都会按照命令的顺序去执行,而中间不会被其他命令加塞。 执行过程 UNWATCH:解除监控(退出事务的指令也会解除监控) 事务中异常的处理 命令语法错误: 针对语法错误,会导致整…

9、Qt使用随机验证码

一、新建项目 创建一个"Qt Widget Application"项目,基类选择“QMainWindow” 二、自定义CaptchaLabel类 右击项目名,选择"Add New...” C -> CClass,点击“Choose” 更改类名CaptchaLabel,添加基类QLabel&a…

HT7183 高功率异步升压转换器 中文资料

HT7183是一款高功率异步升压转换器,集成120mΩ功率开关管,为便携式系统提供G效的小尺寸处理方案。HT7183具有2.6V至5.5V输入电压范围,可为各类不同供电的应用提供支持。HT7183具备3A开关电流能力,并且能够提供高达16V的输出电压。…

C#/.NET/.NET Core优秀项目和框架2023年11月简报

前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(公众号每周至少推荐两个优秀的项目和框架当然节假日除外),公众号推文有项目和框架的介绍、功能特点以及部分截图等(打不开或者打开GitHub很慢的同学可以优先查看…

Python搭建代理IP池实现接口设置与整体调度

目录 前言 1. 搭建免费代理IP爬虫 2. 将获取到的代理IP存储到数据库中 3. 构建一个代理IP池 4. 实现调度器来调度代理IP池 5. 实现带有代理IP池的爬虫 总结 前言 在网络爬虫中,代理IP池是一个非常重要的组件。由于许多网站对单个IP的请求有限制,…

客户满意的黄金法则:10个让您一击即中的服务技巧!

在当今日益竞争激烈的商业世界中,提供出色的客户服务是保持企业成功的关键。无论您是一家大型公司、一家小型创业企业,还是个人品牌,客户服务都是建立持久关系、增加忠诚度和获取推荐的必备条件。 那么,如何做好客户服务呢&#x…

练习11-简单卷积器的设计

简单卷积器的设计 1,任务目的:2,明确设计任务2.1,目前这部分代码两个文件没找到,见第5、6节,待解决中。 ,卷积器的设计,RTL:con1.v4,前仿真和后仿真,测试信号…

JVM垃圾回收机制GC

一句话介绍GC: 自动释放不再使用的内存 一、判断对象是否能回收 思路一:引用计数 给这个对象里安排一个计数器, 每次有引用指向它, 就把计数器1, 每次引用被销毁,计数器-1,当计数器为0的时候…

文献速递 | CAR-T细胞助力增强前列腺癌肿瘤细胞抗肿瘤能力

前列腺癌是男性泌尿生殖系统最常见的恶性肿瘤,在全球,前列腺癌的发病率在男性所有恶性肿瘤中高居第2位,仅次于肺癌。免疫检查点分子转化生长因子受体II(TGFβRII)、T细胞免疫球蛋白和粘蛋白结构域3(TIM3&am…

【带讲解】同校不同命,差个代号差好多!

今天分享的是23年哈尔滨工程大学815的信号与系统试题及解析。同样是哈尔滨工程大学,信号部分810着实比815难了很多!但是815还有一门电路,压力也不小,两个代号各有利弊! 小马哥Tips: 本套试卷难度分析&…

通过流量分析,明确医院重要主机中毒详情

故障现象 医院系统内部发现有一台重要主机持续产生了大量的连接失败数,主机IP为192.xxx.xxx.37,持续时间从2023年11月23日20:00持续到2023年11月24日10:00,十点后管理人员发现并封禁了该IP地址。 分析目的 针对医院…

项目部署到线上服务器后,报 Redis error: ERR unknown command del 错误

查了很多资料,终于解决了,问题出在redis.conf里,该文件里被添加了新的命令如下: 在这几句命令前加 # 号注释掉,重启即可解决 另附上相关redis的命令: 停止Redis:systemctl stop redis启动Redis…

【算法刷题】Day11

文章目录 面试题 08.01. 三步问题题干:算法原理:1、状态表示2、状态转移方程3、初始化4、填表顺序5、返回值 代码: 209. 长度最小的子数组题干:算法原理:1、暴力枚举出所有的子数组的和2、利用单调性,使用“…