Bootstrap

pytest教程-7-用例前后置方法

上一小节,我们学习了pytest跳过测试用例的方法,本小节我们讲解一下pytest用例的前后置方法。

在unittest中就有前置setup和后置teardown来处理测试用例执行前的准备工作(浏览器驱动实例化,数据库连接等)以及执行后的处理工作(清理数据,关闭浏览器驱动,关闭数据库连接等),那么pytest同样也提供了前置后置的方法来满足这个需求。

pytest提供了以下5个前置后置方法:

  • setup_module、teardown_module(模块级别):整个py文件,测试用例执行前后只执行一次
  • setup_class、teardown_class:(类级别):整个测试类中,测试用例执行前后只执行一次
  • setup、teardown(函数级别):每条用例执行前后都会执行一次,既可以作用于类中测试函数,也可以作用于类外测试函数
  • setup_method、teardown_method(方法级别):每条用例执行前后都会执行一次,只作用于类中测试函数
  • setup_function、teardown_function(函数级别):每条用例执行前后都会执行一次,只作用于类外测试函数使用

1、setup_module、teardown_module(模块级别)示例

#test_demo.py

import pytest


class Test_04:
    def test_01(self):
        print('用例01执行')

    def test_02(self):
        print('用例02执行')


def test_03():
    print('类外用例03执行')


def setup_module():
    print('\n我是setup_module前置执行\n')


def teardown_module():
    print('\n我是teardown_module后置执行')


def test_04():
    print('类外用例04执行')


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

运行结果如下:整个py文件,测试用例执行前后只执行了一次

Launching pytest with arguments D:\PycharmProjects\Source_Code\pytest_demo\test_demo.py --no-header --no-summary -q in D:\PycharmProjects\Source_Code\pytest_demo

============================= test session starts =============================
collecting ... collected 4 items

test_demo.py::Test_04::test_01 
我是setup_module前置执行

PASSED                                    [ 25%]用例01执行

test_demo.py::Test_04::test_02 PASSED                                    [ 50%]用例02执行

test_demo.py::test_03 PASSED                                             [ 75%]类外用例03执行

test_demo.py::test_04 PASSED                                             [100%]类外用例04执行

我是teardown_module后置执行


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

2、setup_class、teardown_class:(类级别)示例

import pytest


class Test_04:
    def test_01(self):
        print('用例01执行')

    def setup_class(self):
        print('\n我是setup_class前置执行\n')

    def teardown_class(self):
        print('\n我是teardown_class后置执行')

    def test_02(self):
        print('用例02执行')


def test_03():
    print('类外用例03执行')


def test_04():
    print('类外用例04执行')


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

运行结果如下:整个测试类中,测试用例执行前后只执行了一次

============================= test session starts =============================
collecting ... collected 4 items

test_demo.py::Test_04::test_01 
我是setup_class前置执行

PASSED                                    [ 25%]用例01执行

test_demo.py::Test_04::test_02 PASSED                                    [ 50%]用例02执行

我是teardown_class后置执行

test_demo.py::test_03 PASSED                                             [ 75%]类外用例03执行

test_demo.py::test_04 PASSED                                             [100%]类外用例04执行


============================== 4 passed in 0.02s ==============================

3.1、setup、teardown(函数级别) 作用于类中测试函数 示例

import pytest


class Test_04:
    def setup(self):
        print('\nsetup前置执行\n')

    def teardown(self):
        print('\nteardown后置执行\n')

    def test_01(self):
        print('用例01执行')

    def test_02(self):
        print('用例02执行')


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

运行结果如下:每条用例执行前后都会执行一次,既可以作用于类中测试函数

============================= test session starts =============================
collecting ... collected 2 items

test_demo.py::Test_04::test_01 
setup前置执行

PASSED                                    [ 50%]用例01执行

teardown后置执行


test_demo.py::Test_04::test_02 
setup前置执行

PASSED                                    [100%]用例02执行

teardown后置执行



======================== 2 passed, 4 warnings in 0.03s ========================

3.2、setup、teardown(函数级别) 作用于类外测试函数 示例

import pytest


def setup():
    print('\n类外setup前置执行\n')


def teardown():
    print('\n类外teardown后置执行\n')


def test_03():
    print('类外用例03执行')


def test_04():
    print('类外用例04执行')


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

运行结果如下:每条用例执行前后都会执行一次,也可以作用于类外测试函数


test_demo.py::test_03 
类外setup前置执行

