返回顶部
首页 > 资讯 > 后端开发 > Python >pytest中fixture函数使用
  • 584
分享到

pytest中fixture函数使用

pytest fixture函数pytest fixture 2023-02-07 12:02:24 584人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言fixture函数fixture的使用前言 setup和teardown能实现在测试用例执行之前或之后做一些操作,但是这种是整个测试脚本全局生效的; 如果我们想实现某些用例执

前言

setup和teardown能实现在测试用例执行之前或之后做一些操作,但是这种是整个测试脚本全局生效的;

如果我们想实现某些用例执行之前进行登录,某些用例执行之前不需要进行登录,这种场景我们再使用setup和teardown就无法实现了,这时候我们就需要用到fixture功能了。

fixture函数

fixture(scope="function", params=None, autouse=False, ids=None, name=None)

参数说明:

1、scope:fixture函数的作用域;可选值:function(默认)、class、module、session

  • function:作用于每个方法或函数,每个方法或函数都运行一次
  • class:作用于整个class类,每个class中的所有test只运行一次
  • module:作用于整个模块,每个module中的所有test只运行一次
  • session:作用于整个session,整个session只运行一次(慎用)

2、params:列表类型;一个可选的参数列表;它将会多次调用被fixture标记的方法和所有用到这个fixture的test测试用例;默认为None;当前调用参数可以用 request.param 来获取。

3、autouse:如果为True,则为所有测试用例激活fixture,运行测试用例的时候会自动运行被fixture标记的方法;如果为False,则需要显示指定来激活fixture,不会自动运行。

4、ids:id字符串列表,与params相对应,因此它们也是测试的一部分。如果没有提供ids,那么将会从params来自动生成。

5、name:fixture的名称。默认为被fixture装饰器标记的函数名。

fixture的使用

1、通过参数引用fixture函数

举例:

# file_name:test_fixture.py
 
 
import pytest
 
 
class Test_A:
 
    @pytest.fixture()
    def before(self):
        print("\n--------before fixture has ran--------")
 
    def test_a(self, before):    # test_a方法以参数的形式传入了被fixture标记的函数,fixture的名称默认为被fixture标记的函数名
        print('-------test_a has ran-------')
        assert 1
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

运行结果:

从结果中可以看到被fixture标记的函数before会优先于测试用例test_a运行。

2、通过使用name参数来引用fixture函数

①name参数表示fixture的重命名;

②通常来说使用 fixture 的测试函数会将 fixture 的函数名作为参数传递,但是 pytest 也允许将fixture重命名。

举例1:

# file_name:test_fixture.py
 
 
import pytest
 
 
class Test_A:
 
    @pytest.fixture(name="before_fixture_name")
    def before(self):
        print("\n--------before fixture has ran--------")
 
    def test_a(self, before_fixture_name):    # test_a方法以参数的形式传入了被fixture标记的函数,这里的fixture名称为:before_fixture_name,如果不设置name参数,则fixture的名称默认为被fixture标记的函数名
        print('-------test_a has ran-------')
        assert 1
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

举例2:为fixture函数重命名之后,不可以在使用fixture函数的函数名来调用,只能通过fixture函数重命名的新名字来调用。

3、通过@pytest.mark.usefixtures('fixture函数名')函数的形式引用fixture函数

举例:

# file_name: test_fixture.py
 
 
import pytest
 
 
@pytest.fixture()  # 被fixture标记的函数也可以应用在测试类的外部,使用@pytest.mark.usefixtures()装饰器来引用
def before():
    print("\n--------before fixture has ran--------")
 
 
@pytest.mark.usefixtures("before")  # 通过使用usefixtures()来引用fixture,此时usefixtures()函数的入参是fixture函数的函数名
class Test_A:
 
    def test_a(self):
        print('-------test_a has ran-------')
        assert 1
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

运行结果:

从结果中可以看到被fixture标记的函数before会优先于测试用例test_a运行。

4、通过autouse=True设置默认执行fixture函数

①fixture函数的autouse参数默认等于False;

②fixture函数的autouse参数若为True,刚每个测试函数都会自动调用该fixture函数,而且无需传入fixture函数名。

举例:

# file_name: test_fixture.py
 
 
import pytest
 
 
@pytest.fixture(autouse=True)  # 通过参数autouse=True来设置fixture默认运行
def before():
    print("\n--------before fixture has ran--------")
 
 
class Test_A:
 
    def test_a(self):
        print('-------test_a has ran-------')
        assert 1
 
    def test_b(self):
        print('-------test_b has ran-------')
        assert 1
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

运行结果:

从结果中可以看到我们并没有显示指定test_a和test_b使用fixture,但是在执行测试用例之前却执行了fixture,这就是因为我们将fixture设置成了autouse=True。

5、fixture作用域设置成function

举例:

