Pytest----如何使用经典的setup和teardown

简介: Pytest----如何使用经典的setup和teardown

setup和teardown是测试脚本中非常常见的预配置和清理配置,即在执行用例之前做一些预置处理和当用例执行完成之后做一些环境恢复的清理配置,因为用例所处的层级不一样,因此setup和teardown也对应的分为若干类型,在 Pytest----Pytest自动化测试框架快速入门中提到pytest功能非常的强大,同时又非常的简单,其实简单的的一个重要原因就是当使用好这些setup和teardown,则几乎不用去关注pytest的其他的高级功能,就已经可以做到和类似unittest框架差不多的功能,即运用好这些setup和teardown已经可以为一个中小型项目做自动化测试框架了。换句话说如果在开发团队部署单元测试或者功能测试的自动化,则无需去关注其他pytest的高级功能,因为任何事物都是有两面性的,去使用高级功能确实是显得非常专业非常的高大上,但同时运维的成本也无形的增加了许多。

一、模块级的setup和teardown

编写如下测试脚本

# test_module.py

import pytest

def setup_module():
    print("\nin setup_module......")

def teardown_module():
    print("\nin teardown_module......")

def test_func1():
    print("\nin test_func1......")
    assert 1 == 1

def test_func2():
    print("\nin test_func2......")
    assert 1 == 1

执行结果如下,可以看出setup_module会在执行当前模块中所有测试用例之前执行,而teardown_module会在当前模块的所有用例执行完成之后再执行

$ pytest -s test_module.py
========================================================================= test session starts ==========================================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\src\blog\tests
plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0
collected 2 items                                                                                                                                                       

test_module.py
in setup_module......

in test_func1......
.
in test_func2......
.
in teardown_module......


========================================================================== 2 passed in 0.02s ===========================================================================

$

二、函数级的setup和teardown

编写如下测试脚本

# test_module.py

import pytest

def setup_module():
    print("\nin setup_module......")

def teardown_module():
    print("\nin teardown_module......")

def setup_function():
    print("\nin setup_function......")

def teardown_function():
    print("\nin teardown_function......")

def test_func1():
    print("\nin test_func1......")
    assert 1 == 1

def test_func2():
    print("\nin test_func2......")
    assert 1 == 1

执行结果如下,可以看出,setup_function是在每个测试函数执行之前都会执行,而teardown_funciton则会在每个测试函数执行完成之后执行一次

$ pytest -s
========================================================================= test session starts ==========================================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\src\blog\tests
plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0
collected 2 items                                                                                                                                                       

test_module.py
in setup_module......

in setup_function......

in test_func1......
.
in teardown_function......

in setup_function......

in test_func2......
.
in teardown_function......

in teardown_module......


========================================================================== 2 passed in 0.03s ===========================================================================

$

三、模块中的setup和teardown

编写如下测试脚本:

# test_module.py

import pytest

def setup_module():
    print("\nin setup_module......")

def teardown_module():
    print("\nin teardown_module......")

def setup_function():
    print("\nin setup_function......")

def teardown_function():
    print("\nin teardown_function......")

def setup():
    print("\nin setup......")

def teardown():
    print("\nin teardown......")

def test_func1():
    print("\nin test_func1......")
    assert 1 == 1

def test_func2():
    print("\nin test_func2......")
    assert 1 == 1

执行结果如下,setup和teardown与函数级的setup_function和teardown_function功能是完全一样的,即setup在每个测试函数执行之前执行一次,teardown在每个测试函数执行完成之后执行一次,只不过他们的优先级不一样,在每个测试函数执行执行,先执行setup_function,然后再执行setup。在每个测试函数执行完成之后,先执行teardown,在执行teardown_function

$ pytest -s
========================================================================= test session starts ==========================================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\src\blog\tests
plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0
collected 2 items                                                                                                                                                       

test_module.py
in setup_module......

in setup_function......

in setup......

in test_func1......
.
in teardown......

in teardown_function......

in setup_function......

in setup......

in test_func2......
.
in teardown......

in teardown_function......

in teardown_module......


========================================================================== 2 passed in 0.02s ===========================================================================

$

四、类级的setup和teardown

编写如下测试脚本

# test_module.py
import pytest

