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成員函數的調用(只須要在實際執行前就能夠,能夠放在模塊中自動執行亦能夠手動調用)

#實現測試

# -*- coding: utf-8 -*-

import unittest


class MyTestCase(unittest.TestCase):
    def setUp(self):
        pass

    def action(self, arg1, arg2):
        pass

    def tearDown(self):
        pass

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

        return func


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


generate_cases()

if __name__ == '__main__':
    unittest.main()
相關文章
相關標籤/搜索