2017-06-09 103 views
2

您可以請任何人解釋TestCase類和TransactionTestCase類之間的區別。我已閱讀文檔,但它只說TestCase在數據庫事務中運行測試,並使用回滾'撤消'數據庫中的測試,並且如果您需要在測試中手動管理事務,則需要使用django.test.TransactionTestCase 。django測試中的TestCase和TransactionTestCase類之間的區別

請你幫我理解一個例子的實際區別嗎? 我只想知道TestCase在什麼情況下失敗?還有回滾是自動發生的還是我們必須寫回滾語句?

請幫我

回答

2

TestCaseTransactionTestCase之間的主要區別是,TestCase封裝測試與atomic()塊所有的時間。從documentation

裹在兩個嵌套的原子()塊的測試:一個是整個班級,一個用於每個測試

現在,假設你有一個應該提高,如果一個錯誤的方法它不包裹在atomic()區塊內。您正試圖爲此編寫測試:

def test_your_method_raises_error_without_atomic_block(self): 
    with self.assertRaises(SomeError): 
     your_method() 

此測試意外失敗!原因是,你猜對了,TestCaseatomic()把所有的時間都封存在測試中。因此,your_method()不會引發錯誤,這就是測試失敗的原因。在這種情況下,您應該使用TransactionTestCase來通過測試。

select_for_update()就是一個明顯的例子:

上支持SELECT ... FOR UPDATE後端評估與select_for_update()在自動提交模式下的queryset是TransactionManagementError錯誤

TransactionTestCase documentation

帶有TestCase類,您不能測試代碼塊是否在一個transactio內執行N,如使用select_for_update()

時必需的,如果我們看一看的select_for_update()的文檔,我們看到了一個警告:

雖然select_for_update()在自動提交模式下正常失敗,因爲TestCase會自動將每個測試包裝在一個事務中,即使在一個atomic()塊之外的TestCase中調用select_for_update()方法也會(可能意外地)傳遞,而不會引發TransactionManagementError。要正確測試select_for_update(),你應該使用TransactionTestCase。

希望它有幫助!

+0

是的,它的幫助! ,我有很多疑問。顯然我無法理解交易。如果你不介意,你會給我你的聯繫方式,以便進行完美的聊天。因爲我不能在這裏聊天 –

+0

對不起,我沒有在您的個人資料中找到任何關於聯繫人的信息。這就是我在這裏問的原因。請考慮我 –

+0

@vishnumc給我發電子郵件[email protected] –

相關問題