class TestClass(object):
    def setup_class(self):
        print("\nin TestClass.setup_class......")

    def teardown_class(self):
        print("\nin TestClass.teardown_class......")

    def test_method1(self):
        print("\nin TestClass.test_method1......")
        assert 1==1

    def test_method2(self):
        print("\nin TestClass.test_method2......")
        assert 1==1

执行结果如下,可以看出setup_class会在测试类的所有用例之前执行,teardown_class会在测试类的所有测试用例之后执行

$ pytest -s
========================================================================= test session starts ==========================================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\src\blog\tests
plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0
collected 2 items                                                                                                                                                       

test_module.py
in TestClass.setup_class......

in TestClass.test_method1......
.
in TestClass.test_method2......
.
in TestClass.teardown_class......


========================================================================== 2 passed in 0.03s ===========================================================================

$

五、类中的方法级的setup和teardown

编写如下测试脚本;

# test_module.py
import pytest

class TestClass(object):
    def setup_class(self):
        print("\nin TestClass.setup_class......")

    def teardown_class(self):
        print("\nin TestClass.teardown_class......")

    def setup_method(self):
        print("\nin TestClass.setup_method......")

    def teardown_method(self):
        print("\nin TestClass.teardown_method......")

    def test_method1(self):
        print("\nin TestClass.test_method1......")
        assert 1==1

    def test_method2(self):
        print("\nin TestClass.test_method2......")
        assert 1==1

执行结果如下,可以看出,setup_method会在测试类中的每个测试方法执行之前执行,teardown_method则会在测试类中的每个测试方法执行完成之后执行

$ pytest -s
========================================================================= test session starts ==========================================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\src\blog\tests
plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0
collected 2 items                                                                                                                                                       

test_module.py
in TestClass.setup_class......

in TestClass.setup_method......

in TestClass.test_method1......
.
in TestClass.teardown_method......

in TestClass.setup_method......

in TestClass.test_method2......
.
in TestClass.teardown_method......

in TestClass.teardown_class......


========================================================================== 2 passed in 0.03s ===========================================================================

$

六、类中的setup和teardown

编写测试脚本如下:

# test_module.py
import pytest

class TestClass(object):
    def setup_class(self):
        print("\nin TestClass.setup_class......")

    def teardown_class(self):
        print("\nin TestClass.teardown_class......")

    def setup_method(self):
        print("\nin TestClass.setup_method......")

    def teardown_method(self):
        print("\nin TestClass.teardown_method......")
        
    def setup(self):
        print("\nin TestClass.setup......")
        
    def teardown(self):
        print("\nin TestClass.teardown......")

    def test_method1(self):
        print("\nin TestClass.test_method1......")
        assert 1==1

    def test_method2(self):
        print("\nin TestClass.test_method2......")
        assert 1==1

执行结果如下,setup和teardown与方法级的setup和teardown功能完全一样,即setup在类的每个测试方法执行之前执行,teardown在类的每个测试方法执行完成之后执行,不同点就是setup在setup_method之后执行,teardown在teardown_method之前执行,即他们的优先级不一样

$ pytest -s
========================================================================= test session starts ==========================================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\src\blog\tests
plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0
collected 2 items                                                                                                                                                       

test_module.py
in TestClass.setup_class......

in TestClass.setup_method......

in TestClass.setup......

in TestClass.test_method1......
.
in TestClass.teardown......

in TestClass.teardown_method......

in TestClass.setup_method......

in TestClass.setup......

in TestClass.test_method2......
.
in TestClass.teardown......

in TestClass.teardown_method......

in TestClass.teardown_class......


========================================================================== 2 passed in 0.03s ===========================================================================

$ 

七、模块和类同时存在setup和teardown

当测试脚本中同时存在模块的setup与teardown以及类的setup与teardown,其实同时存在时不会冲突的,编写测试脚本如下:

# test_module.py
import pytest

class TestClass(object):
    def setup_class(self):
        print("\nin TestClass.setup_class......")

    def teardown_class(self):
        print("\nin TestClass.teardown_class......")

    def setup_method(self):
        print("\nin TestClass.setup_method......")

    def teardown_method(self):
        print("\nin TestClass.teardown_method......")

    def setup(self):
        print("\nin TestClass.setup......")

    def teardown(self):
        print("\nin TestClass.teardown......")

    def test_method1(self):
        print("\nin TestClass.test_method1......")
        assert 1==1

    def test_method2(self):
        print("\nin TestClass.test_method2......")
        assert 1==1

