1. 程式人生 > >Python中unittest 用不同的引數組合,測試同樣的行為;使test case根據引數多次執行

Python中unittest 用不同的引數組合,測試同樣的行為;使test case根據引數多次執行

在某種情況下,需要用不同的引數組合,測試同樣的行為我們希望從test case的執行結果上知道在測試什麼,而不是單單得到一個大的 test case;

此時如果僅僅寫一個test case並用內嵌迴圈來進行,那麼其中一個出了錯誤,很難從測試結果裡邊看出來問題

所以現在問題的關鍵在於是否有辦法根據輸入引數的不同組合產生出對應的test case?

譬如你有10組資料,那麼得到10個test case,這種情況當然不適用純手工的方式寫那麼多個test_成員函式。

 一種可能的思路是不利用unittest.TestCase這個類框中的test_成員函式的方法,而是自己寫runTest這個成員函式,那樣會有一些額外的工作,而且看起來不是那麼“智慧”。

那該如何讓框架自動呼叫testcase呢? 

我們的思路是:利用setattr來自動為已有的TestCase類新增成員函式 為了使這個方法湊效,需要用類的static method來生成decorate類的成員函式,並使該函式返回一個test函式物件出去 在某個地方註冊這個新增test成員函式的呼叫(只需要在實際執行前就可以,可以放在模組中自動執行亦可以手動呼叫)

dome:

# !/usr/bin/env python
# -*- coding: utf-8 -*-
import unittest


class TestCases(unittest.TestCase):

    def setUp(self):
        pass

    def action(self, arg1, arg2):
        print arg1, arg2

    @staticmethod
    def getTestFunc(arg1, arg2):
        def func(self):
            self.action(arg1, arg2)
        return func

def __generateTestCases():
    arglists = [('arg11', 'arg12'), ('arg21', 'arg22'), ('arg31', 'arg32')]
    for args in arglists:
        setattr(TestCases, 'test_func_%s_%s' % (args[0], args[1]),
                TestCases.getTestFunc(*args))
__generateTestCases()

if __name__ =='__main__':
    unittest.main()