超详细的pytest教程(二)之前后置方法和fixture机制

news2024/11/16 15:52:05

前言

上一篇文章入门篇咱们介绍了pytest的基本使用,这一篇文章专门给大家讲解pytest中关于用例执行的前后置步骤处理,pytest中用例执行的前后置处理既可以通过测试夹具(fixtrue)来实现,也可以通过xunit 风格的前后置方法来实现。接下来我们一起看看如何具体使用。

一、xunit风格的前后置方法

1、函数用例的前后置方法

在模块中以函数形式定义用例,可以通过setup_function和teardown_function来定义函数用例的前后置方法,使用案例如下:

def setup_function(function):
    print("函数用例前置方法执行")

  
def teardown_function(function):
    print("函数用例后置方法执行")


def test_01():
    print('----用例方法01------')

运行结果:

C:\testcases>pytest -s
========================= test session starts =========================
platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0 
cachedir: .pytest_cache
rootdir: C:\testcases
plugins:  testreport-1.1.2
collected 1 item                                                      
test_demo.py
函数用例前置方法执行
----用例方法01------ .
函数用例后置方法执行
========================= 1 passed in 0.27s =========================

2、测试类中用例的前后置方法

  • 类级别的前后置方法
  • pytest中测试类级别的前后置方法setup_class和teardown_class,分别在测试类中的用例执行之前执行,和测试类中所有用例执行完毕之后执行,具体使用如下:
  • class TestDome: def test_01(self): print('----测试用例:test_01------') def test_02(self): print('----测试用例:test_02------') @classmethod def setup_class(cls): print("测试类前置方法---setup_class---") @classmethod def teardown_class(cls): print("测试类后置方法---teardown_class---")
  • 用例级别的前后置方法
  • pytest中测试类中用例级别的的前后置方法setup_method和teardown_method,分别在测试类中的用例执行之前执行,和测试类中所有用例执行完毕之后执行,具体使用如下:
  • class TestDome: def test_01(self): print('----测试用例:test_01------') def test_02(self): print('----测试用例:test_02------') @classmethod def setup_class(cls): print("测试类前置方法---setup_class---") @classmethod def teardown_class(cls): print("测试类后置方法---teardown_class---") def setup_method(function): print("测试用例前置方法---setup_method---") def teardown_method(function): print("测试用例后置方法---teardown_method---")

运行结果:

C:\testcases>pytest -s
==================== test session starts ====================
platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0
rootdir: C:\testcases
plugins:  testreport-1.1.2
collected 2 items                                                                                                                                 
test_demo.py 
测试类前置方法---setup_class---
测试用例前置方法---setup_method---
----测试用例:test_01------.
测试用例后置方法---teardown_method---
测试用例前置方法---setup_method---
----测试用例:test_02------.
测试用例后置方法---teardown_method---
测试类后置方法---teardown_class---

==================== 2 passed in 0.30s =======================

3、模块级别的前后置方法

pytest中还有setup_module和teardown_module这两个用来设置模块级别前后置方法的函数,定义在模块中,会在整个模块中所有的用例执行前和用例全部执行完毕之后会执行,具体使用如下:


class TestDome:

    def test_01(self):
        print('----测试用例:test_01------')


class TestDome2:

    def test_02(self):
        print('----测试用例:test_02------')
   
  
def setup_module(module):
    print("测试模块的前置方法---setup_module---")


def teardown_module(module):
    print("测试模块的前置方法---teardown_module---")

运行结果:

C:\testcases>pytest -s
====================== test session starts ====================== 
platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0
rootdir: C:\testcases
plugins:testreport-1.1.2
collected 2 items                                                                   
test_demo.py 测试模块的前置方法---setup_module---
----测试用例:test_01------
.----测试用例:test_02------
.测试模块的前置方法---teardown_module---
====================== 2 passed in 0.27s ====================== 

二、fixture机制

前面我们介绍了pytest中xunit风格的前后置方法,接下来我们来看一下pytest中功能更加强大的fixture机制(测试夹具)的使用。

1、测试夹具的级别和定义

测试夹具需要使用pytest.fixture这个装饰器来定义,pytest中的测试夹具有如下几个级别:用例级别、测试类级别、模块级别,包级别,会话级别。接下来我们一起来看看夹具定义语法。

