Pytest測試框架(三):pytest fixture 用法

xUnit style 結構的 fixture用於初始化測試函數, pytest fixture是對傳統的 xUnit 架構的setup/teardown功能的改進。pytest fixture爲測試準備一個良好的測試環境,測試函數使用的每一個 fixture一般有一個參數(以 fixture 命名),測試函數經過參數訪問它們。本文將介紹pytest fixture的一些基本用法。html

@pytest.fixture

import pytest

@pytest.fixture()
def login():
    print("登陸")
    return 8

class Test_Demo():
    def test_case1(self):
        print("\n開始執行測試用例1")
        assert 1 + 1 == 2

    def test_case2(self, login):
        print("\n開始執行測試用例2")
        print(login)
        assert 2 + login == 10

    def test_case3(self):
        print("\n開始執行測試用例3")
        assert 99 + 1 == 100

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

test_case2須要調用login方法(或者獲取login的返回值),pytest 將會尋找並調用@pytest.fixture標記的login() 方法。python

結果:session

PASSED                           [ 33%]
開始執行測試用例1
登陸
PASSED                           [ 66%]
開始執行測試用例2
8
PASSED                           [100%]
開始執行測試用例3

共享 fixture 函數:conftest.py

在測試過程當中,多個測試文件可能都要調用 fixture 函數,能夠將其移動到 conftest.py 文件中。conftest.py 文件中的 fixture 函數不須要在測試函數中導入,能夠被 pytest 自動識別,查找順序從測試類開始,而後是測試模塊,而後是 conftest.py 文件,最後是內置插件和第三方插件。架構

conftest.py :框架

import pytest
@pytest.fixture()
def login():
    print("登陸")
    return 8

測試用例:函數

import pytest

class Test_Demo():
    def test_case1(self):
        print("\n開始執行測試用例1")
        assert 1 + 1 == 2

    def test_case2(self, login):
        print("\n開始執行測試用例2")
        print(login)
        assert 2 + login == 10

    def test_case3(self):
        print("\n開始執行測試用例3")
        assert 99 + 1 == 100


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

結果:測試

PASSED                           [ 33%]
開始執行測試用例1
登陸
PASSED                           [ 66%]
開始執行測試用例2
8
PASSED                           [100%]
開始執行測試用例3

yield方法

使用yield關鍵字能夠實現setup/teardown的功能,在yield關鍵字以前的代碼在case以前執行,yield以後的代碼在case運行結束後執行插件

import pytest

@pytest.fixture()
def login():
    print("登陸")
    yield
    print("退出登陸")

class Test_Demo():
    def test_case1(self):
        print("\n開始執行測試用例1")
        assert 1 + 1 == 2

    def test_case2(self, login):
        print("\n開始執行測試用例2")
        assert 2 + 8 == 10

    def test_case3(self):
        print("\n開始執行測試用例3")
        assert 99 + 1 == 100


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

結果:code

PASSED                      [ 33%]
開始執行測試用例1
登陸
PASSED                      [ 66%]
開始執行測試用例2
退出登陸
PASSED                      [100%]
開始執行測試用例3

addfinalizer方法

addfinalizer也能夠實現環境的清理,實現與yield方法相同的效果,跟yield不一樣的是須要註冊做爲終結器使用的函數。htm

import pytest

@pytest.fixture()
def login(request):
    print("登陸")
    def demo_finalizer():
        print("退出登陸")
    # 註冊demo_finalizer爲終結函數
    request.addfinalizer(demo_finalizer)

class Test_Demo():
    def test_case1(self):
        print("\n開始執行測試用例1")
        assert 1 + 1 == 2

    def test_case2(self, login):
        print("\n開始執行測試用例2")
        assert 2 + 8 == 10

    def test_case3(self):
        print("\n開始執行測試用例3")
        assert 99 + 1 == 100


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

結果:

PASSED               [ 33%]
開始執行測試用例1
登陸
PASSED               [ 66%]
開始執行測試用例2
退出登陸
PASSED               [100%]
開始執行測試用例3

fixture 做用範圍:Scope

