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

取值 范围 说明
function 函数级 每一个函数或方法都会调用
class 函数级 模块级 每一个.py文件调用一次
module 模块级 每一个.py文件调用一次
session 会话级 每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法

作用范围举例:

scope = “function”
语法:

@pytest.fixture()
#或者
@pytest.fixture(scope='function')

场景一:做为参数传入

import pytest
# fixture函数(类中) 作为多个参数传入
@pytest.fixture()
def login():
    print("打开浏览器")
    a = "account"
    return a

@pytest.fixture()
def logout():
    print("关闭浏览器")

class TestLogin:
    #传入lonin fixture
    def test_001(self, login):
        print("001传入了loging fixture")
        assert login == "account"

    #传入logout fixture
    def test_002(self, logout):
        print("002传入了logout fixture")

    def test_003(self, login, logout):
        print("003传入了两个fixture")

    def test_004(self):
        print("004未传入仍何fixture哦")

if __name__ == '__main__':
    pytest.main()

运行结果:

从运行结果可以看出,fixture做为参数传入时,会在执行函数之前执行该fixture函数。再将值传入测试函数做为参数使用,这个场景多用于登录

场景二、Fixture的相互调用
代码:

import pytest
# fixtrue作为参数,互相调用传入
@pytest.fixture()
def account():
    a = "account"
    print("第一层fixture")
    return a

#Fixture的相互调用一定是要在测试类里调用这层fixture才会生次,普通函数单独调用是不生效的
@pytest.fixture()
def login(account):
    print("第二层fixture")

class TestLogin:
    def test_1(self, login):
        print("直接使用第二层fixture,返回值为{}".format(login))

    def test_2(self, account):
        print("只调用account fixture,返回值为{}".format(account))
if __name__ == '__main__':
    pytest.main()

运行结果:

注:

1.即使fixture之间支持相互调用,但普通函数直接使用fixture是不支持的,一定是在测试函数内调用才会逐级调用生效
2.有多层fixture调用时,最先执行的是最后一层fixture,而不是先执行传入测试函数的fixture
3.上层fixture的值不会自动return,这里就类似函数相互调用一样的逻辑

scope = “class”:

**当测试类内的每一个测试方法都调用了fixture,fixture只在该class下所有测试用例执行前执行一次

**测试类下面只有一些测试方法使用了fixture函数名,这样的话,fixture只在该class下第一个使用fixture函数的测试用例位置开始算,后面所有的测试用例执行前只执行一次。而该位置之前的测试用例就不管。
语法

@pytest.fixture(scope='class')

场景一、

import pytest
# fixture作用域 scope = 'class'
@pytest.fixture(scope='class')
def login():
    print("scope为class")

class TestLogin:
    def test_1(self, login):
        print("用例1")

    def test_2(self, login):
        print("用例2")

    def test_3(self, login):
        print("用例3")
if __name__ == '__main__':
    pytest.main()

运行结果:

场景二、

import pytest
@pytest.fixture(scope='class')
def login():
    a = '123'
    print("输入账号密码登陆")

class TestLogin:
    def test_1(self):
        print("用例1")

    def test_2(self, login):
        print("用例2")

    def test_3(self, login):
        print("用例3")

    def test_4(self):
        print("用例4")

if __name__ == '__main__':
    pytest.main()

运行结果:

scope = “module”:与class相同,只从.py文件开始引用fixture的位置生效

import pytest
# fixture scope = 'module'
@pytest.fixture(scope='module')
def login():
    print("fixture范围为module")

def test_01():
    print("用例01")

def test_02(login):
    print("用例02")

class TestLogin():
    def test_1(self):
        print("用例1")

    def test_2(self):
        print("用例2")

    def test_3(self):
        print("用例3")

if __name__ == '__main__':
    pytest.main()

运行结果:

scope = “session”:用法将在conftest.py文章内详细介绍
session的作用范围是针对.py级别的,module是对当前.py生效,seesion是对多个.py文件生效
session只作用于一个.py文件时,作用相当于module
所以session多数与contest.py文件一起使用,做为全局Fixture
2、params:

Fixture的可选形参列表,支持列表传入
默认None,每个param的值
fixture都会去调用执行一次,类似for循环