夹具定义可以通过参数scope指定夹具的级别,如果不指定夹具级别,scope 默认值为function(用例级别)

用例级别:scope = function

测试类级:scope = class

模块级别:scope = module

包级别: scope = package

会话级别:scope = session

@pytest.fixture(scope='指定夹具的级别')
def work():
    # 前置执行脚本
    yield 
    # 后置执行脚本

测试夹具本质上是一个生成器函数,生产器函数在使用next进行迭代时,执行到yeild会返回数据,暂停执行,等待下一次进行迭代时才会继续执行,pytest夹具就是利用的生成器的机制,通过yeild在测试夹具将前后置代码分开执行。

注意点: 夹具只有在定义夹具的范围内才能使用。如果夹具是在类中定义的,则只能由该类内的测试用例使用。但是如果在模块的全局范围内定义的夹具,那么该模块中的每个测试用例,即使它是在一个类中定义的,都可以使用它。

知道了怎么定义夹具,那么接下来我们来看看如何使用夹具。

2、夹具的使用

测试夹具定义好之后,测试函数通过将它们声明为参数,来指定执行用例之前要执行的夹具。

当 pytest 开始运行测试时,它会查看该测试函数定义的形参,然后搜索与这些参数同名的测试夹具。一旦 pytest 找到它们,它就会运行这些夹具,接收它们返回的内容(如果有的话),并将这些返回内容作为参数传递给测试函数。

注意点:当我们使用夹具时,如果夹具的前置脚本执行完,有数据要传递用例,需要传递的数据写在yield后面即可,在使用夹具的用例或者方法中,可以通过定义的形参来获取yeild返回的数据(章节2.3中有使用案例介绍)

2.1、在用例中使用夹具

不管是函数形式定义的测试用例,还是测试类中方法的形式定义的用例,在使用的时候都是一样的,直接定义一个和要使用的夹具同名的形参即可。

import pytest

# 定义一个用例级别的夹具
@pytest.fixture
def my_fixture():
    print('------my_fixture---用例前置执行脚本--------')
    yield
    print('------my_fixture---用例后置执行脚本--------')

# 函数用例 指定测试夹具
def test_func__01(my_fixture):
    print("测试用例----test_func__01----")


class TestDome:
    # 函数用例 指定测试夹具
    def test_02(self, my_fixture):
        print('----测试用例:test_02------')
  
     # 函数用例 指定测试夹具
    def test_03(self):
        print('----测试用例:test_03------')

运行结果

C:\testcases>pytest -s
======================== test session starts ========================
platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0
rootdir: C:\testcases
plugins: testreport-1.1.2
collected 2 items  
test_demo.py 
------my_fixture---前置执行脚本--------
测试用例----test_func__01----.
------my_fixture---后置执行脚本--------
------my_fixture---前置执行脚本--------
----测试用例:test_02------.
------my_fixture---后置执行脚本--------
----测试用例:test_03------
======================== 2 passed in 0.27s ========================

上面test_func__01和test_02这两个用例在定义时指定了测试夹具,而test_03则没有指定执行的夹具,执行用例时库看到指定了夹具的用例,执行了对应的夹具。

2.2、测试类和模块指定夹具

上面我们通过给用例方法加形参来给单个测试用例指定测试夹具。如果一个测试类中有很多测试用例或者一个模块中有很多用例,都要指定同一个测试夹具,要我们则可以通过usefixtures给测试类或测试模块指定测试夹具。

给测试类中所有的用例指定夹具

# TestDome这个测试类的所有测试用例均执行my_fixture这个夹具
@pytest.mark.usefixtures('my_fixture这个夹具')
class TestDome:
    # 函数用例 指定测试夹具
    def test_02(self):
        print('----测试用例:test_01------')

    # 函数用例 指定测试夹具
    def test_03(self):
        print('----测试用例:test_02------')

使用pytestmark 在测试模块级别 指定模块所有用例执行的夹具

# test_demo.py

# 当前模块中所有的用例,均执行my_fixture这个测试夹具
pytestmark = pytest.mark.usefixtures('my_fixture')

# 函数用例 指定测试夹具
def test_func__01(my_fixture):
    print("测试用例————test_func__01——————")

  
