pytest测试框架(二)

setup和teardown函数

  • pytest中有分别针对模块、类、函数的setup和teardown,分别在执行模块、类、函数之前和之后运行
  • pytest提供的这些方法名称都是固定的

函数级别

  • setup_function()和teardown_function()函数定义在类外,会对test开头的非类方法生效

  • 作用域单个测试用例,每次在单个用例执行前后都执行

import pytest

def setup_function():
    print("setup_function(): 每个方法之前执行")


def teardown_function():
    print("teardown_function(): 每个方法之后执行")


def test_01():
    print("正在执行test1")


def test_02():
    print("正在执行test2")

class TestClass(object):
    def test_03(self):
        print("正在执行 类方法 test3")


def normal_func():
    print("正在执行normal_func")

运行结果如下:

plugins: tavern-1.16.3, openfiles-0.3.2, arraydiff-0.3, allure-pytest-2.9.45, doctestplus-0.3.0, remotedata-0.3.1
collected 3 items                                                                                                                                         

pytest_code2.py setup_function(): 每个方法之前执行
正在执行test1
.teardown_function(): 每个方法之后执行
setup_function(): 每个方法之前执行
正在执行test2
.teardown_function(): 每个方法之后执行
正在执行 类方法 test3
.

==================================================================== 3 passed in 0.03s ====================================================================

类级别

  • 必须在类中定义,只作用于本类

  • setup_class 和 teardown_class 会在在类执行前后执行一次

  • setup_method 和 teardown_method 会在每个测试方法前后执行一次

import pytest


class TestMethod(object):
    @classmethod
    def setup_class(cls):
        print("setup_class(self):每个类之前执行一次")

    @classmethod
    def teardown_class(cls):
        print("teardown_class(self):每个类之后执行一次")

    def setup_method(self):
        print("setup_method(self):在每个方法之前执行")

    def teardown_method(self):
        print("teardown_method(self):在每个方法之后执行\n")

    def test_01(self):
        print("正在执行test1")


    def test_02(self):
        print("正在执行test2")

    def normal_func(self):
        print("正在执行normal_func")

运行结果如下:

plugins: tavern-1.16.3, openfiles-0.3.2, arraydiff-0.3, allure-pytest-2.9.45, doctestplus-0.3.0, remotedata-0.3.1
collected 2 items                                                                                                                                         

pytest_code3.py setup_class(self):每个类之前执行一次
setup_method(self):在每个方法之前执行
正在执行test1
.teardown_method(self):在每个方法之后执行

setup_method(self):在每个方法之前执行
正在执行test2
.teardown_method(self):在每个方法之后执行

teardown_class(self):每个类之后执行一次


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

模块级别

  • 定义在类外,作用域本模块

  • setup_module 和 teardown_module 会模块内只执行一次,和函数级别,类级别不冲突

import pytest

def setup_module():
    print("setup_module():在模块最之前执行")


def teardown_module():
    print("teardown_module:在模块之后执行")


def setup_function():
    print("setup_function():每个方法之前执行")


def teardown_function():
    print("teardown_function():每个方法之后执行")

def test_outside_1():
    print('正在执行test_outside_1')

def test_outside_2():
    print('正在执行test_outside_2')

class TestMethod(object):
    @classmethod
    def setup_class(cls):
        print("setup_class(self):每个类之前执行一次")

    @classmethod
    def teardown_class(cls):
        print("teardown_class(self):每个类之后执行一次")

    def setup_method(self):
        print("setup_method(self):在每个方法之前执行")

    def teardown_method(self):
        print("teardown_method(self):在每个方法之后执行\n")

    def test_01(self):
        print("正在执行test1")

    def test_02(self):
        print("正在执行test2")

    def normal_func(self):
        print("正在执行normal_func")

运行结果如下:

plugins: tavern-1.16.3, openfiles-0.3.2, arraydiff-0.3, allure-pytest-2.9.45, doctestplus-0.3.0, remotedata-0.3.1
collected 4 items                                                                                                                                         

pytest_code4.py setup_module():在模块最之前执行
setup_function():每个方法之前执行
正在执行test_outside_1
.teardown_function():每个方法之后执行
setup_function():每个方法之前执行
正在执行test_outside_2
.teardown_function():每个方法之后执行
setup_class(self):每个类之前执行一次
setup_method(self):在每个方法之前执行
正在执行test1
.teardown_method(self):在每个方法之后执行

setup_method(self):在每个方法之前执行
正在执行test2
.teardown_method(self):在每个方法之后执行

teardown_class(self):每个类之后执行一次
teardown_module:在模块之后执行


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

小结

  • 若用例没被执行或失败,则不会执行teardown
  • 对非test开头的函数不生效
  • setup_module()
    --- 在当前模块运行之前执行,必须定义在类外
  • teardown_module()
    --- 在当前模块运行的最后执行,必须定义在类外
  • setup_class(self)
    --- 所有类方法运行之前执行一次,必须在类中定义,只作用于本类
  • teardown_class(self)
    --- 所有类方法运行之后执行一次,必须在类中定义,只作用于本类
  • setup_method(self)
    --- 在每个类方法运行之前执行,必须定义在类中,只作用于本类
  • teardown_method(self)
    --- 在每个类方法运行之后执行,必须定义在类中,只作用于本类
  • setup_function()
    --- 会在每个方法之前执行,对类方法不生效,对非test开头的函数不生效,必须定义在类外
  • teardown_function()
    --- 会在每个方法之后执行,对类方法不生效,对非test开头的函数不生效,必须定义在类外
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容