Pytest教程__fixture(9)

这篇具有很好参考价值的文章主要介绍了Pytest教程__fixture(9)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是fixture

fixture是pytest特有的功能,使用装饰器 @pytest.fixture 标记的函数在其他函数中能被当作参数传入并被调用。

fixture有明确的名字,在其他函数,模块,类或整个工程调用它时会被激活。

fixture是基于模块来执行的,每个fixture的名字就可以触发一个fixture的函数,它自身也可以调用其他的fixture。

fixture作用是为了提供一种可靠和可重复的手段去运行那些最基本的测试内容。比如在测试网站的功能时,每个测试用例都要登录和退出,利用fixture就可以只做一次,否则每个测试用例都要做这两步就显得很冗余。

fixture的参数

fixture的可用参数如下:

  • scope:定义被fixture装饰方法的作用域。可用参数值如下:
    • function(默认):作用域为每个函数或方法
    • class:作用域为每个类。
    • module:作用域为每个模块(每个py文件)。
    • session:作用域为每次启动。
  • autouse=True:自动执行被fixture装饰的方法。默认为False
  • params:用于参数化,数据类型支持列表和元组。(比如:params=[“v1”, "v2", "v3"])
  • ids:当使用params参数化时,将nodeid中的变量值替换为给定的值(很少使用)
  • name:给被fixture标记的方法取别名。(很少使用,注:当取了别名后,原方法名就不可以用了)

scope参数完成前后置操作

function:作用于每个函数(与setup和teardown功能相似)

import pytest


# function作用范围为每个函数或方法
@pytest.fixture(scope="function")
def my_fixture():
    # yield之前为前置操作,yield之后为后置操作
    print("\n前置操作")
    yield
    print("\n后置操作")


class TestPractice1:

    # 因为没使用autouse参数,使用时需要传入方法名
    def test_001(self, my_fixture):
        print("执行用例001")

    def test_002(self):
        print("执行用例002")


class TestPractice2:

    def test_003(self, my_fixture):
        print("执行用例003")

    def test_004(self):
        print("执行用例004")

执行结果

Pytest教程__fixture(9)

class:作用于每个类(与setup_class和teardown_class功能相似)

import pytest


# class作用范围为每个类
@pytest.fixture(scope="class")
def my_fixture():
    # yield之前为前置操作,yield之后为后置操作
    print("\n前置操作")
    yield
    print("\n后置操作")


class TestPractice1:

    # 因为没使用autouse参数,使用时需要传入方法名
    def test_001(self, my_fixture):
        print("执行用例001")

    def test_002(self):
        print("执行用例002")


class TestPractice2:

    def test_003(self):
        print("执行用例003")

    def test_004(self, my_fixture):
        print("执行用例004")

执行结果

Pytest教程__fixture(9)

module:作用于每个模块

import pytest


# module作用范围为每个模块
@pytest.fixture(scope="module")
def my_fixture():
    # yield之前为前置操作,yield之后为后置操作
    print("\n前置操作")
    yield
    print("\n后置操作")


class TestPractice1:

    # 因为没使用autouse参数,使用时需要传入方法名
    def test_001(self, my_fixture):
        print("执行用例001")

    def test_002(self):
        print("执行用例002")


class TestPractice2:

    def test_003(self):
        print("执行用例003")

    def test_004(self, my_fixture):
        print("执行用例004")

执行结果

Pytest教程__fixture(9)

session:作用于每次启动

Pytest教程__fixture(9)

autouse参数值为True时,被fixture装饰的函数自动被调用

上面我们使用被fixture装饰的函数,都需要将其函数名称当作参数传入到要使用的方法中。需要注意,自动执行范围与scope的作用域相关。

import pytest

@pytest.fixture(autouse=True)
def my_fixture():
    # yield之前为前置操作,yield之后为后置操作
    print("\n前置操作")
    yield
    print("\n后置操作")


class TestPractice1:

    # 因为没使用autouse参数,使用时需要传入方法名
    def test_001(self):
        print("执行用例001")

    def test_002(self):
        print("执行用例002")


class TestPractice2:

    def test_003(self):
        print("执行用例003")

    def test_004(self):
        print("执行用例004")

执行结果

Pytest教程__fixture(9)

params用于参数化,数据类型支持列表和元组。

在上面的例子中,fixture返回值都是None,我们可以选择让fixture返回我们需要的东西。如果你的fixture需要配置一些数据,读个文件,或者连接一个数据库,那么你可以让fixture返回这些数据或资源。