PASSED                                             [ 50%]类外用例03执行

类外teardown后置执行


test_demo.py::test_04 
类外setup前置执行

PASSED                                             [100%]类外用例04执行

类外teardown后置执行



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

4、setup_method、teardown_method(方法级别)示例

import pytest


class Test_04:
    def setup_method(self):
        print('\nsetup_method前置执行\n')

    def teardown_method(self):
        print('\nteardown_method后置执行\n')

    def test_01(self):
        print('用例01执行')

    def test_02(self):
        print('用例02执行')


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

运行结果如下:每条用例执行前后都会执行一次,只作用于类中测试函数

============================= test session starts =============================
collecting ... collected 2 items

test_demo.py::Test_04::test_01 
setup_method前置执行

PASSED                                    [ 50%]用例01执行

teardown_method后置执行


test_demo.py::Test_04::test_02 
setup_method前置执行

PASSED                                    [100%]用例02执行

teardown_method后置执行



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

5、setup_function、teardown_function(函数级别)示例

import pytest

class Test_04:
    def test_01(self):
        print('用例01执行')
    def test_02(self):
        print('用例02执行')

def setup_function():
    print('\nsetup_function前置执行\n')
def teardown_function():
    print('\nteardown_function后置执行\n')

def test_03():
    print('类外用例03执行')
def test_04():
    print('类外用例04执行')

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

运行结果如下:每条用例执行前后都会执行一次,只作用于类外测试函数使用

============================= test session starts =============================
collecting ... collected 4 items

test_demo.py::Test_04::test_01 PASSED                                    [ 25%]用例01执行

test_demo.py::Test_04::test_02 PASSED                                    [ 50%]用例02执行

test_demo.py::test_03 
setup_function前置执行

PASSED                                             [ 75%]类外用例03执行

teardown_function后置执行


test_demo.py::test_04 
setup_function前置执行

PASSED                                             [100%]类外用例04执行

teardown_function后置执行



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

前、后置执行顺序

1、测试类中前、后置执行顺序 示例

import pytest

class Test_04:
    def setup(self):
        print('setup前置执行')
    def teardown(self):
        print('teardown后置执行')
    def setup_class(self):
        print('\nsetup_class前置执行\n')
    def teardown_class(self):
        print('\nteardown_class后置执行\n')
    def setup_method(self):
        print('setup_method前置执行')
    def teardown_method(self):
        print('teardown_method后置执行')

    def test_01(self):
        print('用例01执行')
    def test_02(self):
        print('用例02执行')


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

运行结果如下:前置执行顺序:setup_class > setup_method > setup (后置执行顺序则相反)

============================= test session starts =============================
collecting ... collected 2 items

test_demo.py::Test_04::test_01 
setup_class前置执行

setup_method前置执行
PASSED                                    [ 50%]用例01执行
teardown_method后置执行

test_demo.py::Test_04::test_02 setup_method前置执行
PASSED                                    [100%]用例02执行
teardown_method后置执行

teardown_class后置执行



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

2、测试类外前、后置执行顺序 示例

import pytest


def setup():
    print('类外setup前置执行')


def teardown():
    print('类外teardown后置执行')


def setup_function():
    print('\nsetup_function前置执行\n')


def teardown_function():
    print('\nteardown_function后置执行\n')


def setup_module():
    print('\nsetup_module前置执行\n')


def teardown_module():
    print('teardown_module后置执行')


def test_03():
    print('类外用例03执行')


def test_04():
    print('类外用例04执行')


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

运行结果如下:前置执行顺序:setup_module > setup_function > setup (后置执行顺序则相反)
 

test_demo.py::test_03 
setup_module前置执行


setup_function前置执行

类外setup前置执行
PASSED                                             [ 50%]类外用例03执行
类外teardown后置执行

teardown_function后置执行


test_demo.py::test_04 
setup_function前置执行

类外setup前置执行
PASSED                                             [100%]类外用例04执行
类外teardown后置执行

teardown_function后置执行

teardown_module后置执行


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

总结:

1、测试类中:setup_class、teardown_class

setup_method、teardown_method

测试类外:setup_function、teardown_function

setup_module、teardown_module

测试类中、类外均可:setup、teardown

2、执行顺序:

类中前置执行顺序:setup_class > setup_method > setup (后置执行顺序则相反)

类外前置执行顺序:setup_module > setup_function > setup (后置执行顺序则相反)


最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走,希望可以帮助到大家!

;