class TestDome:
    # 函数用例 指定测试夹具
    def test_02(self):
        print('----测试用例:test_01------')

    # 函数用例 指定测试夹具
    def test_03(self):
        print('----测试用例:test_02------')

2.3、在夹具中引用夹具

pytest 的最大优势之一是其极其灵活的夹具系统。通过测试夹具我们可以将极为复杂化的前后置依赖,拆分为更简单单一功能的测试夹具,通过在夹具中引用其他的夹具,来组织不同用例所需的复杂依赖环境。接下来我们通过一个案例来给大家演示如何使用。

import pytest
# 用户注册的夹具
@pytest.fixture
def register_user():
    print('---用户注册的夹具前置执行----')
    # ...注册代码省略,注册的用户信息如下
    user_info = {'user': 'lemonban', 'pwd': '123456'}
    yield user_info
    print('---用户注册的夹具后置执行----')


# 用户登录的夹具,通过定义形参来使用register_user这个夹具
@pytest.fixture
def user_login(register_user):
    print('---用户登录的夹具前置执行----')
    # 获取register_user结局前置脚本执行完,yeild传递出来的数据
    user_info = register_user
    # ...登录代码省略,下面为登录得到的token
    token = 'sdjasjdask'
    yield token
    print('---用户登录的夹具后置执行----')

# 函数用例 指定使用测试夹具user_login
def test_func__01(user_login):
    token = user_login
    print("测试用例夹具user_login传递过来的token:",token)
    print("测试用例---test_func__01---")

运行结果

C:\testcases>pytest -s
======================== test session starts ========================
platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0
rootdir: C:\testcases
plugins: testreport-1.1.2
collected 1 item  
test_demo.py 
---用户注册的夹具前置执行----
夹具register_user传递过来的用户信息: {'user': 'lemonban', 'pwd': '123456'}
---用户登录的夹具前置执行----
测试用例夹具user_login传递过来的token: sdjasjdask
测试用例---test_func__01---.
---用户登录的夹具后置执行----
---用户注册的夹具后置执行----

2.4、自动使用夹具

在定义测试夹具 我们可以给夹具的装饰器加参数autouse=True来使夹具成为自动执行的夹具。具体案例如下:

import pytest


@pytest.fixture(autouse=True)
def my_fixture():
    print('------my_fixture---前置执行脚本--------')
    yield
    print('------my_fixture---后置执行脚本--------')


class TestDome:
    # 函数用例 指定测试夹具
    def test_02(self):
        print('----测试用例:test_01------')

    # 函数用例 指定测试夹具
    def test_03(self):
        print('----测试用例:test_02------')


class TestDome2:
    # 函数用例 指定测试夹具
    def test_03(self):
        print('----测试用例:test_03------')

执行结果:

C:\testcases>pytest -s
======================== test session starts ========================
platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0
rootdir: C:\testcases
plugins: testreport-1.1.2
collected 3 items    
test_demo.py
------my_fixture---前置执行脚本--------
----测试用例:test_01------.
------my_fixture---后置执行脚本--------
------my_fixture---前置执行脚本--------
----测试用例:test_02------.
------my_fixture---后置执行脚本--------
------my_fixture---前置执行脚本--------
----测试用例:test_03------.
------my_fixture---后置执行脚本--------
======================== 3 passed in 0.29s ========================

从上面的执行结果我们可以看到,每条用例执行之前都自动执行了测试夹具my_fixture

3、conftest.py

在一个项目的测试中,大多数情况下会有多个类、模块、或者包要使用相同的测试夹具。这种情况下如果我们把测试夹具定义在某一个模块中则无法实现共享,针对这种情况,我们可以把需要共享的测试夹具放入一个单独的conftest.py文件中 ,这样多个可以实现多个测试模块共享了

ps : pytest运行测试时,如果项目中有conftest.py,那么pytest会自动加载conftest.py模块中的内容,可以把conftest看出pytest会自动加载的插件模块,后续的教程中会涉及到在conftest.py中定义pytest的hooks函数

接下来我们来看一个conftest.py定义测试夹具的案例

在 conftest.py中定义测试夹具my_fixture

# conftest.py

import pytest

@pytest.fixture
def my_fixture():
    print('------my_fixture---前置执行脚本--------')
    yield
    print('------my_fixture---后置执行脚本--------')