# file_name: test_fixture.py
 
 
import pytest
 
 
@pytest.fixture(scope="function", autouse=True)  # 作用域设置成function,通过参数autouse=True来设置fixture默认运行
def before():
    print("\n--------before fixture has ran--------")
 
 
class Test_A:
 
    def test_a(self):
        print('-------test_a has ran-------')
        assert 1
 
    def test_b(self):
        print('-------test_b has ran-------')
        assert 1
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

运行结果:

从结果中可以看到将fixture的作用域设置成scope=function后,每个test测试用例执行前都会执行一次被fixture标记的函数。

并且通过跟上一个例子对比我们可以看到设置 scope=function 和不设置scope参数的执行结果是一致的,这说明scope参数的默认值是function。

6、fixture作用域设置成class

举例:

# file_name: test_fixture.py
 
 
import pytest
 
 
@pytest.fixture(scope="class", autouse=True)  # 作用域设置成class,通过参数autouse=True来设置fixture默认运行
def before():
    print("\n--------before fixture has ran--------")
 
 
class Test_A:
 
    def test_a(self):
        print('-------test_a has ran-------')
        assert 1
 
    def test_b(self):
        print('-------test_b has ran-------')
        assert 1
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

运行结果:

从运行结果中可以看到测试类中有两个测试用例,但是fixture却只执行了一次。

7、fixture的返回值使用

举例:

# file_name: test_fixture.py
 
 
import pytest
 
 
@pytest.fixture()
def return_data():
    print("\n--------before fixture has ran--------")
    return 2    # 返回值
 
 
class Test_A:
 
    def test_a(self, return_data):
        print('-------test_a has ran-------')
        assert 1 == return_data # 拿到返回值做断言
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

运行结果:

从结果中看到我们拿到了fixture的返回值为2,在测试用例中拿到返回值做断言,断言失败。

8、fixture的params参数使用

①params形参是fixture函数的可选形参列表,支持列表传入;

②不传此参数时默认为None;

③每个param的值fixture函数都会去调用执行一次,类似for循环。

④可与参数ids一起使用,作为每个参数的标识,类似于用例参数化时的ids作用。

举例:

# file_name: test_fixture.py
 
 
import pytest
 
 
@pytest.fixture(params=[1, 2, 3])
def return_data(request):   # 传入参数request,request系统内置的fixture
    print("\n--------before fixture has ran--------")
    return request.param  # 通过request.param 获取当前传入的参数
 
 
class Test_A:
 
    def test_a(self, return_data):
        print('-------test_a has ran,return_data的值为:{}-------'.fORMat(return_data))
        assert 1 == return_data  # 拿到返回值做断言
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

运行结果:

从结果中我们可以看到测试用例执行了3次。通过设置params参数会导致多次调用被fixture标记的函数,并且使用该fixture函数的测试用例也会执行多次。

9、fixture的params参数于ids参数结合使用

①fixture函数未配置ids参数之前:用例执行后的标识为传入的params参数。

②fixture函数配置ids参数之后:用例执行后的标识为传入的ids参数。并与params参数一一对应。

10、fixture函数的相互调用(fixture函数与fixture函数之间的依赖关系)

举例1:

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:

举例2:如果一个fixture函数依赖另外一个fixture函数,此时不能使@pytest.mark.usefixtures() 调用被依赖的fixture函数,这种调用方式不会生效。而是需要用函数传递的方式才能生效。

# test_fixture_02.py
import pytest
 
 
@pytest.fixture()
def login_weibo():
    print("==============登陆微博===============")
 
 
@pytest.fixture()
# @pytest.mark.usefixtures("login_weibo")  #这种方式不会生效
def get_weibo_data(login_weibo):  # 这种方式才会生效
    """fixture函数依赖,需要用传递函数的方式"""
    print("=============获取微博数据==============")
 
 
@pytest.mark.demo
class TestMyCode:
 
    @pytest.mark.usefixtures("get_weibo_data")
    def test_fixture_005(self):
        """fixture函数在测试脚本文件中"""
        assert 1 == 1

运行结果:

【注意】

①即使fixture函数之间支持相互调用,但普通函数直接使用fixture是不支持的,一定是在测试函数内调用才会逐级调用生效。

②有多层fixture函数调用时,最先执行的是最后一层fixture函数,而不是先执行传入测试函数的fixture函数。

③上层fixture函数的值不会自动return,这里就类似函数相互调用一样的逻辑。【函数调用值需要赋值给一个变量并使用】

到此这篇关于pytest中fixture函数使用的文章就介绍到这了,更多相关pytest fixture函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: pytest中fixture函数使用

