W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
默認情況下,?available_apps
?是設(shè)置為 ?None
?。每次測試后,Django 都會調(diào)用 ?flush
?來重置數(shù)據(jù)庫狀態(tài)。這將清空所有表,并發(fā)出 ?post_migrate
?信號,為每個模型重新創(chuàng)建一個內(nèi)容類型和四個權(quán)限。這個操作的花費和模型的數(shù)量成正比。
將 ?available_apps
?設(shè)置為應(yīng)用程序列表會指示 Django 的行為就像只有這些應(yīng)用程序的模型是可用的一樣。?TransactionTestCase
?的行為改變?nèi)缦拢?br>
post_migrate
?在每次測試前都會被觸發(fā),以創(chuàng)建可用應(yīng)用中每個模型的內(nèi)容類型和權(quán)限,以防它們?nèi)笔А?/li>post_migrate
?并沒有被觸發(fā),它將在選擇了正確的應(yīng)用集后,由下一個 ?TransactionTestCase
?觸發(fā)。由于數(shù)據(jù)庫沒有完全刷新,如果測試創(chuàng)建了沒有包含在 ?available_apps
?中的模型實例,它們就會泄漏,并可能導致不相關(guān)的測試失敗。小心使用了會話的測試;默認的會話引擎將它們存儲在數(shù)據(jù)庫中。
由于 ?post_migrate
?在刷新數(shù)據(jù)庫后并沒有發(fā)出,所以它在一個 ?TransactionTestCase
?后的狀態(tài)與一個 ?TestCase
?后的狀態(tài)是不一樣的:它丟失了由 ?post_migrate
?監(jiān)聽器創(chuàng)建的行??紤]到 執(zhí)行測試的順序,這并不是一個問題,只要給定的測試套件中的所有 ?TransactionTestCase
?都聲明 ?available_apps
?,或者都沒有聲明。
?available_apps
?在 Django 自己的測試套件中是強制性的。
在 ?TransactionTestCase
?上設(shè)置 ?reset_sequences = True
? 將確保隊列在測試運行前總是被重置:
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)
除非明確測試主鍵序列號,否則建議你不要在測試中硬編碼主鍵值。
使用 ?reset_sequences = True
? 會減慢測試速度,因為主鍵重置是一個相對昂貴的數(shù)據(jù)庫操作。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: