0

我一直在使用DDT爲我的測試參數化過去幾個月取得了巨大成功。我現在的問題是,我似乎無法注入一個列表變量作爲我的數據源。這樣做似乎混淆了DDT,導致它無法對我的測試進行參數化。我開始創建自己的解決方案,但我似乎無法弄清楚最後一部分。使用裝飾器動態添加測試方法

這裏是我迄今作爲裝飾 -

而且我用它作爲這樣 -

@c 
class IntegrationTests(APITestCase): 
    tickets = [1, 2, 3, 4] 

    @data(tickets) 
    def tes(self, t): 
     print(t) 

我怎樣才能讓Python測試框架承認,我已經通過添加設計師嗎?我知道這些方法已被添加,因爲在PDB中發出dir命令顯示它們。這樣做的目標是我將複製我爲列表中的每個項目裝飾的測試。對於那些想知道爲什麼wrapper()沒有代碼,我這樣做是因爲取消註釋行的返回調用會導致我裝飾的方法在沒有參數的情況下執行,從而導致錯誤。

在我的例子中,我期望4個不同名字的測試被執行。

+1

你有python 3.4嗎?最好的方式來實現你想要的是子測試 - https://docs.python.org/3/library/unittest.html#distinguishing-test-iterations-using-subtests – Dunes 2014-11-06 16:07:20

+0

我是!沒有想法的子測試甚至是一件事情。如果您發佈,我會接受您的答案。謝謝。 – 2014-11-06 16:34:40

回答

3

最好的解決方案是在python 3.4中使用unittest的子測試功能。文檔發現here和使用,如:

class NumbersTest(unittest.TestCase): 

    def test_even(self): 
     """ 
     Test that numbers between 0 and 5 are all even. 
     """ 
     for i in range(0, 6): 
      with self.subTest(i=i): 
       self.assertEqual(i % 2, 0) 

對於那些誰不能使用Python 3.4,下面是一個窮人的替代品。

class sub_test_data(object): 

    def __init__(self, *test_data): 
     self.test_data = test_data 

    def __call__(self, func): 
     func.sub_test_data = self.test_data 
     func.has_sub_tests = True 
     return func 

def create_test_driver(func, *args): 
    def test_driver(self): 
     try: 
      func(self, *args) 
     except AssertionError as e: 
      e.args += ({"test_args": args},) 
      raise 
    return test_driver 

def create_sub_tests(cls): 
    for attr_name, func in list(vars(cls).items()): 
     if getattr(func, "has_sub_tests", False): 
      for i, value in enumerate(func.sub_test_data): 
       test_name = 'test_{}_subtest{}'.format(attr_name, i) 
       setattr(cls, test_name, create_test_driver(func, value)) 
    return cls 

@create_sub_tests 
class NumbersTest(unittest.TestCase): 
    tickets = [0, 1, 2, 3, 4, 5] 

    @sub_test_data(*tickets) 
    def even(self, t): 
     self.assertEqual(t % 2, 0) 
+0

哇!如果我能的話會+2。 – 2014-11-06 17:09:39