Pytest學習筆記2-setup和teardown

RockChe發表於2021-06-21

前言

我們在做自動化的時候,常常有這樣的需求:

  • 執行每一條用例時,都重新啟動一次瀏覽器

  • 每一條用例執行結束時,都清除測試資料

在unittest中,我們可以使用 setUp() 和 tearDown() 兩個方法來實現以上需求,其中 setUp() 方法用於初始化測試韌體;而 tearDown() 方法用於銷燬測試韌體。程式會在執行每個測試用例(以 test_ 開頭的方法)之前自動執行 setUp() 方法來初始化測試韌體,井在每個測試用例(以 test_ 開頭的方法)執行完成之後自動執行 tearDown() 方法來銷燬測試韌體。

那麼如何實現只啟動一次瀏覽器,所有測試用例執行結束後再清除資料這樣的需求呢?

  • unittest提供了setUpClass()和tearDownClass()兩個方法,配合@classmethod裝飾器使用即可

作為比unittest更強大的框架,pytest自然也有類似的方法

pytest的setup/teardown方法包括:

  • 模組級別(setup_module/teardown_module)
  • 函式級別(setup_function/teardown_function)
  • 類級別(setup_class/ teardown_class)
  • 方法級別(setup_method/teardown_methond或者setup/teardown)

方法說明

模組級別

模組中的第一個用例開始前執行一次setup_module方法,模組中的最後一個測試用例結束後執行一次teardown_module方法

import pytest


def setup_module():
    print("執行setup_module")


def teardown_module():
    print("執行teardown_module")


class TestDemo(object):
    def test_case1(self):
        print("執行測試用例1")
        assert 1 + 1 == 2

    def test_case2(self):
        print("執行測試用例2")
        assert 1 + 3 == 4

    def test_case3(self):
        print("執行測試用例3")
        assert 1 + 5 == 6

執行結果如下:

image-20210621231421826

函式級別

在每個測試函式前執行一次setup_function方法,在每個測試函式結束後執行一次teardown_function方法,只對函式用例生效,不在類中。

import pytest


def setup_function():
    print("執行setup_function")


def teardown_function():
    print("執行teardown_function")


def test_case1():
    print("執行測試用例1")
    assert 1 + 1 == 2


def test_case2():
    print("執行測試用例2")
    assert 1 + 3 == 4


def test_case3():
    print("執行測試用例3")
    assert 1 + 5 == 6

執行結果如下:

image-20210621231355291

類級別

setup_class/teardown_class 對類有效,位於類中,在執行測試類之前和之後各呼叫一次

import pytest


class TestDemo(object):
    def setup_class(self):
        print("執行setup_class")

    def teardown_class(self):
        print("執行teardown_class")

    def test_case1(self):
        print("執行測試用例1")
        assert 1 + 1 == 2

    def test_case2(self):
        print("執行測試用例2")
        assert 1 + 3 == 4

    def test_case3(self):
        print("執行測試用例3")
        assert 1 + 5 == 6

執行結果如下:

image-20210621231310442

方法級別

setup_method/teardown_method和setup/teardown,在測試類中每個測試方法前後呼叫一次。這兩個方法效果是一樣的

import pytest


class TestDemo(object):
    def setup_method(self):
        print("執行setup_method")

    def teardown_method(self):
        print("執行teardown_method")

    def test_case1(self):
        print("執行測試用例1")
        assert 1 + 1 == 2

    def test_case2(self):
        print("執行測試用例2")
        assert 1 + 3 == 4

    def test_case3(self):
        print("執行測試用3")
        assert 1 + 5 == 6

執行結果如下:

image-20210621231121966

四種級別混合使用

如果把這四種級別的方法混合使用,執行順序如何呢?

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_a():
    print("執行測試函式a")


def test_b():
    print("執行測試函式b")


class TestDemo(object):
    def setup_class(self):
        print("測試類開始時,執行setup_class")

    def teardown_class(self):
        print("測試類結束時,執行teardown_class")

    def setup_method(self):
        print("類中的方法開始時,執行setup_method")

    def teardown_method(self):
        print("類中的方法結束時,執行teardown_method")

    def test_case1(self):
        print("執行測試用例1")
        assert 1 + 1 == 2

    def test_case2(self):
        print("執行測試用例2")
        assert 1 + 3 == 4

    def test_case3(self):
        print("執行測試用例3")
        assert 1 + 5 == 6

執行結果如下:

image-20210621233905952

總結

  • 模組級(setup_module/teardown_module)開始於模組始末,全域性的
  • 函式級(setup_function/teardown_function)只對函式用例生效(不在類中)
  • 類級(setup_class/teardown_class)只在類中前後執行一次(在類中)
  • 方法級(setup_method/teardown_method或setup/teardown)開始於方法始末(在類中)

相關文章