2017-04-23 3 views
0

마지막으로 C#의 TestCase와 같은 unittest를 자동화하기 위해 파이썬에서 일부 기술을 테스트했습니다.Python unittest : 데코레이터 문제를 벗어남

일부 프레임 워크는이 기술을 지원하지만 더 자세히 파이썬을 배우기 때문에이를 이해하고 싶습니다.

다음 게시물은 (Xavier Decoret의) 훌륭한 답변을 가지고 있으므로 시도해 보았지만 결과는 매우 좋았지 만 예외없이 데코레이터를 쌓을 수는 없습니다.

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 
,536,913 : 코드 생성 예외 및 환경 내에서 두 개의 짧은

Python unittest: Generate multiple tests programmatically?

누군가가 내 문제를 이해하는 데 도움이되고 스택 가능한 솔루션을 찾을 수 있기를 바랍니다.

답변

0

복사 한 데코레이터는 그런 용도로 사용하도록 설계되지 않았습니다. 일반적으로 장식이 장식 된 기능을하지 None를 반환 할 것으로 예상된다

return None 

:

원인이 라인입니다. 그러나이 경우 데코레이터는 의도적으로 unittest가 테스트 케이스로 간주하지 않도록 함수를 반환하지 않습니다.

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

내가 하나 개의 장식으로 테스트 한 예

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

에 해당하기 때문에 좋은 점은 즉, 전혀 문제가되지 않습니다,하지만 내 이해를 나는 것 왜 두 명의 데코레이터로는 불가능한 지 알고 있습니다. 두 번 실행되는 것을 변경해야합니다. 만족스러운 결과가없는 리턴 유형의 변형을 테스트했습니다. 리턴 타입으로'method_for_parameter'를 사용할 때 테스트 프레임 워크에서 아무것도 실행되지 않습니다. –

+0

@ rené "올바른"반환 값은'method'입니다. 그러나 매개 변수를받지 않기 때문에 항상 실패 할 테스트 케이스가 추가로 생깁니다. –