在test_demo1.py的用例用使用conftest.py中定义的夹具

# test_demo1.py
class TestDome:
    # 函数用例 指定测试夹具
    def test_02(self,my_fixture):
        print('----测试用例:test_01------')

    # 函数用例 指定测试夹具
    def test_03(self,my_fixture):
        print('----测试用例:test_02------')

在test_demo2.py的用例用使用conftest.py中定义的夹具

# test_demo2.py
class TestDome2:
    # 函数用例 指定测试夹具
    def test_03(self,my_fixture):
        print('----测试用例:test_03------')

执行结果:

C:\testcases>pytest -s
======================== test session starts ========================
platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0
rootdir: C:\testcases
plugins: testreport-1.1.2
collected 3 items
test_demo.py 
------my_fixture---前置执行脚本--------
----测试用例:test_01------.
------my_fixture---后置执行脚本--------
------my_fixture---前置执行脚本--------
----测试用例:test_02------.
------my_fixture---后置执行脚本--------
test_demo2.py 
------my_fixture---前置执行脚本--------
----测试用例:test_03------.
------my_fixture---后置执行脚本--------
======================== 3 passed in 0.29s ========================

上述案例中我们可以发现 est_demo.py和est_demo2.py中的用例可以成功使用conftest.py中的测试用例。

下一篇我会给大家讲解pytest教程(三)用例篇


 

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

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

相关文章

Unity - 技术美术

198.Shader Graph 旗帜飘扬 官方教程链接:https://learn.unity.com/project/make-a-flag-move-with-shadergraph 本节课程文档:https://gitee.com/chutianshu1981/AwesomeUnityTutorial/blob/main/%E5%9B%BE%E5%BD%A2-%E6%8A%80%E6%9C%AF%E7%BE%8E%E5%B…

ElasticSearch入门到springboot使用

文章目录1.存储引擎产品性能对比2.es安装1.创建目录2.创建挂载的配置文件3.编写docker-compose4.添加文件夹权限5.启动es与kibana6.开放端口7.测试访问8.安装IK分词器3.es核心概念1.文档:就是一条数据2.类型:表字段和类型3.索引:就是数据库4.…

【WIN】Windows10 开启远程连接图形化界面(mstsc)

CONTENTwindows10 rdp 开启远程连接开启远程连接win10 专业版遇到的问题3389 端口不可用简述具体解决windows10 rdp 开启远程连接 开启远程连接 win10 专业版 快捷键: winI 打开设置,然后 #mermaid-svg-bTRFQYmaW8UwxJ5Y {font-family:"trebuche…

java计算机毕业设计ssm医疗垃圾管理系统f5aj8(附源码、数据库)

