『德不孤』Pytest框架 — 10、setUp()和tearDown()函式

繁華似錦Fighting發表於2022-03-12

1、setUp()和tearDown()函式介紹

之前學過Unittest測試框架,知道前置setup()函式和後置teardown()函式非常好用,在每次用例開始前和結束後都去執行一次。

當然還有更高階一點的setupClass()函式和teardownClass()函式,需配合classmethod裝飾器一起使用,在做Selenium自動化的時候,它的效率尤為突出,可以只啟動一次瀏覽器執行多個用例。

2、setUp()和tearDown()函式作用

  • setup()函式主要是進行測試前的初始化工作,比如:在介面測試前面做一些前置的引數賦值,資料庫操作等等。
  • teardown()函式是測試後的清除工作,比如:引數還原或銷燬,資料庫的還原恢復等。

總結:setup()函式表示測試類中每個測試方法執行前都需要執行的操作,teardown()函式表示每個測試方法執行後都需要執行的操作。

3、setUp()和tearDown()函式說明

Pytest框架也有前置setup()函式和後置teardown()函式,並且還不止四個。

Pytest框架setUp()函式和tearDown()函式主要分為:模組級,類級,方法級,函式級。

說明每個級別的含義:

模組級:指的是一個.py檔案。

類級:一個.py檔案中可以寫多個類。(一般情況下只寫一個類)

方法級:類中定義的方法叫方法。

函式級:類外定義的方法叫函式。

Pytest框架提供的setUp()函式和tearDown()函式如下:

1)模組級與函式級,不定義在測試類中。

  • 模組級:setup_module()/teardown_module():開始於模組始末,全域性的。
  • 函式級:setup_function()/teardown_function():只對函式用例生效(不在類中)。

2)類級與方法級,定義在類中。

  • 類級:setup_class()/teardown_class():只在類中前後執行一次(在類中)。
  • 方法級:setup_method()/teardown_method():開始於方法始末(在類中)。
  • 自由的:setup()/teardown():直接使用感覺和方法級前後置函式一樣。

4、示例

(1)方法級

"""
setup_method()和 teardown_method()函式
需要定義在測試類中,定義在類外不起作用。
setup_method()定義場景,如:開啟瀏覽器,載入網頁等
teardown_method()場景,如:關閉瀏覽器等
"""
import pytest

# 測試類
class Test_setUp_tearDown:

    # 方法級,前置函式
    def setup_method(self):
        print("setup_method(self):在每個測試方法之前執行")


    # 方法級,後置函式
    def teardown_method(self):
        print("teardown_method(self):在每個測試方法之後執行\n")


    # 測試用例a
    def test_a(self):
        print("test_a方法")
        assert True

    # 測試用例b
    def test_b(self):
        print("test_b方法")
        assert True


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

"""
執行結果:

setup_method(self):在每個測試方法之前執行
test_a方法
teardown_method(self):在每個測試方法之後執行

PASSEDsetup_method(self):在每個測試方法之前執行
test_b方法
teardown_method(self):在每個測試方法之後執行
"""

(2)類級

"""
setup_class()和 teardown_class()函式
需要定義在測試類中,定義在類外不起作用。
setup_class()定義場景,比如:建立日誌物件,建立資料庫的連線,建立介面的請求物件等。
teardown_class()定義場景,比如:銷燬日誌物件,銷燬資料庫的連線,銷燬介面的請求物件。
"""

import pytest


class Test_setUp_tearDown:

    # 方法級,前置函式
    def setup_method(self):
        print("setup_method(self):在每個測試方法之前執行")

    # 方法級,後置函式
    def teardown_method(self):
        print("teardown_method(self):在每個測試方法之後執行\n")

    # 類級,前置函式
    def setup_class(self):
        print("setup_class(self):每個測試類之前執行一次\n")

    # 類級,後置函式
    def teardown_class(self):
        print("teardown_class(self):每個測試類之後執行一次")

    # 測試用例a
    def test_a(self):
        print("test_a方法")
        assert True

    # 測試用例b
    def test_b(self):
        print("test_b方法")
        assert True


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

"""
執行結果:

setup_class(self):每個測試類之前執行一次

setup_method(self):在每個測試方法之前執行
test_a方法
teardown_method(self):在每個測試方法之後執行

PASSEDsetup_method(self):在每個測試方法之前執行
test_b方法
teardown_method(self):在每個測試方法之後執行

teardown_class(self):每個測試類之後執行一次
"""

(3)函式級

"""
setup_function()和 teardown_function()函式
需要定義在測試類外面,只負責函式的前後置。
對類中定義的方法,不起作用。
"""

import pytest

# 函式級,前置函式
def setup_function():
    print("setup_function: 每個函式開始前都會執行")

# 函式級,後置函式
def teardown_function():
    print("teardown_function: 每個函式結束都會執行\n")


# 測試用例a
def test_a():
    print("test_a函式")
    assert True


# 測試用例b
def test_b():
    print("test_b函式")
    assert True

# 測試類
class Test_setUp_tearDown:

    # 測試用例a
    def test_c(self):
        print("test_c方法")
        assert True

    # 測試用例b
    def test_d(self):
        print("test_d方法")
        assert True


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

"""
執行結果:
setup_function: 每個函式開始前都會執行
test_a函式
teardown_function: 每個函式結束都會執行

PASSEDsetup_function: 每個函式開始前都會執行
test_b函式
teardown_function: 每個函式結束都會執行

PASSEDtest_c方法
PASSEDtest_d方法
PASSED

"""

(4)模組級

"""
setup_module()和 teardown_module()函式
需要定義在測試類外面,
對函式和類中定義的方法,都不起作用。
"""

import pytest


# 模組級,前置函式
def setup_module():
    print("setup_module():在模組最之前執行\n")


# 模組級,後置函式
def teardown_module():
    print("teardown_module:在模組之後執行")


# 函式級,前置函式
def setup_function():
    print("setup_function: 每個函式開始前都會執行")


# 函式級,後置函式
def teardown_function():
    print("teardown_function: 每個函式結束都會執行\n")


# 測試用例a
def test_a():
    print("test_a函式")
    assert True


# 測試用例b
def test_b():
    print("test_b函式")
    assert True


# 測試類
class Test_setUp_tearDown:

    # 測試用例a
    def test_c(self):
        print("test_c方法")
        assert True

    # 測試用例b
    def test_d(self):
        print("test_d方法")
        assert True


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

"""
setup_module():在模組最之前執行

setup_function: 每個函式開始前都會執行
test_a函式
teardown_function: 每個函式結束都會執行

PASSEDsetup_function: 每個函式開始前都會執行
test_b函式
teardown_function: 每個函式結束都會執行

PASSEDtest_c方法
PASSEDtest_d方法
teardown_module:在模組之後執行
PASSED
"""

參考:https://blog.csdn.net/weixin_42550871/article/details/109107673

相關文章