实现步骤:

  1. 在fixture中使用params参数;
  2. 在被fixture装饰的函数中添加request,request是固定写法;
  3. 使用 yield 或 return 返回 request.param request.param是固定写法;
  4. 在要使用的方法中,添加被fixture装饰的函数名;

注意:参数化时,如果使用了autouse,每个方法都会执行一次参数化,所以autouse慎用。

import pytest

@pytest.fixture(params=[1, 2, 3])
def my_fixture(request):
    # yield之前为前置操作,yield之后为后置操作
    print("\n前置操作")
    yield request.param
    print("\n后置操作")


class TestPractice1:

    # 参数化
    def test_001(self, my_fixture):
        print("执行用例001")
        print(f"获取参数化的值:{my_fixture}")

    def test_002(self):
        print("执行用例002")

执行结果

Pytest教程__fixture(9)

如果没有前后置操作,只想做参数化操作,我们可以使用return返回 request.param

import pytest

@pytest.fixture(params=[1, 2, 3])
def my_fixture(request):
    return request.param


class TestPractice1:

    # 参数化
    def test_001(self, my_fixture):
        print("执行用例001")
        print(f"获取参数化的值:{my_fixture}")

    def test_002(self):
        print("执行用例002")

执行结果

Pytest教程__fixture(9)

ids用于在参数化时,将nodeid中的变量值替换为给定的值

import pytest

@pytest.fixture(params=[1, 2, 3], ids=["v1", "v2", "v3"])
def my_fixture(request):
    # yield之前为前置操作,yield之后为后置操作
    return request.param


class TestPractice1:

    # 参数化
    def test_001(self, my_fixture):
        print("执行用例001")
        print(f"获取参数化的值:{my_fixture}")

    def test_002(self):
        print("执行用例002")

执行结果

Pytest教程__fixture(9)

name用于给被fixture标记的方法取别名

name用于给被fixture标记的方法取别名

import pytest

@pytest.fixture(name="rename_fixture")
def my_fixture(request):
    print("前置操作")
    yield
    print("后置操作")


class TestPractice1:

    # 使用方法别名调用fixture
    def test_001(self, rename_fixture):
        print("执行用例001")

    def test_002(self):
        print("执行用例002")

需要注意是,使用该参数后,原函数名就不可用了。

Pytest教程__fixture(9)

fixture可以互相调用

import pytest


@pytest.fixture()
def fixture_1():
    print("\nfixture1的前置")
    yield
    print("fixture1的后置")


# 在fixture_2中调用fixture_1
@pytest.fixture()
def fixture_2(fixture_1):
    print("fixture2的前置")
    yield
    print("\nfixture2的后置")


class TestPractice1:

    # 调用fixture_2
    def test_001(self, fixture_2):
        print("执行用例001")

    def test_002(self):
        print("执行用例002")

执行结果

Pytest教程__fixture(9)

一个用例可以调用多个fixture

import pytest


@pytest.fixture()
def fixture_1():
    print("fixture1的前置")
    yield
    print("\nfixture1的后置")


@pytest.fixture()
def fixture_2():
    print("\nfixture2的前置")
    yield
    print("fixture2的后置")


class TestPractice1:

    # 调用多个fixture,执行顺序与调用顺序有关
    def test_001(self, fixture_2, fixture_1):
        print("执行用例001")

    def test_002(self):
        print("执行用例002")

执行结果

Pytest教程__fixture(9)

conftest.py和@pytest.fixture结合使用设置全局可用

上面的演示,用例和fixture均是在同一个文件中,我们可以创建一个固定名称为conftest.py的文件,将其放在用例同级或上级以上目录,在这个文件中定义一个被fixture装饰的函数,这个函数可以在其下级任意目录,不需要import而直接使用。

这里有以下几点需要注意:

  1. 文件名称固定为conftest.py
  2. 在conftest.py定义的fixture函数不需要import就可以直接使用
  3. conftest.py影响的作用域为同级及其所有子目录
  4. conftest.py文件可以创建多个,当多个文件存在相同的fixture函数名是,最近的作用域函数功能生效

Pytest教程__fixture(9)

Pytest教程__fixture(9)

Pytest教程__fixture(9)

-事必有法,然后有成- 最后祝大家早日达到测试的天花板!