java计算机毕业设计ssm医疗垃圾管理系统f5aj8(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

针对低功率/低电源电压应用的5MBd数字光耦合器

针对低功率/低电源电压应用的5MBd数字光耦合器 介绍 电气系统中的数字光电耦合器提供高压绝缘和高压绝缘数据传输时的噪声抑制。一个高质量的绝缘屏障,在里面光耦合器需要提供卓越的可靠性和耐久性信号隔离。 除了绝缘和噪音抑制能力,新的5MBd数字光耦…

Image-Line升级FL Studio21水果DAW音乐工作站

FL Studio水果21加入了更快、更精确的音频编辑,改进了内容搜索,DAW“情绪主题”控制,甚至还有更多的灵感、创意工具。 如果你真正需要中文语言,你需要更新到FL Studio 21版本打开你的FL设置,在通用(Genera…

Wireshark | 猿如意

文章目录一、前言二、猿如意介绍客户端网页版三、Wireshark简介发展史使用猿如意下载功能介绍使用方法使用感受一、前言 我曾经有过这样的烦恼:去下载一个应用,结果百度到了一大堆广告,最后下载的也不是官方版本,还捆绑了一大堆AP…

SpringBoot中使用Easyexcel实现Excel导入导出功能(二)

目录 常规导出 大批量数据导出 复杂表头的导出 日期、数字、自定义格式转换后导出 常规导出 常规导出excel有两种,个人比较推荐第一种: 1、新建一个导出数据的实体类,用ExcelProperty()注解标明excel中列的中文名称;如果实体的…

maven学习手册

maven学习手册1.maven简介1.1 传统项目的弊端1.2 Maven是什么2.maven的安装和配置2.1 maven的安装2.2 为阿里云设置代理仓库2.3 maven常用命令简单说明3.maven实战3.1 一个简单的maven项目3.2 maven常用命令简单说明3.3 为这个简单的maven项目安装依赖3.4 maven常见标签说明4.依…

在搭载 M1 及 M2 芯片 MacBook 设备上玩 Stable Diffusion 模型

本篇文章,我们聊了如何使用搭载了 Apple Silicon 芯片(M1 和 M2 CPU)的 MacBook 设备上运行 Stable Diffusion 模型。 写在前面 在上一篇文章《使用 Docker 来快速上手中文 Stable Diffusion 模型:太乙》中,我们聊过…

传感器和变送器有什么区别?工业网关能用吗?

传感器和变送器在自动控制领域都有重要作用,但很容易混淆掉,两者有区别也有联系。 传感器是可以将感受到的信息转换成电信号或者其他信号,如将温度、压力、物料、气体等信息转换成电信号,从而使得这些数据可以网络中传输。 变送器…

软件测试必须知道的方法和知识

“软件测试技术是软件开发过程中的一个重要组成部分,是贯穿整个软件开发生命周期、对软件产品(包括阶段性产品)进行验证和确认的活动过程,其目的是尽快尽早地发现在软件产品中所存在的各种问题——与用户需求、预先定义的不一致性…

C++ 实现前缀树

一 、前缀树是什么 前缀树是一种查找结构,常用于指定字符串或是数组、线性表等连续信息的存储和查找。他的作用类似于哈希表,但是它相对于哈希表来说,限制更多,通用性较差,但是它的功能更加强大,可定制性也…

c#入门-字段类型访问权限低于字段本身

字段类型访问权限低于字段本身 现在假设你有一个小兵类,他的访问权限是仅限当前程序集。 internal class 小兵 {public int hp 12;public int atk 10;public int def 5; }然后声明一个兵营,用来创造小兵 public class 兵营 {public 小兵 模板;publ…

深度学习课件-实验1_PyTorch基本操作实验

文章目录一、Pytorch基本操作考察1.11.21.3二、动手实现 logistic 回归2.12.2三、动手实现softmax回归3.13.2一、Pytorch基本操作考察 使用 𝐓𝐞𝐧𝐬𝐨𝐫 初始化一个 𝟏𝟑 的矩阵 &a…

第五、六章

第五章程序控制结构 5.1switch分支结构 每一个分支结构最后要记得加break;表示退出。 import java.util.Scanner; public class Switch01 { //编写一个 main 方法 public static void main(String[] args) { /* 请编写一个程序,该程序可以接收一个字符&#xff0…

我逛遍各大论坛,分享这份大厂招聘总结:涵盖Java岗位95%+真题

我们程序员这一群体,大家都知道最好的涨薪方法是通过跳槽,在你把一个公司的精华都吸收完之后,有追求的肯定会跳去更好的公司发展自己,特别在金三银四,金九银十这样的招聘旺季里 ,会有很多需要准备的面试会有…

Snort入侵检测系统使用示例

1998年,Martin Roesch用C语言开发了开源的入侵检测系统Snort。现如今Snort已发展成为一个具有多平台、实时流量分析、网络IP数据包记录等特性的强大的网络入侵检测/防御系统,是世界最顶尖的开源入侵检测系统。Snort IDS利用一系列的规则去定义恶意网络活…

Qt-数据库开发-QDataWidgetMapper(5)

Qt-数据库开发-使用QDataWidgetMapper将数据库数据映射到小部件 文章目录Qt-数据库开发-使用QDataWidgetMapper将数据库数据映射到小部件1、概述2、实现效果3、主要代码4、完整源代码更多精彩内容👉个人内容分类汇总 👈👉数据库开发 &#x1…

MYSQL数据库-复合查询

MYSQL数据库-复合查询零、前言一、基本查询二、多表查询三、自连接四、子查询1、单行子查询2、多行子查询3、多列子查询3、在from子句中使用子查询五、合并查询1、union2、union all零、前言 本章主要讲解学习MYSQL数据库中的复合查询,前面我们讲解的mysql表的查询都…