pytest-fixture简介及其用法讲解

目录
  • 什么是fixture
  • 如何使用fixture
  • 使用fixture传递测试数据
  • 使用fixture来执行配置和销毁逻辑
  • fixture可以使用其他的fixture
  • fixture的参数介绍
  • params,fixture的参化
  • autouse,为常用的fixture添加autouse选项
  • name,为fixture重命名
  • PS:

什么是fixture

在一个测试过程中,fixture主要提供以下功能:

为测试提供上下文,比如环境变量,数据集(dataset),提供数据,数据和测试用例分开定义测试的步骤,主要用于setup和teardown
pytest中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源 fixture定义

使用装饰器 @pytest.fixture就表明这个函数是一个fixture
一个完整的fixture,定义如下:
@pytest.fixture(scope, params, autouse, ids, name)

如何使用fixture

最基本的用法就是一个fixture作为一个测试用例的参数传入,然后就可以在该测试用例中使用该fixture
当pytest执行一个测试用例时,就会检查参数,然后搜索是否有相同名字的fixture,如果有,就先执行这个fixture,得到fixture的返回值,然后将这个返回值作为参数传入到测试用例中

一个简单的fixture使用

import pytest

class Fruit():
    def __init__(self,name):
        self.name=name
        self.cubed=False

    def cube(self):
        self.cubed=True

class FruitSalad():
    def __init__(self,*fruit_bowl):
        self.fruit=fruit_bowl
        self._cube_fruit()

    def _cube_fruit(self):
        for fruit in self.fruit:
            fruit.cube()
@pytest.fixture()
def fruit_bowl():
    return [Fruit("apple"),Fruit("banana")]

def test_fruit_salad(fruit_bowl):
    fruit_salad=FruitSalad(*fruit_bowl)
    assert all(fruit.cubed for fruit in fruit_salad.fruit)

如果不使用fixture功能,代码需要这样写,这样就无法使用pytest来执行测试用例了

class Fruit():
    def __init__(self,name):
        self.name=name
        self.cubed=False

    def cube(self):
        self.cubed=True

class FruitSalad():
    def __init__(self,*fruit_bowl):
        self.fruit=fruit_bowl
        self._cube_fruit()

    def _cube_fruit(self):
        for fruit in self.fruit:
            fruit.cube()

def fruit_bowl():
    return [Fruit("apple"),Fruit("banana")]

def test_fruit_salad(fruit_bowl):
    fruit_salad=FruitSalad(*fruit_bowl)
    assert all(fruit.cubed for fruit in fruit_salad.fruit)

bowl = fruit_bowl()
test_fruit_salad(fruit_bowl=bowl)

使用fixture传递测试数据

fixture非常适合存放测试数据,并且它可以返回任何数据

import pytest

@pytest.fixture()
def a_tuple():
    return (1,'foo',None,{'bar':23})

def test_a_tuple(a_tuple):

    assert a_tuple[3]["bar"]==32

a_tuple作为一个fixture,主要是提供测试数据给test_a_tuple,执行test_a_tuple时,先查看函数的参数,有a_tuple,并且找到了这个函数,先执行a_tuple,得到数据(1,‘foo’,None,{‘bar’:23}),并将这个数据传入到测试用例test_a_tuple中,在测试用例中,就可以直接使用a_tuple来使用这个测试数据

使用fixture来执行配置和销毁逻辑

fixture的另一个功能就是结合yield来配置测试用例的setup和teardown逻辑

import pytest

@pytest.fixture()
def task_db():
    print("start to setup....")
    yield "a"
    print("start to teardown...")

def test_db(task_db):
    print(task_db)
    print("start to test")

运行结果:

start to setup....
a
start to test
start to teardown..

fixture函数会在测试函数之前运行,但如果fixture函数包含yield,那么系统会在yield处停止,转而运行测试函数,等测试函数执行完毕后再回到fixture,继续执行yield后面的代码,因此,可以将yield之前的代码视为配置过程(setup),将yield之后的代码视为清理过程(teardown),无论测试过程中发生了什么,yield之后的代码都会执行,yield可以返回值,也可以不返回

fixture可以使用其他的fixture

import pytest
@pytest.fixture()
def first_entry():
    return "a"

@pytest.fixture()
def order(first_entry):
    return [first_entry]

def test_order(order):
    order.append("b")
    assert order==["a","b"]

同时使用多个fixture

一个测试用例或者一个fixture可以同时使用多个fixture

import pytest

@pytest.fixture()
def first_entry():
    return "a"
@pytest.fixture()
def second_entry():
    return 2

@pytest.fixture()
def order(first_entry,second_entry):
    return [first_entry,second_entry]

@pytest.fixture()
def expect_list():
    return ["a",2,3.0]

def test_order(order,expect_list):
    order.append(3.0)
    assert order==expect_list

fixture的参数介绍

scope,指定fixture的作用范围

用于控制fixture执行的配置和销毁逻辑的频率
scope参数有四个值:function,class,module,session
默认值为function
function:函数级别的fixture每个测试函数只需要运行一次,
class:类级别的fixture每个测试类只运行一次
module:模块级别的fixture,每个模块只需要运行一次
session:绘画级别的fixture,每次会话只需要运行一次