本文链接: https://lsjlt.com/news/194476.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • pytest中fixture函数使用
    目录前言fixture函数fixture的使用前言 setup和teardown能实现在测试用例执行之前或之后做一些操作,但是这种是整个测试脚本全局生效的; 如果我们想实现某些用例执...
    99+
    2023-02-07
    pytest fixture函数 pytest fixture
  • pytest中fixture函数有什么用
    这篇文章主要介绍了pytest中fixture函数有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。fixture函数存在意义  与python自带的unitest测试框...
    99+
    2023-06-14
  • pytest中的fixture如何使用
    本篇内容介绍了“pytest中的fixture如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简介:  fixture区别于unnit...
    99+
    2023-07-05
  • Pytest Fixture参数讲解及使用
    Fixture参数详解及使用 Fixture的调用方式: @pytest.fixture(scope = "function",params=None,autouse=False,i...
    99+
    2023-01-10
    Pytest Fixture使用 Pytest Fixture参数 Pytest Fixture
  • pytest进阶教程之fixture函数详解
    fixture函数存在意义   与python自带的unitest测试框架中的setup、teardown类似,pytest提供了fixture函数用以在测试执行前和执行后进行必要...
    99+
    2024-04-02
  • pytest中的fixture基本用法
    目录简介:fixture的功能特点及优势基本用法fixture在自动化中的应用--作用域fixture在自动化中的应用-yield关键字fixture在自动化中的应用--数据共享fi...
    99+
    2023-02-24
    pytest fixture用法 pytest fixture
  • pytest框架之fixture详细使用详解
    本人之前写了一套基于unnitest框架的UI自动化框架,但是发现了pytest框架之后觉得unnitest太low,现在重头开始学pytest框架,一边学习一边记录,和大家分享,话...
    99+
    2024-04-02
  • pytest接口测试之fixture传参数request的使用
    目录前言 一、函数传参 request参数 request传两个参数 前言 有的测试用例,需要依赖于某些特定的case才可以执行,比如登录获取到token,后面的请求都需要带着,为...
    99+
    2024-04-02
  • pytest使用parametrize将参数化变量传递到fixture
    目录一、交代应用场景二、使用@pytest.mark.parametrize、以及fixture的调用来解决1. /demo_top/conftest.py2. /demo_top/...
    99+
    2024-04-02
  • pytest中fixture的调用方式是什么
    这篇文章主要介绍了pytest中fixture的调用方式是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇pytest中fixture的调用方式是什么文章都会有所收获,下面我们一起来看看吧。pytest官方文...
    99+
    2023-06-30
  • pytest中Fixture errors抛错怎么解决
    本篇内容主要讲解“pytest中Fixture errors抛错怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“pytest中Fixture errors抛错怎么解决”...
    99+
    2023-06-30
  • pytest如何使用parametrize将参数化变量传递到fixture
    本篇内容介绍了“pytest如何使用parametrize将参数化变量传递到fixture”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、...
    99+
    2023-06-30
  • pytest-fixture简介及其用法讲解
    目录什么是fixture如何使用fixture使用fixture传递测试数据使用fixture来执行配置和销毁逻辑fixture可以使用其他的fixturefixture的参数介绍p...
    99+
    2023-01-10
    pytest fixture用法 pytest fixture
  • pytest内置fixture使用临时目录流程详解
    目录前言tmpdirtmpdir_factorytmp_pathtmp_path_factory指定临时目录前言 本篇来学习pytest中内置fixture中临时目录的使用 tmpd...
    99+
    2022-12-17
    pytest fixture临时目录 pytest临时目录 pytest fixture
  • pytest中fixtures调用fixtures及fixture复用性实例分析
    本篇内容介绍了“pytest中fixtures调用fixtures及fixture复用性实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2023-06-30
  • pytest自动化测试中的fixture的声明和调用
    目录1. fixture的声明2. fixture的调用2.1 fixture的调用方式2.1.1 使用fixturename2.1.2 使用@pytest.mark.usefixt...
    99+
    2024-04-02
  • pytest官方文档解读fixtures调用fixtures及fixture复用性
    目录fixtures调用其他fixtures及fixture复用性 一、Fixtures调用别的Fixtures二、Fixtures的复用性fixtures调用其他fixt...
    99+
    2024-04-02
  • 自动化测试框架pytest的Fixture固件怎么调用
    本篇内容介绍了“自动化测试框架pytest的Fixture固件怎么调用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是固件Fixture...
    99+
    2023-07-05
  • 怎么用pytest解读fixture有效性及跨文件共享fixtures
    这篇文章主要介绍“怎么用pytest解读fixture有效性及跨文件共享fixtures”,在日常操作中,相信很多人在怎么用pytest解读fixture有效性及跨文件共享fixtures问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
    99+
    2023-06-30
  • pytest自动化测试fixture的作用域实例化顺序及可用性
    目录1. fixture的作用域1.1 scope1.function:2.class:3.module:4.package:5.session:1.2 动态作用域(Dynamic ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作