簡體   English   中英

Python中的單元測試接口

[英]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的子類的原因是因為它會自動被選中並作為測試運行,而不知道它需要被子類化。

我已經通過另外兩種方式解決了這個問題:

  1. 不是添加test_函數,而是使用不會自動獲取的write方法,然后將test()添加到每個子類中。 顯然不理想。
  2. __test__ = False不吸,允許選擇將__test__ = False設置為基類。 (見見證

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM