2020-12-03 pytest在django中使用的幾個案例

問題背景

在寫一些工具類的時候吕喘,需要將實例化的django Model(大致上可以理解為表格中的數(shù)據(jù)行)作為參數(shù)傳入胳挎,原生的unittest在VSCode上的支持上感覺不是很好,就嘗試了一下pytest前酿。挺好用的杠河,同時還發(fā)現(xiàn)了它還支持一個更便捷的方式郭毕,編寫大量檢驗邏輯相同的單元測試案例,讓最近被單元測試困擾的我頓時醍醐灌頂般驚醒刘急。代碼范例如下(案例一二與django相關(guān)棚菊,二更加通用,三為批量寫單元測試的案例):
注:以下的一些描述僅方便個人理解叔汁,如有錯誤歡迎評論區(qū)指正统求。

案例一: django混入真實的數(shù)據(jù)記錄

fixture大致可以理解為在某一個作用域/階段[scope]預(yù)執(zhí)行的一些函數(shù),一般的fixture只要寫好function定義就會在恰當(dāng)?shù)臅r機被調(diào)用
其中作用于function yield類的fixture似乎需要將定義好的function傳入test_function的參數(shù)才會被啟用据块,同時可以將yield的object傳給test_function码邻,
而且可以做到類似unittest的setUp/tearDown的作用——在yield之前的命令將會預(yù)先執(zhí)行(setUp),yield之后的命令則在test_function結(jié)束后執(zhí)行(tearDown)

import pytest

from .models import MyModel
@pytest.fixture(scope="class")
def django_db_setup(): # The name must be django_db_setup
    pass
@pytest.fixture(scope="function")
def real_record():
    # Start setting up for a test function
    # similar-to setUp for scope="function" when real_record is passed as a parameter to a test function
    record = MyModel.objects.get(id=1)
    # end setting up for function
    yield record
    # Start tearing down for a test function
    # similar-to tearDown
    pass # do something afterwards

class TestRealRecord:
    @pytest.mark.django_db
    def test_real_record(self, real_record):
        assert real_record.id == 1

案例二: django混入虛擬的數(shù)據(jù)記錄(實際上就是混入一個實例化的class)

如果不想連接數(shù)據(jù)庫瑰钮,只是寫一些虛擬的參數(shù)冒滩,但同時還想要保留Model的其他方法可以在測試時被調(diào)用,可以直接使用function yield fixture將實例化的Model傳入test function

import pytest

from .models import MyModel

@pytest.fixture(scope="function")
def simulated_record():
    record = MyModel(id=9527)
    yield record
class TestSimulatedRecord:
    def test_simulated_record(self, simulated_record):
        assert simulated_record.id == 9527

案例三浪谴、批量生成測試

利用pytest.mark.parametrize可以對同一類檢驗邏輯的測試案例快速編寫單元測試开睡,可以被VSCode識別為折疊后的一組測試,展開折疊后還可以對批量生成的單個測試案例進行調(diào)試苟耻。解鎖快速生成單元測試的技能篇恒,讓TDD(Test Driven Development)更加便捷。
以下每一個tuple()內(nèi)的一組變量將被傳入test function作為一個測試案例凶杖,所有的幾個測試案例將會被分為一組折疊到VSCode的Test界面里胁艰。

import pytest  

class TestBatchRecord:
    @pytest.mark.parametrize(
        'expression, answer, correct',
        [
            ("1+1", 2, True),
            ("2+2", 3, False),
        ]
    )
    def test_parametrize(self, expression, answer, correct):
        if correct:
            assert eval(expression) == answer
        else:
            assert eval(expression) != answer

案例四、數(shù)據(jù)庫只讀測試

直接在開發(fā)機器的數(shù)據(jù)庫中進行測試智蝠,可以結(jié)合已有的真實數(shù)據(jù)進行相對準確的讀取相關(guān)的測試

import pytest

@pytest.fixture
def django_db_setup(django_db_blocker):
    from django.conf import settings
    settings.DATABASES['default']['NAME'] = 'db-name-in-develop-machine'

def TestTasksCollection:
    @pytest.mark.django_db
    def test_task_1(self):
        pass
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腾么,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子杈湾,更是在濱河造成了極大的恐慌解虱,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漆撞,死亡現(xiàn)場離奇詭異殴泰,居然都是意外死亡于宙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門悍汛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捞魁,“玉大人,你說我怎么就攤上這事离咐∑准螅” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵健霹,是天一觀的道長旺上。 經(jīng)常有香客問我,道長糖埋,這世上最難降的妖魔是什么宣吱? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮瞳别,結(jié)果婚禮上征候,老公的妹妹穿的比我還像新娘。我一直安慰自己祟敛,他們只是感情好疤坝,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著馆铁,像睡著了一般跑揉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上埠巨,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天历谍,我揣著相機與錄音,去河邊找鬼辣垒。 笑死望侈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勋桶。 我是一名探鬼主播脱衙,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼例驹!你這毒婦竟也來了捐韩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤鹃锈,失蹤者是張志新(化名)和其女友劉穎奥帘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仪召,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡寨蹋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扔茅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片已旧。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖召娜,靈堂內(nèi)的尸體忽然破棺而出运褪,到底是詐尸還是另有隱情,我是刑警寧澤玖瘸,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布秸讹,位于F島的核電站,受9級特大地震影響雅倒,放射性物質(zhì)發(fā)生泄漏璃诀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一蔑匣、第九天 我趴在偏房一處隱蔽的房頂上張望劣欢。 院中可真熱鬧,春花似錦裁良、人聲如沸凿将。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牧抵。三九已至,卻和暖如春侨把,著一層夾襖步出監(jiān)牢的瞬間犀变,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工座硕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弛作,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓华匾,卻偏偏與公主長得像映琳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蜘拉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容