Pytest精通指南(04)前后置和测试用例执行优先级

46 篇文章 1 订阅
32 篇文章 2 订阅


请添加图片描述

Pytest 固件核心概念

pytest 测试框架中,固件是一个核心概念;

它是一种特殊的函数,用于在测试之前和之后设置和清理测试环境。

固件可以确保测试在一致和可预测的环境中执行,同时它们也可以跨多个测试函数、类和会话共享。

官方标注叫固件,但这词不太好理解,大家都称之为夹具,想象一下汉堡包就明白夹具的含义了。

Setup(设置):

  • pytest 中,setup 通常指的是在每个测试之前执行的一些准备工作,例如初始化变量、打开文件、连接到数据库等。
  • setup 方法可以定义在测试模块、测试类、测试函数或测试方法级别。

Teardown(拆卸):

  • teardown 是指在每个测试执行完成后进行的一些清理工作,例如关闭文件、断开数据库连接、释放资源等。
  • setup 一样,teardown 方法也可以定义在测试模块、测试类、测试函数或测试方法级别。

Pytest 固件原理

检索和执行固件:

  • pytest 遇到一个测试函数或方法时,会根据作用域规则来检索并执行相应的 setup 方法。

    setup方法用于在每个测试之前设置测试环境。

  • 一旦测试函数或方法执行完毕,pytest 会按照相反的作用域顺序执行相应的 teardown 方法。

    teardown 方法用于在每个测试之后清理测试环境

固件作用域:

  • setupteardown 方法的作用域决定了它们在哪里被调用。pytest 支持以下作用域:
  • 函数级(function scope): setupteardown 仅在单个测试函数或方法之前和之后执行。
  • 类级(class scope): 如果在一个测试类中定义了 setup_classteardown_class 方法,则这些方法会在类中的所有测试方法之前和之后执行一次。
  • 模块级(module scope): 如果在模块级别定义了 setup_moduleteardown_module 方法,则这些方法会在整个模块中的所有测试之前和之后执行一次。
  • 会话级(session scope): setup_sessionteardown_session 在整个测试会话开始时和结束时执行一次。

固件执行顺序:

  • 当存在多个作用域级别的 setupteardown 方法时,它们的执行顺序遵循以下规则:
  • 会话级setup_session -> 测试 -> teardown_session
  • 模块级setup_module -> 模块内测试 -> teardown_module
  • 类级setup_class -> 类内测试 -> teardown_class
  • 函数级setup -> 测试函数 -> teardown

Pytest 固件分类

类型函数描述
方法级setup_method / teardown_method在类中的每个测试方法之前/之后执行
函数级setup_function / teardown_function在类外的每个测试函数之前/之后执行
类级setup_class / teardown_class在类中的所有测试方法运行之前/之后执行一次
模块级setup_module / teardown_module在整个模块的所有测试运行之前/之后执行一次

方法级

请添加图片描述

函数级

请添加图片描述

类级

请添加图片描述

模块级

请添加图片描述

夹具优先级

请添加图片描述

测试用例执行优先级

示例代码

import pytest


def addition(x, y):
    return x + y


def test_01_a():
    print("正在执行 test_a 函数...")
    assert addition(3, 5) == 8


class TestClassCase01:

    @staticmethod
    def setup_method():
        print('\nsetup_method被调用,前置执行')

    @staticmethod
    def teardown_method():
        print('\nteardown_method被调用,后置执行')

    def test_01_b(self):
        assert "a" in "apple"

    def test_01_e(self):
        assert "p" in "apple"

    def test_01_d(self):
        assert "l" in "apple"

    def test_01_c(self):
        assert "e" in "apple"


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

执行结果

请添加图片描述

固件不仅如此后续大有文章

暂略

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要休息的KK.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值