fixture 做用範圍能夠爲module、class、session和function,默認做用域爲function。

  • function:每個函數或方法都會調用
  • class:每個類調用一次
  • module:每個.py文件調用一次
  • session:是多個文件調用一次

scope="function"

import pytest

@pytest.fixture(scope="function")
def login():
    print("登陸...")

class Test_Demo():
    def test_case1(self, login):
        print("\n開始執行測試用例1")
        assert 1 + 1 == 2

    def test_case2(self, login):
        print("\n開始執行測試用例2")
        assert 2 + 8 == 10

    def test_case3(self, login):
        print("\n開始執行測試用例3")
        assert 99 + 1 == 100

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

結果:

登陸...
PASSED                      [ 33%]
開始執行測試用例1
登陸...
PASSED                      [ 66%]
開始執行測試用例2
登陸...
PASSED                      [100%]
開始執行測試用例3

scope="class"

一個class裏面多個用例都調用了此fixture,那麼只在class裏全部用例開始前執行一次

import pytest

@pytest.fixture(scope="class")
def login():
    print("登陸...")

結果:

登陸...
PASSED                      [ 33%]
開始執行測試用例1
PASSED                      [ 66%]
開始執行測試用例2
PASSED                      [100%]
開始執行測試用例3

fixture自動應用

autouse參數

autouse設置爲True時,自動調用fixture功能。因爲默認做用域爲function,不指定scope則每一個方法都會調用fixture方法。

import pytest

@pytest.fixture(autouse=True)
def login():
    print("登陸...")

class Test_Demo():
    def test_case1(self):
        print("\n開始執行測試用例1")
        assert 1 + 1 == 2

    def test_case2(self):
        print("\n開始執行測試用例2")
        assert 2 + 8 == 10

    def test_case3(self):
        print("\n開始執行測試用例3")
        assert 99 + 1 == 100


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

結果:

登陸...
PASSED                    [ 33%]
開始執行測試用例1
登陸...
PASSED                    [ 66%]
開始執行測試用例2
登陸...
PASSED                    [100%]
開始執行測試用例3

@pytest.mark.usefixtures()

在測試方法上加@pytest.mark.usefixtures()

import pytest

@pytest.fixture()
def login():
    print("登陸...")

@pytest.mark.usefixtures("login")
class Test_Demo():
    def test_case1(self):
        print("\n開始執行測試用例1")
        assert 1 + 1 == 2

    def test_case2(self):
        print("\n開始執行測試用例2")
        assert 2 + 8 == 10

    def test_case3(self):
        print("\n開始執行測試用例3")
        assert 99 + 1 == 100


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

結果:

登陸...
PASSED                [ 33%]
開始執行測試用例1
登陸...
PASSED                [ 66%]
開始執行測試用例2
登陸...
PASSED                [100%]
開始執行測試用例3

fixture函數參數化

若是多條用例都須要調用相同參數,能夠將fixture函數參數化。fixture 函數將執行每一個參數值,fixture經過固定參數request傳遞。

import pytest

@pytest.fixture(scope="module", params=[
    [1, 1, 2],
    [2, 8, 10],
    [99, 1, 100]
])
def data(request):
    yield request.param

class Test_Demo():
    def test_case1(self):
        print("\n開始執行測試用例1")
        assert 2 + 8 == 10

    def test_case2(self, data):
        print("\n開始執行測試用例2")
        assert data[0] + data[1] == data[2]

    def test_case3(self):
        print("\n開始執行測試用例3")
        assert 99 + 1 == 100


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

結果:

PASSED                     [ 20%]
開始執行測試用例1
PASSED              [ 40%]
開始執行測試用例2
PASSED              [ 60%]
開始執行測試用例2
PASSED              [ 80%]
開始執行測試用例2
PASSED                     [100%]
開始執行測試用例3
--THE END--

文章標題:Pytest測試框架(三):pytest fixture 用法
本文做者:hiyo
本文連接:https://www.cnblogs.com/hiyong/p/14163280.html 歡迎關注公衆號:「測試開發小記」及時接收最新技術文章!

相關文章
相關標籤/搜索