pytest fixtures裝飾器的使用

劍尊發表於2021-01-27

一、pytest中可以使用@pytest.fixture 裝飾器來裝飾一個方法,被裝飾方法的方法名可以作為一個引數傳入到測試方法中。可以使用這種方式來完成測試之前的初始化,也可以返回資料給測試函式。

將fixture作為函式引數

通常使用setup和teardown來進行資源的初始化,如果有這樣一個場景,測試用例1需要依賴登入功能,測試用例2不需要依賴登入功能,測試用例3需要登入功能,這種場景setup,teardown無法實現,也可以使用pytest fixture功能,在這個方法前面加個@pytest.fixture裝飾器,加了這個裝飾器的方法可以以引數的形式傳到方法裡,這個方法就會先執行這個登入方法,再去執行自身的用例步驟,如果沒有傳入這個登入方法就不執行登入操作,直接執行已有的步驟

#!/usr/bin/env python
# _*_coding: utf-8 _*_
import pytest


@pytest.fixture()
def login():
    print("這時一個登入的方法")
    return ('tome', '123')


@pytest.fixture()
def operate():
    print("這是登入後的操作")


def test_case1(login, operate):
    print(login)
    print("test_case1,需要登入")


def test_case2():
    print("test_case2,不需要登入")


def test_case3(login):
    print(login)
    print("test_case3,需要登入")

在上面的程式碼中,測試用例test_case1 和test_case3 分別增加了login 方法名作為引數,pytest會發現並呼叫@pytest.fixture標記的login功能,執行測試結果如下:

Testing started at 10:17 ...
C:\Python\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1\helpers\pycharm\_jb_pytest_runner.py" --path C:/Users/wanwen/PycharmProjects/vigo/xuexi/20210123/test_fixture.py
Launching pytest with arguments C:/Users/wanwen/PycharmProjects/vigo/xuexi/20210123/test_fixture.py in C:\Users\wanwen\PycharmProjects\vigo\xuexi\20210123
============================= test session starts =============================
platform win32 -- Python 3.8.0, pytest-5.4.3, py-1.9.0, pluggy-0.13.1
rootdir: C:\Users\wanwen\PycharmProjects\vigo\xuexi\20210123
plugins: html-2.1.1, metadata-1.11.0, ordering-0.6collected 3 items

test_fixture.py 這時一個登入的方法
這是登入後的操作
.('tome', '123')
test_case1,需要登入
.test_case2,不需要登入
這時一個登入的方法
.('tome', '123')
test_case3,需要登入
                                                      [100%]

============================== 3 passed in 0.04s ==============================

Process finished with exit code 0

從上面結果可以看出,test_case1 和test_case3 執行之前執行了login方法,test_case2沒有執行這個方法。

相關文章