Django4.0 進(jìn)階測(cè)試主題-TransactionTestCase 高級(jí)特性

2022-03-17 11:59 更新

TransactionTestCase.available_apps

默認(rèn)情況下,?available_apps ?是設(shè)置為 ?None?。每次測(cè)試后,Django 都會(huì)調(diào)用 ?flush ?來重置數(shù)據(jù)庫狀態(tài)。這將清空所有表,并發(fā)出 ?post_migrate ?信號(hào),為每個(gè)模型重新創(chuàng)建一個(gè)內(nèi)容類型和四個(gè)權(quán)限。這個(gè)操作的花費(fèi)和模型的數(shù)量成正比。
將 ?available_apps ?設(shè)置為應(yīng)用程序列表會(huì)指示 Django 的行為就像只有這些應(yīng)用程序的模型是可用的一樣。?TransactionTestCase ?的行為改變?nèi)缦拢?br>

  • ?post_migrate ?在每次測(cè)試前都會(huì)被觸發(fā),以創(chuàng)建可用應(yīng)用中每個(gè)模型的內(nèi)容類型和權(quán)限,以防它們?nèi)笔А?/li>
  • 每次測(cè)試后,Django 只清空可用應(yīng)用中模型對(duì)應(yīng)的表。但在數(shù)據(jù)庫層面,清空表可能會(huì)級(jí)聯(lián)到不可用應(yīng)用中的相關(guān)模型。此外 ?post_migrate ?并沒有被觸發(fā),它將在選擇了正確的應(yīng)用集后,由下一個(gè) ?TransactionTestCase ?觸發(fā)。

由于數(shù)據(jù)庫沒有完全刷新,如果測(cè)試創(chuàng)建了沒有包含在 ?available_apps ?中的模型實(shí)例,它們就會(huì)泄漏,并可能導(dǎo)致不相關(guān)的測(cè)試失敗。小心使用了會(huì)話的測(cè)試;默認(rèn)的會(huì)話引擎將它們存儲(chǔ)在數(shù)據(jù)庫中。
由于 ?post_migrate ?在刷新數(shù)據(jù)庫后并沒有發(fā)出,所以它在一個(gè) ?TransactionTestCase ?后的狀態(tài)與一個(gè) ?TestCase ?后的狀態(tài)是不一樣的:它丟失了由 ?post_migrate ?監(jiān)聽器創(chuàng)建的行??紤]到 執(zhí)行測(cè)試的順序,這并不是一個(gè)問題,只要給定的測(cè)試套件中的所有 ?TransactionTestCase ?都聲明 ?available_apps?,或者都沒有聲明。
?available_apps ?在 Django 自己的測(cè)試套件中是強(qiáng)制性的。

TransactionTestCase.reset_sequences

在 ?TransactionTestCase ?上設(shè)置 ?reset_sequences = True? 將確保隊(duì)列在測(cè)試運(yùn)行前總是被重置:

class TestsThatDependsOnPrimaryKeySequences(TransactionTestCase):
    reset_sequences = True

    def test_animal_pk(self):
        lion = Animal.objects.create(name="lion", sound="roar")
        # lion.pk is guaranteed to always be 1
        self.assertEqual(lion.pk, 1)

除非明確測(cè)試主鍵序列號(hào),否則建議你不要在測(cè)試中硬編碼主鍵值。
使用 ?reset_sequences = True? 會(huì)減慢測(cè)試速度,因?yàn)橹麈I重置是一個(gè)相對(duì)昂貴的數(shù)據(jù)庫操作。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)