快速解決方案將是,以提供檢查正確性一個混合:
import unittest
class Mixin(object):
def assertTrue(self, *args, **kwargs):
if len(args) > 1:
# TypeError is just an example, it could also do some warning/logging
# stuff in here.
raise TypeError('msg should be given as keyword parameter.')
super().assertTrue(*args, **kwargs)
class TestMixin(Mixin, unittest.TestCase): # Mixin before other parent classes
def test_two_things_equal(self):
self.assertTrue("a", "b")
的密新還可以檢查是否傳遞表達是一個布爾:
class Mixin(object):
def assertTrue(self, *args, **kwargs):
if type(args[0]) is bool:
raise TypeError('expression should be a boolean')
if len(args) > 1:
raise TypeError('msg should be given as keyword parameter.')
super().assertTrue(*args, **kwargs)
但是,這不是靜態的,它需要手動更改測試類(添加Mixin)並運行測試。此外,它會拋出大量的誤報,因爲將消息作爲關鍵字參數傳遞並不常見(至少不是我見過的),並且在很多情況下,您想要檢查表達式的隱含真實性而不是顯式的bool
。要檢查不-空虛if a
時a
是list
,dict
等
你也可以使用一些setUp
,teardown
代碼,改變了特定類的assertTrue
方法:
import unittest
def decorator(func):
def wrapper(*args, **kwargs):
if len(args) > 1:
raise TypeError()
return func(*args, **kwargs)
return wrapper
class TestMixin(unittest.TestCase):
def setUp(self):
self._old = self.assertTrue
self.assertTrue = decorator(self.assertTrue)
def tearDown(self):
self.assertTrue = self._old
def test_two_things_equal(self):
self.assertTrue("a", "b")
但謹慎使用這些方法之前的注意事項:在改變現有測試之前,務必小心謹慎。不幸的是,測試的記錄有時很差,所以測試和測試的方式並不總是很明顯。某些時候測試沒有意義,並且可以改變它,但有時它會以奇怪的方式測試某個特定功能,當您更改測試時會改變正在測試的內容。因此,至少要確保在更改測試用例時不會發生覆蓋範圍變化。如有必要,請確保通過更新方法名稱,方法文檔或內嵌評論來闡明測試的目的。
但萎靡不振的技術上有效的代碼可能會創造一個全新的不同的問題; *信息溢出*。 –
@ Ev.Kounis對,如果我們天真地接近它,可能會有很多誤報。我正在考慮只強制使用'msg'作爲關鍵字參數。在這種情況下,我們可能會通過警告消息未正確傳遞給斷言方法來捕獲此特定問題。我不太喜歡這個想法,但希望看看有沒有其他的想法..謝謝。 – alecxe
我強烈建議@Leon提供的答案。通過添加你知道應該失敗的測試,你會發現一個被濫用的測試用例。 –