params,fixture的参化

params是一个list,这个list是要传入fixture的参数,会引起多次调用,request.param可以获取每一个值

import pytest
@pytest.fixture(params=["a","b"])
def order(request):
    return request.param
def test_order(order):
    all_order="ab"
    assert order in all_order

运行结果:

collected 2 items

test_usefixture7.py::test_order[a] PASSED
test_usefixture7.py::test_order[b] PASSED

request是python的一个内置的fixture,代表fixture的调用状态,它有一个param字段,会被@pytest.fixture(params=[“a”,“b”])的params列表中的一个元素填充,如果params有多个值,就会多次调用requeat.param来多次执行测试用例

autouse,为常用的fixture添加autouse选项

对于常用的fixture,可以指定autouse=True,使作用域内的测试函数都自动运行该fixture

name,为fixture重命名

import pytest

@pytest.fixture(name="lue")
def a_b_c_d_e():
    return "a"
def test_order(lue):
    assert lue=="a"

import pytest

@pytest.fixture(name="lue")
def a_b_c_d_e():
    return "a"
def test_order(lue):
    assert lue=="a"

PS:

下面来说下pytest中的fixture参数解析以及用法

当我们在使用pytest实现前后置调用时有两种方式

方式一:

采用setup/teardown以及setup_class/teardown_class类似这种方式去实现前后置调用

方式二:

采用pytest中强大的fixture装饰器来实现

本期文章主要采用方式二来解决测试用例前后置调用的问题

首先我们来看下,pytest中的fixture的参数有哪些,分别是scope,params,autouse,ids,name这5个形参,哪些他们分别的作用域以及作用是什么呢?

下面来说下scope:

“”“
scope:
    function(默认)
    class
    module
    session
params:
    参数化,支持list,tuple,字典列表,字典元组
autouse:
    false(默认)
    True
ids:
    当使用params参数化时,给每一个值设置一个变量名,其实意义不大
name:
    表示的是被@pytest.fixture标记的方法取一个别名,注意:当去了别名之后,原来的名称无法使用
”“”
@pytest.fixture(scope='function')
def my_fixture():
    print('这是前置内容')
    yield
    print('这是后置内容')

class Testdemo():

    def test01(self,my_fixture):
        print('这是test01')

    def test02(self):
        print('这是test02')

根据上面的结构,运行后输出的内容为
这是前置内容
这是test01
这是后置内容
这是前置内容
这是test02
这是后置内容

对于上述方法中传入my_fixture的做法,主要是对比setup/teardown之类的更方便,不需要每个方法都在运行之前执行一边setup,而是在某个方法需要这种操作时在执行

