[英]Unit Testing Interfaces in Python
我目前正在為一個班級的暑假學習python,並且已經開始實現不同類型的堆和基於優先級的數據結構。
我開始為項目編寫單元測試套件,但是在創建通用單元測試時遇到了困難,該測試只測試接口並且忽略了實際的實現。
我想知道是否有可能做這樣的事情..
suite = HeapTestSuite(BinaryHeap())
suite.run()
suite = HeapTestSuite(BinomialHeap())
suite.run()
我目前正在做的只是感覺......錯了(多重繼承?確認!)..
class TestHeap:
def reset_heap(self):
self.heap = None
def test_insert(self):
self.reset_heap()
#test that insert doesnt throw an exception...
for x in self.inseq:
self.heap.insert(x)
def test_delete(self):
#assert we get the first value we put in
self.reset_heap()
self.heap.insert(5)
self.assertEquals(5, self.heap.delete_min())
#harder test. put in sequence in and check that it comes out right
self.reset_heap()
for x in self.inseq:
self.heap.insert(x)
for x in xrange(len(self.inseq)):
val = self.heap.delete_min()
self.assertEquals(val, x)
class BinaryHeapTest(TestHeap, unittest.TestCase):
def setUp(self):
self.inseq = range(99, -1, -1)
self.heap = BinaryHeap()
def reset_heap(self):
self.heap = BinaryHeap()
class BinomialHeapTest(TestHeap, unittest.TestCase):
def setUp(self):
self.inseq = range(99, -1, -1)
self.heap = BinomialHeap()
def reset_heap(self):
self.heap = BinomialHeap()
if __name__ == '__main__':
unittest.main()
我個人更喜歡鼻子測試這類產品。 然后我會寫它:
# They happen to all be simple callable factories, if they weren't you could put
# a function in here:
make_heaps = [BinaryHeap, BinomialHeap]
def test_heaps():
for make_heap in make_heaps:
for checker in checkers: # we'll set checkers later
yield checker, make_heap
def check_insert(make_heap):
heap = make_heap()
for x in range(99, -1, -1):
heap.insert(x)
# def check_delete_min etc.
checkers = [
value
for name, value in sorted(globals().items())
if name.startswith('check_')]
為什么不在您要測試的類中使用別名? 您可以編寫測試類,引用假的HeapImpl
類,然后在每次測試運行之前為其分配一個特定的實現:
class TestHeap(unittest.TestCase):
def setUp(self):
self.heap = HeapImpl()
#test cases go here
if __name__ == '__main__'
suite = unittest.TestLoader().loadTestsFromTestCase(TestHeap)
heaps = [BinaryHeap, BinomialHeap]
for heap in heaps:
HeapImpl = heap
unittest.TextTestRunner().run(suite)
只要它們符合您在測試套件中使用的界面,這應該可以正常工作。 此外,您可以輕松地測試任意數量的實現,只需將它們添加到heaps
列表中即可。
我認為上述模式並不可怕,但多重繼承當然不是主意。
我猜你不能讓TestHeap成為TestCase的子類的原因是因為它會自動被選中並作為測試運行,而不知道它需要被子類化。
我已經通過另外兩種方式解決了這個問題:
__test__ = False
不吸,允許選擇將__test__ = False
設置為基類。 (見見證 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.