2017-04-23 41 views
0

最後幾天我測試了一些python中的工具來自動化unittest,比如C#中的TestCase。Python單元測試:unterstand修飾器問題

我知道一些框架支持這個技術,但我會更詳細地學習python,所以我想理解這一點。

對我來說,以下文章有一個很好的答案(來自Xavier Decoret),所以我試了一下,結果非常好,但我無法堆砌裝飾器。

Python unittest: Generate multiple tests programmatically?

總之我的代碼,由此導致的異常和環境兩個部分:

import sys 

def for_examples(*parameters): 

    def tuplify(x): 
    if not isinstance(x, tuple): 
     return (x,) 
    return x 

    def decorator(method, parameters=parameters): 
    for parameter in (tuplify(x) for x in parameters): 

     def method_for_parameter(self, method=method, parameter=parameter): 
     method(self, *parameter) 
     args_for_parameter = ",".join(repr(v) for v in parameter) 
     name_for_parameter = method.__name__ + "(" + args_for_parameter + ")" 
     frame = sys._getframe(1) # pylint: disable-msg=W0212 
     frame.f_locals[name_for_parameter] = method_for_parameter 
    return None 
    return decorator 
import unittest 

# some magic code will be added here later 
from params import for_examples 


    class DummyTest(unittest.TestCase): 
     @for_examples(1, 2) 
     @for_examples(3, 4) 
     def test_is_smaller_than_four(self, value): 
     self.assertTrue(value < 4) 

     @for_examples((1,2),(2,4),(3,7)) 
     def test_double_of_X_is_Y(self, x, y): 
     self.assertEqual(2 * x, y) 

    if __name__ == "__main__": 
     unittest.main() 
AttributeError: 'NoneType' object has no attribute '__name__' 
Launching unittests with arguments python -m unittest test.DummyTest.test_double_of_X_is_Y in D:\rené\PycharmProjects\params 
Windws 10 Home 64-bit 
PyCharm Community Edition 2017.1.1 
Python 3.6.1 

希望有人能幫助我理解我的問題,我們可以找到一個可堆疊的解決方案。

回答

0

您複製的裝飾器的設計不是像這樣使用。

原因是這一行:

return None 

通常,裝飾有望重返裝飾功能,不None。但是,在這種情況下,裝飾者故意不返回函數,因此unittest不會將其視爲測試用例。

好事是不是在所有問題,因爲

@for_examples(1, 2) 
@for_examples(3, 4) 

相當於

@for_examples(1, 2, 3, 4) 
+0

是的,我只有一個裝飾測試,但對我的理解我會已知爲什麼不可能用兩個裝飾器。運行兩次必須更改的內容。 我已經測試了一些與返回類型沒有令人滿意的結果的變化。當我使用'method_for_parameter'作爲返回類型時,測試框架不會執行任何操作。 –

+0

@rené「正確的」返回值是'method'。但是你會有一個額外的測試用例,因爲它沒有收到任何參數,所以總會失敗。 –