setup 与 teardown 操作

章节目录:

一、概述

pytest 提供了类似 setupteardown 的方法。

  • 模块级别setup_moduleteardown_module
  • 函数级别setup_functionteardown_function,不在类中的方法。
  • 类级别setup_classteardown_class
  • 方法级别setup_methodteardown_method
  • 方法细化级别setupteardown

二、前置与后置操作

  • 代码示例
python 复制代码
import pytest


def setup_function():
    print('\n这是测试用例的前置')


def teardown_function():
    print('\n这是测试用例的后置')


def test01():
    print('\n### case1 ###')


if __name__ == '__main__':
    """
    main() 命令行参数详情:
    -s: 显示程序中的 print / logging 输出。
    -v: 丰富信息模式, 输出更详细的用例执行信息。
    -q: 安静模式, 不输出环境信息。
    -x: 出现一条测试用例失败就退出测试。调试阶段非常有用。
    -k:可以使用and、not、or等逻辑运算符,区分:匹配范围(文件名、类名、函数名)。

    当不传入参数时,相当于命令行输入 pytest。
    当传入参数 -s -v -x 时,相当于命令行输入 pytest -s -v -x。
    """

    pytest.main(['-s'])
    # 执行顺序如下:
    #
    # 这是测试用例的前置
    #
    # ### case1 ###
    # 
    # 这是测试用例的后置
  • 执行顺序优先级前置 (setup) > 后置(teardown)。

三、各函数使用场景

  • setup_module:在当前测试模块开始执行前调用一次。通常用于设置全局测试环境。
  • teardown_module:在当前测试模块执行完后调用一次。通常用于清理全局测试环境。
  • setup_function:在每个测试函数(不在类中的 方法)运行前调用一次。通常用于设置特定函数级别的测试环境。
  • teardown_function:在每个测试函数(不在类中的方法)运行后调用一次。通常用于清理特定函数级别的测试环境。
  • setup_class:在当前测试类中的所有测试方法运行前调用一次。通常用于设置类级别的测试环境。
  • teardown_class:在当前测试类中的所有测试方法运行后调用一次。通常用于清理类级别的测试环境。
  • setup_method:在每个测试类中的每个测试方法运行前调用一次。通常用于设置方法级别的测试环境。
  • teardown_method:在每个测试类中的每个测试方法运行后调用一次。通常用于清理方法级别的测试环境。
  • setup:在每个测试方法运行前调用一次。与 setup_method 类似 ,但它只在类中的方法内起作用,不会影响其他测试方法。
  • teardown:在每个测试方法运行后调用一次。与 teardown_method 类似,但它只在类中的方法内起作用,不会影响其他测试方法。

四、方法使用

  • 代码示例
python 复制代码
import pytest


def setup_module():
    print("\n===setup_module(设置全局测试环境,仅执行一次)===")


def teardown_module():
    print("\n===teardown_module(清理全局测试环境,仅执行一次)===")


def setup_function():
    print("\n===setup_function(不在类中的方法-设置特定函数级别的测试环境)===")


def teardown_function():
    print("\n===teardown_function(不在类中的方法-清理特定函数级别的测试环境)===")


def test_one():
    print("\n### case1 ###")


def test_two():
    print("\n### case2 ###")


class TestCase:
    def setup_class(self):
        print("\n===setup_class(设置类级别测试环境,仅执行一次)===")

    def teardown_class(self):
        print("\n===teardown_class(清理类级别测试环境,仅执行一次)===")

    def setup_method(self):
        print("\n===setup_method(设置方法级别的测试环境)===")

    def teardown_method(self):
        print("\n===teardown_method(清理方法级别的测试环境)===")

    def setup(self):
        print("\n===setup(与 setup_method 类似,不会影响其他测试方法)===")

    def teardown(self):
        print("\n===teardown(与 teardown_method 类似,不会影响其他测试方法)===")

    def test_three(self):
        print("\n### case3 ###")

    def test_four(self):
        print("\n### case4 ###")


if __name__ == '__main__':
    pytest.main(["-s"])
  • 调用过程
python 复制代码
test.py::test_one 
===setup_module(设置全局测试环境,仅执行一次)===

===setup_function(不在类中的方法-设置特定函数级别的测试环境)===
PASSED                                                 [ 25%]
### case1 ###

===teardown_function(不在类中的方法-清理特定函数级别的测试环境)===

test.py::test_two 
===setup_function(不在类中的方法-设置特定函数级别的测试环境)===
PASSED                                                 [ 50%]
### case2 ###

===teardown_function(不在类中的方法-清理特定函数级别的测试环境)===

test.py::TestCase::test_three 
===setup_class(设置类级别测试环境,仅执行一次)===

===setup_method(设置方法级别的测试环境)===
PASSED                                     [ 75%]
### case3 ###

===teardown_method(清理方法级别的测试环境)===

test.py::TestCase::test_four 
===setup_method(设置方法级别的测试环境)===
PASSED                                      [100%]
### case4 ###

===teardown_method(清理方法级别的测试环境)===

===teardown_class(清理类级别测试环境,仅执行一次)===

===teardown_module(清理全局测试环境,仅执行一次)===

五、总结

  1. setup_classsetup_module 执行用例时,只执行一次前置和后置。
  2. setup_classsetup_method是在类中执行的。
  3. setup_modulesetup_function是在类外执行的。
  4. 其中 setup 类中,类内外都可以执行。

六 、结束语


"-------怕什么真理无穷,进一寸有一寸的欢喜。"

微信公众号搜索:饺子泡牛奶

相关推荐
qq_4523962329 分钟前
【模型手术室】第四篇:全流程实战 —— 使用 LLaMA-Factory 开启你的第一个微调任务
人工智能·python·ai·llama
无心水1 小时前
Java时间处理封神篇:java.time全解析
java·开发语言·python·架构·localdate·java.time·java时间处理
吴秋霖1 小时前
【某音电商】protobuf聊天协议逆向
python·算法·protobuf
深藏功yu名1 小时前
Day24:向量数据库 Chroma_FAISS 入门
数据库·人工智能·python·ai·agent·faiss·chroma
cm6543202 小时前
用Python破解简单的替换密码
jvm·数据库·python
wan9yu2 小时前
为什么你需要给 LLM 的数据"加密"而不是"脱敏"?我写了一个开源工具
python
摇滚侠2 小时前
你是一名 java 程序员,总结定义数组的方式
java·开发语言·python
这个名有人用不3 小时前
解决 uv 虚拟环境使用 pip 命令提示command not found的办法
python·pip·uv·claude code
Oueii3 小时前
掌握Python魔法方法(Magic Methods)
jvm·数据库·python