可与参数ids一起使用,作为每个参数的标识,详见ids
被Fixture装饰的函数要调用是采用:Request.param(固定写法,如下图)
举个栗子:

3、ids:

用例标识ID
与params配合使用,一对一关系

举个栗子:
未配置ids之前,用例:

配置了IDS后:

4、autouse:
默认False
若为True,刚每个测试函数都会自动调用该fixture,无需传入fixture函数名

由此我们可以总结出调用fixture的三种方式:
  1.函数或类里面方法直接传fixture的函数参数名称
  2.使用装饰器@pytest.mark.usefixtures()修饰
  3.autouse=True自动调用,无需传仍何参数,作用范围跟着scope走(谨慎使用)
让我们来看一下,当autouse=ture的效果:

5、Name:

fixture的重命名
通常来说使用 fixture 的测试函数会将 fixture 的函数名作为参数传递,但是 pytest 也允许将fixture重命名
如果使用了name,那只能将name传如,函数名不再生效
调用方法:@pytest.mark.usefixtures(‘fixture1’,‘fixture2’)
举栗:

import pytest
@pytest.fixture(name="new_fixture")
def test_name():
    pass

#使用name参数后,传入重命名函数,执行成功
def test_1(new_fixture):
    print("使用name参数后,传入重命名函数,执行成功")

#使用name参数后,仍传入函数名称,会失败
def test_2(test_name):
    print("使用name参数后,仍传入函数名称,会失败")

运行结果:

到此这篇关于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函数使用

    目录 前言 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的详细使用教程

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

  • pytest中的fixture基本用法

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

  • 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及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

  • Jquery的autocomplete插件用法及参数讲解

    var emails = [ { name: "Peter Pan", to: "peter@pan.de" }, { name: "Molly", to: "molly@yahoo.com" }, { name: "Forneria Marconi", to: "live@japan.jp" }, { name: "Master <em>Sync</em&g

  • pytest接口测试之fixture传参数request的使用

    目录 前言 一.函数传参 request参数 request传两个参数 前言 有的测试用例,需要依赖于某些特定的case才可以执行,比如登录获取到token,后面的请求都需要带着,为了确保在同一用户,必须带着和登录时获取的cookies. 大部分的用例都会先登录,就需要把登录单独抽出来写个函数,其他用例全部调用这个登录函数就行,但是登录的账号不能写死. 一.函数传参 单独写个登录函数,传2个参数user和password,写用例的时候调用登录函数,输入几组user.password参数化.需要用

  • python pytest进阶之fixture详解

    前言 学pytest就不得不说fixture,fixture是pytest的精髓所在,就像unittest中的setup和teardown一样,如果不学fixture那么使用pytest和使用unittest是没什么区别的(个人理解). fixture用途 1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现 2.测试用例的前置条件可以使用fixture实现 3.支持经典的xunit fixture ,像unittest使用的setup和te

  • pytest conftest.py文件的使用讲解

    一.conftest.py的特点 1.可以跨.py文件调用,有多个.py文件调用时,可让conftest.py只调用了一次fixture,或调用多次fixture 2.conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件 3.不需要import导入 conftest.py,pytest用例会自动识别该文件,放到项目的根目录下就可以全局目录调用了,如果放到某个package下,那就在该package内有效,可有多个conftest.py 4.conftest

  • pytest进阶教程之fixture函数详解

    fixture函数存在意义 与python自带的unitest测试框架中的setup.teardown类似,pytest提供了fixture函数用以在测试执行前和执行后进行必要的准备和清理工作.但是相对来说又比setup.teardown好用. firture相对于setup和teardown的优势 命名方式灵活,不局限于setup和teardown这几个命名 conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置 scope="module" 可以实现

  • pytest框架之fixture详细使用详解

    本人之前写了一套基于unnitest框架的UI自动化框架,但是发现了pytest框架之后觉得unnitest太low,现在重头开始学pytest框架,一边学习一边记录,和大家分享,话不多说,那就先从pytest框架的精髓fixture说起吧! 简介: fixture区别于unnitest的传统单元测试(setup/teardown)有显著改进: 1.有独立的命名,并通过声明它们从测试函数.模块.类或整个项目中的使用来激活. 2.按模块化的方式实现,每个fixture都可以互相调用. 3.fixt

随机推荐