def setup_module():
    print("\nin setup_module......")

def teardown_module():
    print("\nin teardown_module......")

def setup_function():
    print("\nin setup_function......")

def teardown_function():
    print("\nin teardown_function......")

def setup():
    print("\nin setup......")

def teardown():
    print("\nin teardown......")

def test_func1():
    print("\nin test_func1......")
    assert 1 == 1

def test_func2():
    print("\nin test_func2......")
    assert 1 == 1

执行结果如下,可以看出,模块中的setup、teardown与类中的setup、teardown是没有冲突的,唯一一点需要注意就是模块级的setup_module是在整个模块之前执行,而teardown_module是在整个文件执行完成之后再执行,至于是模块中的测试函数和类中的测试函数执行顺序是按照从前到后的顺序执行的。

$ >pytest -s
========================================================================= test session starts ==========================================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\src\blog\tests
plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0
collected 4 items                                                                                                                                                       

test_module.py
in setup_module......

in TestClass.setup_class......

in TestClass.setup_method......

in TestClass.setup......

in TestClass.test_method1......
.
in TestClass.teardown......

in TestClass.teardown_method......

in TestClass.setup_method......

in TestClass.setup......

in TestClass.test_method2......
.
in TestClass.teardown......

in TestClass.teardown_method......

in TestClass.teardown_class......

in setup_function......

in setup......

in test_func1......
.
in teardown......

in teardown_function......

in setup_function......

in setup......

in test_func2......
.
in teardown......

in teardown_function......

in teardown_module......


========================================================================== 4 passed in 0.03s ===========================================================================

$
目录
相关文章
|
Java 开发者 微服务
Java企业应用软件系统架构演变史
Java企业应用软件系统架构演变史
325 0
|
SQL 分布式计算 数据挖掘
PySpark数据分析基础:PySpark Pandas创建、转换、查询、转置、排序操作详解
PySpark数据分析基础:PySpark Pandas创建、转换、查询、转置、排序操作详解
1370 0
PySpark数据分析基础:PySpark Pandas创建、转换、查询、转置、排序操作详解
|
11月前
|
安全 前端开发 JavaScript
结合自定义 Hook 和高阶组件的最佳实践
结合自定义 Hook 和高阶组件的最佳实践
328 74
|
6月前
|
存储 编解码 缓存
《冬季游戏动态交互的底层逻辑优化全解析》
本文聚焦冬季游戏动态渲染优化,围绕动态积雪、实时气象、物理交互、地形形变及间接光影表现五大核心方向展开。针对初期全场景动态效果导致的帧率卡顿、服务器负载过高问题,提出“交互优先级矩阵”“地形-气象联动模型”“预计算+实时插值”等创新策略,通过核心场景高精度渲染、非核心场景逻辑简化与资源复用,实现动态元素自然呈现与性能稳定的平衡。优化后,主流设备帧率稳定在60帧以上,多人联机延迟可控,玩家沉浸感显著提升。文章结合实战案例拆解底层优化逻辑,为冬季游戏动态渲染提供兼具实用价值与独特视角的进阶方法论,彰显“取舍与协同”的渲染核心思维。
213 0
|
移动开发 小程序 前端开发
小程序接入微信支付V3接口开发教程
最近做了一个小程序对接微信支付的需求,查看微信支付文档,还是感觉有点凌乱,所以做一个统一整理,供大家参考。
1470 0
小程序接入微信支付V3接口开发教程
|
程序员 区块链
程序员职业发展路线图(完整版+珍藏版)
程序员职业发展路线图(完整版+珍藏版)
|
消息中间件 Dubbo 应用服务中间件
RocketMq-Request-Reply消息
RocketMq-Request-Reply消息
RocketMq-Request-Reply消息
|
Kubernetes 容器 Perl
在k8S中,如何查看Pod中上一个挂掉的容器日志?
在k8S中,如何查看Pod中上一个挂掉的容器日志?
|
IDE 开发工具 Android开发
Android c++ core guideline checker 应用问题之clang-tidy 检查后发现的问题如何解决
Android c++ core guideline checker 应用问题之clang-tidy 检查后发现的问题如何解决
|
Oracle 关系型数据库 MySQL
Flink CDC产品常见问题之使用cdc-Oracle连接器报错如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
Flink CDC产品常见问题之使用cdc-Oracle连接器报错如何解决