以下是我收集到的比较好的学习教程资源,虽然不是什么很值钱的东西,如果你刚好需要,可以留言【777】直接拿走就好了

Pytest教程__fixture(9)

都看到这啦,若是文章对大家有帮助的话,大家可以点赞、关注支持一下哈~文章来源地址https://www.toymoban.com/news/detail-493623.html

到了这里,关于Pytest教程__fixture(9)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pytest fixture 常用参数

    fixture 常用的参数 参数一:autouse,作用:自动运行,无需调用 举例一:我们在类中定义一个function 范围的fixture; 设置它自动执行autouse=True,那么我们看下它执行结果  输出:  说明:因为设置了自动执行,且范围是方法级别,那么每次在方法或函数前后都会执行fixture;yie

    2024年02月13日
    浏览(36)
  • pytest fixture 用于teardown工作

    fixture通过scope参数控制setup级别,setup作为用例之前前的操作,用例执行完之后那肯定也有teardown操作。这里用到fixture的teardown操作并不是独立的函数,用yield呼唤teardown操作。 举个例子:  输出: 说明:yield yield 在 fixture 中起到了唤起 teardown 的作用,同时也可以和 r

    2024年02月13日
    浏览(35)
  • Pytest使用fixture实现token共享

    同学们在做pytest接口自动化时,会遇到一个场景就是不同的测试用例需要有一个 登录 的前置步骤,登录完成后会获取到 token ,用于之后的代码中。首先我先演示一个常规的做法。 首先在conftest定义一个login的方法,方法返回token 2.在测试用例方法中引入这个方法,所有用到

    2024年02月12日
    浏览(35)
  • Pytest fixture参数传递的4种方式

    最近使用Pytest中的fixture和conftest时,遇到需要在conftest中的setup和teardown方法里传递参数。这里记录以下4种实现的方式。 结果: 结果: 结果:

    2024年02月16日
    浏览(35)
  • Pytest中使用Fixture替换Unittest的Setupclass及Pytest使用装饰器应用参数化

            Pytest中夹具(Fixture)有几种生命周期:function-model-class-session-packages,其中默认为function。             在类外写Fixture,通过@pytest.para.usefixtures(\\\"fixture name\\\")来调用。              fixture中不使用参数,测试用例使用参数化。

    2024年02月05日
    浏览(37)
  • pytest fixture 创建一个 requests.session() 对象

    当你运行这段代码时,它会执行以下操作: 1. 导入必要的库:`pytest` 和 `requests`。 2. 定义一个夹具(fixture)函数 `session`,使用 `@pytest.fixture(scope=\\\'session\\\')` 装饰器进行标记。这个夹具函数在整个测试会话期间只会被执行一次。 3. 在 `session` 夹具函数中,创建一个 `requests.sess

    2024年02月11日
    浏览(36)
  • 自动化测试 —— Pytest fixture及conftest详解

    fixture是在测试函数运行前后,由pytest执行的外壳函数。fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在,类似unittest中setup/teardown,但是比它们要强大、灵活很多

    2024年04月08日
    浏览(33)
  • Pytest测试技巧之Fixture:模块化管理测试数据

    在 Pytest 测试中,有效管理测试数据是提高测试质量和可维护性的关键。本文将深入探讨 Pytest 中的 Fixture,特别是如何利用 Fixture 实现测试数据的模块化管理,以提高测试用例的清晰度和可复用性。  什么是Fixture? 在 Pytest 中,Fixture 是一种用于为测试用例提供设置和资源的

    2024年02月22日
    浏览(42)
  • 超强,Pytest自动化测试框架 fixture 传参实战(案例)

    为了提高复用性,我们在写测试用例的时候,会用到不同的fixture,比如:最常见的登录操作,大部分的用例的前置条件都是登录 假设不同的用例想登录不同的测试账号,那么登录fixture就不能把账号写死,需要通过传参的方式来完成登录操作 案例1:传单个参数 执行结果 添加

    2024年02月12日
    浏览(45)
  • 超详细从入门到精通,pytest自动化测试框架实战-fixture多样玩法(九)

    在编写测试用例,都会涉及到用例执行之前的环境准备工作,和用例执行之后的环境清理工作。 代码版的测试用例也不例外。 pytest自动化测试框架:https://www.bilibili.com/video/BV18K411m7FH/ 在自动化测试框架当中,我们也需要编写: 用例执行之前的环境准备工作代码(前置工作代码

    2023年04月11日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包