到此这篇关于pytest-fixture及其用法的文章就介绍到这了,更多相关pytest fixture用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 分享Pytest fixture参数传递的几种方式

    目录 1.背景 2.fixture中参数传递的几种方式 1)fixture中的函数返回 2)与@pytest.mark.parametrize的结合 3)fixture中的方法嵌套传递 4)测试方法中产生数据后,直接调用teardown 1.背景 最近使用Pytest中的fixture和conftest时,遇到需要在conftest中的setup和teardown方法里传递参数.这里记录下几种实现的方式. 2.fixture中参数传递的几种方式 1)fixture中的函数返回 conftest.

  • Pytest框架之fixture的详细使用教程

    前言 前面一篇讲了setup.teardown可以实现在执行用例前或结束后加入一些操作,但这种都是针对整个脚本全局生效的 如果有以下场景:用例 1 需要先登录,用例 2 不需要登录,用例 3 需要先登录.很显然无法用 setup 和 teardown 来实现了fixture可以让我们自定义测试用例的前置条件 fixture优势 命名方式灵活,不局限于 setup 和teardown 这几个命名 conftest.py 配置里可以实现数据共享,不需要 import 就能自动找到fixture sc

  • Pytest Fixture参数讲解及使用

    Fixture参数详解及使用 Fixture的调用方式: @pytest.fixture(scope = "function",params=None,autouse=False,ids=None,name=None) 参数详解:1.SCOPE用于控制Fixture的作用范围作用类似于Pytest的setup/teardown默认取值为function(函数级别),控制范围的排序为:session > module > class > function 取值 范围 说

  • pytest中的fixture基本用法

    目录 简介: fixture的功能 特点及优势 基本用法 fixture在自动化中的应用--作用域 fixture在自动化中的应用-yield关键字 fixture在自动化中的应用--数据共享 fixture在自动化中的应用-自动应用 fixture在自动化中的应用-参数化 简介: fixture区别于unnitest的传统单元测试(setup/teardown)有显著改进: 1.有独立的命名,并通过声明它们从测试函数.模块.类或整个项目中的使用来激活. 2.按模块化的方式实现,每个fixtur

  • pytest中fixture函数使用

    目录 前言 fixture函数 fixture的使用 前言 setup和teardown能实现在测试用例执行之前或之后做一些操作,但是这种是整个测试脚本全局生效的: 如果我们想实现某些用例执行之前进行登录,某些用例执行之前不需要进行登录,这种场景我们再使用setup和teardown就无法实现了,这时候我们就需要用到fixture功能了. fixture函数 fixture(scope="function", params=None, autouse=False, ids=None,

  • pytest-fixture简介及其用法讲解

    目录 什么是fixture 如何使用fixture 使用fixture传递测试数据 使用fixture来执行配置和销毁逻辑 fixture可以使用其他的fixture fixture的参数介绍 params,fixture的参化 autouse,为常用的fixture添加autouse选项 name,为fixture重命名 PS: 什么是fixture 在一个测试过程中,fixture主要提供以下功能: 为测试提供上下文,比如环境变量,数据集(dataset),提供数据,数据和测试用例分开定义测

  • Pytest fixture及conftest相关详解

    目录 前言 一.Pytest fixture 1.pytest fixture几个关键特性 2.Pytest fixture定义 3.Pytest fixture用法 1)用法一:作为参数使用 2)用法二:提供灵活的类似setup和teardown功能 3)用法三:利用pytest.mark.usefixtures叠加调用多个fixture 4)用法四:fixture自动使用autouse=True 4.Pytest fixture四种作用域 1)function级别 2)class级别 3)m

  • Pytest 使用简介

    前言 最近在听极客时间的课程,里面的讲师极力推崇 pytest 框架,鄙视 unittest 框架,哈哈!然后查了些资料,发现了一条 python 鄙视链:pytest 鄙视 > unittest 鄙视 >robotframework . pytest 是 python 的第三方单元测试框架,比自带 unittest 更简洁和高效,支持315种以上的插件,同时兼容 unittest 框架.这就使得我们在 unittest 框架迁移到 pytest 框架的时候不需要重写代码.接下来我们在文中来对

  • 一文秒懂Java enum常见的用法讲解

    简介 枚举是Java1.5引入的新特性,通过关键字enum来定义枚举类.枚举类是一种特殊类,它和普通类一样可以使用构造器.定义成员变量和方法,也能实现一个或多个接口,但枚举类不能继承其他类. 一,常量定义 public enum WeekDay { SUN, MON, TUE, WED, THT, FRI, SAT } 二,swich public enum WeekDay { SUN, MON, TUE, WED, THT, FRI, SAT } public class SelectDay{

  • .NET中IoC框架Autofac用法讲解

    1 前置阅读 在阅读本文章之前,你可以先阅读: 什么是依赖注入 2 简介 Autofac与C#语言的结合非常紧密,并学习它非常的简单,也是.NET领域最为流行的IoC框架之一. 3 使用 首先,将Autofac的NuGet软件包安装到您的应用程序中. Autofac 然后,我们通过创建ContainerBuilder来注册组件. var builder = new ContainerBuilder(); builder.RegisterType<Knife>(); builder.Regist

  • Vue路由vue-router用法讲解

    目录 一.vue-router 1.简介 2.使用流程 二.基本路由实现 三.嵌套路由 四.缓存路由组件 1.为什么使用 2.如何使用 3.完整代码 五.传递参数 1.通过url传递(param传递) 2.通过query传递 3.通过param传递 六.$route 与 $router 的区别 1.$route 2.$router 3.跳转路由的三种形式 一.vue-router 1.简介 (1)SPA:Single Page Application(单页应用),简单理解就是只有一个web页面的

  • Pytest测试报告工具Allure用法介绍

    简介 Allure Framework是一种灵活的.轻量级.多语言测试报告工具. 不仅可以以简洁的网络报告形式非常简洁地显示已测试的内容, 而且还允许参与开发过程的每个人从日常执行中提取最大程度的有用信息和测试. 从开发/测试的角度来看: Allure报告可以快速查看到缺陷点,可以将测试未通过划分为Bug和中断的测试. 还可以配置日志,步骤,固件,附件,时间,历史记录,以及与TMS的集成和Bug跟踪系统,以便掌握所有信息. 从管理者的角度来看: Allure提供了一个清晰的全局,涵盖了所涵盖的功

  • linux 中vim的用法讲解

    Vim 是 Linux 系统上的最著名的文本/代码编辑器,也是早年的 Vi 编辑器的加强版,而 gVim 则是其 Windows 版.它的最大特色是完全使用键盘命令进行编辑,脱离了鼠标操作虽然使得入门变得困难,但上手之后键盘流的各种巧妙组合操作却能带来极为大幅的效率提升. vim的命令的一些格式 1:vim xxx 直接打开一个xxx命名的vim文件,如果没有的话直接创建一个新的.默认光标定义到第一行 2:vim + xxx 打开光标并定义到最后一行 3:vim +num xxx 打开光标定义到

  • JSON简介以及用法汇总

    JSON(JavaScript Object Notation)即JavaScript对象表示法,是一种轻量级的数据交换格式.它非常便于编程人员对数据的处理,也便于机器对数据的解析和生成,应用非常广泛. JSON是一种轻量级的数据交换格式,某个JSON格式的文件内部譬如可以长成这样: { "name": "hanzichi", "sex": "male" } 看起来都是key-value的键值对,很像js的对象吧?没错,但同时

随机推荐