2012-11-23 2 views
-1

argv에서 eval()을 호출 한 변수를 할당 한 저품질 코드를 프로토 타입 화하고 있지 않습니다. argv는 외부 파일에서 그 값을 가져 왔습니다. API 키. 놀랍게도 그것은 나쁘게 단위 테스트를 망쳤습니다 (아무도 달리지 않았습니다). 여기 이상한 동작으로 unittest가 깨졌습니다.

내가 범인이라고 믿는 코드 조각입니다 :

:

from sys import argv 
from apikeys import * 


def setKey(the_key=DCK): 
    global CK 
    CK = the_key # Currently used key 

if len(argv) == 1: 
    print('---Executing script. Enter optional arguments if you wish to use special API keys.---') 
    setKey() 
elif len(argv) > 1: 
    setKey(eval(argv[1])) 

TOKEN = rget(DOMAIN+'signin', params={'key':CK}).json['response']['token'] 
PARAMS = {'signature':TESTSIG, 'token':TOKEN} 

# Rest of the code uses unittests which rely on PARAMS. 

그래서 내가 내 스크립트를 테스트 할 값입니다으로 키가 들어있는 변수 중 하나 통과, 다음 역 추적을 생산

[[email protected] dv1/tests]# python 2test_api2.py ANDROID_FILMS_KEY 
Traceback (most recent call last): 
    File "2test_api2.py", line 604, in <module> 
    unittest.main() 
    File "/usr/lib/python2.6/site-packages/unittest2/main.py", line 97, in __init__ 
    self.parseArgs(argv) 
    File "/usr/lib/python2.6/site-packages/unittest2/main.py", line 152, in parseArgs 
    self.createTests() 
    File "/usr/lib/python2.6/site-packages/unittest2/main.py", line 161, in createTests 
    self.module) 
    File "/usr/lib/python2.6/site-packages/unittest2/loader.py", line 148, in loadTestsFromNames 
    suites = [self.loadTestsFromName(name, module) for name in names] 
    File "/usr/lib/python2.6/site-packages/unittest2/loader.py", line 142, in loadTestsFromName 
    raise TypeError("don't know how to make test from: %s" % obj) 
TypeError: don't know how to make test from: 9b269ac759211de6b3c8b238bd758ccf 

9b269ac759211de6b3c8b238bd758ccf는 기본적으로 평가 (ANDROID_FILMS_KEY)를 실행하고 올바르게 별도의 스크립트는 setkey 기능을 실행 한 결과이다 CK에 API 키를 할당

문자열 '9b269ac759211de6b3c8b238bd758ccf'로

키커는 다음과 같습니다 : 단위 테스트를 받아야하는 메소드를 포함하고있는 클래스에서 CK와 PARAMS를 사용하면 놀랍게도 unittest가 9b269ac759211de6b3c8b238bd758ccf를 문자열로 간주하지 않는다고 말하는 기괴한 예외가 발생합니다.

+0

로컬 변수를 얻기 위해'eval'을 사용하고 있습니까? 'locals() [variable]'는 어떻습니까? – katrielalex

+0

@katrielalex : 질문은 작동하기 위해이 코드를 다시 작성하는 방법이 아니라 사소한 것입니다. "unittest가 eval()을 올바르게 처리 할 수없는 이유"와 비슷합니다. – GSP

답변

1

또한 당신이 from the command line을 테스트하기 위해로드 모듈을 제한 할 수 있도록, sys.argv을 검사 unittest2 로더.

여기서 로더는 9b269ac759211de6b3c8b238bd758ccf이라는 테스트 모듈을 찾고 있습니다.

대신 unittest에서 sys.argv을 조작해야합니다. 그것은 당신이 바꿀 수있는 표준 파이썬리스트입니다. 또한, 기본적으로, 당신은 sys.argv[1:]로 부르는 main(args) 함수를 만들 :

def main(args): 
    if not args: 
     print('---Executing script. Enter optional arguments if you wish to use special API keys.---') 
     setKey() 
    else: 
     setKey(eval(args[0])) 

if __name__ == '__main__': 
    import sys 
    main(sys.argv[1:]) 

을 지금 당신은 당신의 테스트 스크립트에 인수를 전달에 의존하지 않고 다른 인수 main()을 테스트 할 수 있습니다.

+0

9b269ac759211de6b3c8b238bd758ccf라는 테스트 모듈은 어디에서 찾으십니까? unittest의 site-packages 또는 실행 된 스크립트가있는 dir? – GSP

+0

@GSP : 파이썬 모듈 경로 (로컬 디렉토리 포함)를 살펴 보겠습니다. 모듈에서'load_tests' 함수를 찾습니다 (명령 행에서 전달한 경우). –

관련 문제