pytest测试框架1-强大的Fixture功能

本文主要介绍了pytest中fixture的相关知识。fixture是在测试函数运行前后执行的外壳函数,可将测试前后的预备、清理工作与核心测试逻辑分离。文中还举例说明了其使用方法,包括放置位置、传递测试数据、指定作用范围以及参数化等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.fixture是 干什么用的??

fixture是在测试函数运行前后,由pytest执行的外壳函数;代码可以定制,满足多变的测试需求;

包括定义传入测试中的数据集,配置测试前系统的初始状态,为批量测试提供数据源等等...

fixture是pytest用于将测试前后进行预备,清理工作的代码分离出核心测试逻辑的一种机制!

 

2.举个例子

@pytest.fixture()
def some_data():
    return 42

def test_some_data(some_data):
    assert some_data == 42

 

#@pytest.fixture() 装饰器用于声明函数是一个fixture

如果测试函数的参数列表中包含fixture名字,那么pytest会检测到,

检测顺序是:优先搜索该测试所在的模块,然后搜索conftest.py

并在测试函数运行之前执行该fixture,

fixture可以完成测试任务,也可以返回数据给测试函数

pytest --setup-show test_example1.py

 

3.fixture函数放在哪里合适?

1.可以放在单独的测试文件里

2.如果希望多个测试文件共享fixture,可以放在某个公共目录下新建一个conftest文件,将fixture放在里面。

 

4.使用fixture传递测试数据

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

@pytest.fixture()
def a_list():
    return [1,2,3,44,5]

def test_a_list(a_list):
    assert a_list[2] == 3

 

5.指定fixture作用范围

fixture里面有个scope参数可以控制fixture的作用范围:session > module > class > function

1)function
每一个函数或方法都会调用 \
@ pytest.fixture()


def first():
    print("\n获取用户名")
    a = "xiaoyulaoshi"
    return a


@pytest.fixture(scope="function")
def sencond():
    print("\n获取密码")
    b = "123456"
    return b


def test_1(first):
    '''用例传fixture'''
    print("测试账号:%s" % first)
    assert first == "xiaoyulaoshi"


def test_2(sencond):
    '''用例传fixture'''
    print("测试密码:%s" % sencond)
    assert sencond == "123456"


2).class 每一个类调用一次,一个类可以有多个方法


@pytest.fixture(scope="class")
def first():
    print("\n获取用户名,scope为class级别只运行一次")
    a = "xiaoyulaoshi"
    return a


class TestCase():
    def test_1(self, first):
        '''用例传fixture'''
        print("测试账号:%s" % first)
        assert first == "xiaoyulaoshi"

    def test_2(self, first):
        '''用例传fixture'''
        print("测试账号:%s" % first)
        assert first == "xiaoyulaoshi"


3).module,每一个.py文件调用一次,该文件内又有多个function和class
import pytest


@pytest.fixture(scope="module")
def first():
    print("\n获取用户名,scope为module级别当前.py模块只运行一次")
    a = "xiaoyulaoshi"
    return a


def test_1(first):
    '''用例传fixture'''
    print("测试账号:%s" % first)
    assert first == "xiaoyulaoshi"


class TestCase():
    def test_2(self, first):
        '''用例传fixture'''
        print("测试账号:%s" % first)
        assert first == "xiaoyulaoshi"


4).session
是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module
当我们有多个.py文件的用例时候,如果多个用例只需调用一次fixture,那就可以设置为scope = "session",并且写到conftest.py文件里

conftest.py

import pytest


@pytest.fixture(scope="session")
def first():
    print("\n获取用户名,scope为session级别多个.py模块只运行一次")
    a = "xiaoyulaoshi"
    return a


test_fixture11.py

import pytest


def test_1(first):
    '''用例传fixture'''
    print("测试账号:%s" % first)
    assert first == "xiaoyulaoshi"


import pytest


def test_2(first):
    '''用例传fixture'''
    print("测试账号:%s" % first)
    assert first == "xiaoyulaoshi"

 

6.fixture的参数化

pytest支持在多个完整测试参数化方法:

1).pytest.fixture(): 在fixture级别的function处参数化

2).@pytest.mark.parametrize:允许在function或class级别的参数化,为特定的测试函数或类提供了多个argument/fixture设置。

3_.pytest_generate_tests:可以实现自己的自定义动态参数化方案或扩展。

import pytest
import requests

par_to_test=[{
      "case": "serach a word :haha",
      "headers": {},
      "querystring": {
        "wd":"hah"
      },
      "payload": {},
      "expected": {
        "status_code":200
      }
    },
{
      "case": "serach a word2 :kuku",
      "headers": {},
      "querystring": {
        "wd":"kuku"
      },
      "payload": {},
      "expected": {
        "status_code":200
      } },

{
      "case": "serach a word3 :xiaoyulaoshi",
      "headers": {},
      "querystring": {
        "wd":"xiaoyulaoshi"
      },
      "payload": {},
      "expected": {
        "status_code":200
      } }
]

@pytest.fixture(params = par_to_test)
def class_scope(request):
    return request.param

def test_baidu_search(class_scope):
    url = "https://www.baidu.com"
    r = requests.request("GET", url, data=class_scope["payload"], headers=class_scope["headers"], params=class_scope["querystring"])
    assert r.status_code == class_scope["expected"]["status_code"]

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值