Pytest官方教程-15-unittest.TestCase支持

目錄:

unittest.TestCase支持

pytest支持unittest開箱即用的基于Python 的測試。它旨在利用現有unittest的測試套件將pytest用作測試運行器,并允許逐步調整測試套件以充分利用pytest的功能。

要使用運行現有unittest樣式的測試套件pytest,請鍵入:

pytest tests

pytest將自動收集unittest.TestCase子類及其test方法test_*.py*_test.py文件。

幾乎所有unittest功能都受支持:

  • @unittest.skip 風格裝飾;
  • setUp/tearDown;
  • setUpClass/tearDownClass;
  • setUpModule/tearDownModule;

到目前為止,pytest不支持以下功能:

開箱即用的好處

通過使用pytest運行測試套件,你可以使用多種功能,在大多數情況下無需修改現有代碼:

unittest.TestCase子類中的pytest特性

以下pytest功能適用于unittest.TestCase子類:

下面pytest功能工作,也許永遠也因不同的設計理念:

第三方插件可能運行也可能不運行,具體取決于插件和測試套件。

unittest.TestCase使用標記將pytest燈具混合到子類中

運行unittest pytest允許你使用其 夾具機制進行unittest.TestCase樣式測試。假設你至少瀏覽了pytest fixture功能,讓我們跳轉到一個集成pytest db_class fixture,設置類緩存數據庫對象,然后從unittest樣式測試中引用它的示例:

# content of conftest.py

# we define a fixture function below and it will be "used" by
# referencing its name from tests

import pytest

@pytest.fixture(scope="class")
def db_class(request):
    class DummyDB(object):
        pass
    # set a class attribute on the invoking test context
    request.cls.db = DummyDB()

這定義了一個fixture函數db_class- 如果使用的話 - 為每個測試類調用一次,并將class-level db屬性設置為一個DummyDB實例。fixture函數通過接收一個特殊request對象來實現這一點,該對象允許訪問請求測試上下文,例如cls屬性,表示使用該fixture的類。該架構將夾具寫入與實際測試代碼分離,并允許通過最小參考(夾具名稱)重新使用夾具。那么讓unittest.TestCase我們使用fixture定義編寫一個實際的類:

# content of test_unittest_db.py

import unittest
import pytest

@pytest.mark.usefixtures("db_class")
class MyTest(unittest.TestCase):
    def test_method1(self):
        assert hasattr(self, "db")
        assert 0, self.db   # fail for demo purposes

    def test_method2(self):
        assert 0, self.db   # fail for demo purposes

@pytest.mark.usefixtures("db_class")類的裝飾可確保pytest固定函數db_class被調用每一次班。由于故意失敗的斷言語句,我們可以看看self.db回溯中的值:

$ pytest test_unittest_db.py
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR
collected 2 items

test_unittest_db.py FF                                               [100%]

================================= FAILURES =================================
___________________________ MyTest.test_method1 ____________________________

self = <test_unittest_db.MyTest testMethod=test_method1>

 def test_method1(self):
 assert hasattr(self, "db")
>       assert 0, self.db   # fail for demo purposes
E       AssertionError: <conftest.db_class.<locals>.DummyDB object at 0xdeadbeef>
E       assert 0

test_unittest_db.py:9: AssertionError
___________________________ MyTest.test_method2 ____________________________

self = <test_unittest_db.MyTest testMethod=test_method2>

 def test_method2(self):
>       assert 0, self.db   # fail for demo purposes
E       AssertionError: <conftest.db_class.<locals>.DummyDB object at 0xdeadbeef>
E       assert 0

test_unittest_db.py:12: AssertionError
========================= 2 failed in 0.12 seconds =========================

這個默認的pytest回溯顯示兩個測試方法共享同一個self.db實例,這是我們在編寫上面的類范圍的fixture函數時的意圖。

使用autouse燈具和訪問其他燈具

雖然通常更好地明確聲明對給定測試需要使用的燈具,但有時你可能想要在給定的上下文中自動使用燈具。畢竟,傳統的unittest-setup風格要求使用這種隱含的夾具編寫,而且很有可能,你習慣它或者喜歡它。

你可以使用標記夾具功能@pytest.fixture(autouse=True) 并在要使用它的上下文中定義夾具功能。讓我們看一個initdir夾具,它使一個TestCase類的所有測試方法都 在一個預先初始化的臨時目錄中執行samplefile.ini。我們的initdirfixture本身使用pytest builtin tmpdir fixture來委托創建一個per-test臨時目錄:

# content of test_unittest_cleandir.py
import pytest
import unittest

class MyTest(unittest.TestCase):

    @pytest.fixture(autouse=True)
    def initdir(self, tmpdir):
        tmpdir.chdir() # change to pytest-provided temporary directory
        tmpdir.join("samplefile.ini").write("# testdata")

    def test_method(self):
        with open("samplefile.ini") as f:
            s = f.read()
        assert "testdata" in s

由于該autouse標志,initdirfixture函數將用于定義它的類的所有方法。這是@pytest.mark.usefixtures("initdir")在類中使用標記的快捷方式,如上例所示。

運行此測試模塊......:

$ pytest -q test_unittest_cleandir.py
.                                                                    [100%]
1 passed in 0.12 seconds

...給我們一個通過測試,因為initdir夾具功能在之前執行test_method

注意

unittest.TestCase 方法不能直接接收fixture參數作為實現可能會導致運行通用unittest.TestCase測試套件的能力。

以上usefixturesautouse示例應該有助于將pytest燈具混合到unittest套件中。

你也可以逐步從子類化轉移unittest.TestCase普通斷言 ,然后開始逐步從完整的pytest功能集中受益。

注意

unittest.TestCase子類運行測試--pdb將禁用針對發生異常的情況的tearDown和cleanup方法。這允許對所有在其tearDown機器中具有重要邏輯的應用程序進行適當的事后調試。但是,支持此功能會產生以下副作用:如果人們覆蓋unittest.TestCase __call__或者run需要以debug相同的方式覆蓋(對于標準unittest也是如此)。

注意

由于兩個框架之間的架構差異,在unittest測試call階段而不是在pytest標準setupteardown階段中執行基于測試的設置和拆卸。在某些情況下,這一點非常重要,特別是在推理錯誤時。例如,如果unittest基于a 的套件在設置期間出現錯誤,pytest則在其setup階段期間將報告沒有錯誤, 并且將在此期間引發錯誤call。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容