명령 줄 인수가있는 코 테스트 스크립트
-
11-09-2019 - |
문제
명령 줄 인수를 받아들이는 코 테스트 스크립트를 실행하고 싶습니다. 예를 들어, 선을 따라 무언가 :
test.py
import nose, sys
def test():
# do something with the command line arguments
print sys.argv
if __name__ == '__main__':
nose.runmodule()
그러나 명령 줄 인수로 이것을 실행할 때마다 오류가 발생합니다.
$ python test.py arg
E
======================================================================
ERROR: Failure: ImportError (No module named arg)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 368, in loadTestsFromName
module = resolve_name(addr.module)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/nose-0.11.1-py2.6.egg/nose/util.py", line 334, in resolve_name
module = __import__('.'.join(parts_copy))
ImportError: No module named arg
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
분명히 코는 Sys.argv에서 통과 된 논쟁으로 무언가를하려고합니다. 코가 그 주장을 무시할 수있는 방법이 있습니까?
해결책
좋아, 나는 왜 "왜 그렇게하고 싶니?" 누구만큼이나 대답하지만, 나는 여기서 하나를 만들어야 할 것입니다. 나는 당신이 신경 쓰지 않기를 바랍니다.
나는 당신이하고 싶은 일을하는 것이 프레임 워크 코의 범위 내에 있지 않다고 주장합니다. 코는 용 의도 된 것입니다 자동화 테스트. 테스트가 통과하기 위해 명령 줄 인수를 통과 해야하는 경우 자동화되지 않습니다. 자, 당신은 ~할 수 있다 다음과 같은 것입니다.
import sys
class test_something(object):
def setUp(self):
sys.argv[1] = 'arg'
del sys.argv[2] # remember that -s is in sys.argv[2], see below
def test_method(self):
print sys.argv
당신이 그것을 실행하면, 당신은이 출력을 얻습니다.
[~] nosetests test_something.py -s
['/usr/local/bin/nosetests', 'arg']
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
(stdout에 무슨 일이 일어나는지보고 싶다면 -s 플래그를 통과해야합니다)
그러나 나는 아마도 그것을 피할 수 있다면 자동 테스트에서 글로벌 상태를 엉망으로 만드는 것이 일반적으로 나쁜 생각이기 때문에 여전히 권장 할 것입니다. 내가 할 수있는 것은 내가 테스트하고 싶은 코드를 조정하는 것입니다. argv
목록. 그런 다음 테스트 중에 원하는 것을 전달하고 통과 할 수 있습니다. sys.argv
생산 중.
업데이트:
내가해야 할 이유는 동일한 라이브러리의 여러 구현을 테스트하고 있기 때문입니다. 이러한 구현을 테스트하기 위해 올바른 것이 좋습니다. 단일 코 스크립트를 사용하여 테스트를 위해 가져와야하는 라이브러리를 명령 줄 인수로 받아들입니다.
코 플러그인을 작성하는 데 손을 시험해 볼 수있을 것 같습니다. 매우 쉽습니다. 다음은 최신 문서입니다.
다른 팁
코드에 물건을 가져 오는 다른 수단을 사용할 수 있습니다.
import os
print os.getenv('KEY_THAT_MIGHT_EXIST', default_value)
그런 다음 코를 달리기 전에 환경을 설정하는 것을 잊지 마십시오.
나는 그것이 완벽하게 수용 가능한 시나리오라고 생각합니다. 또한 다른 시나리오 (Dev, QA, Prod 등)에 대해 테스트를 실행하기 위해 비슷한 작업을 수행해야했으며 각 환경에 맞는 URL과 구성이 필요했습니다.
내가 찾은 해결책은 코 테스트 콘피드 플러그인 (여기 링크). 명령 줄 인수가 정확히 전달되는 것이 아니라 모든 매개 변수가있는 구성 파일을 작성한 다음 코 테스트를 실행할 때이 구성 파일을 인수로 전달합니다.
구성 파일에는 다음 형식이 있습니다.
[group1]
env=qa
[urlConfig]
address=http://something
[dbConfig]
user=test
pass=test
그리고 당신은 다음을 사용하여 인수를 읽을 수 있습니다.
from testconfig import config
print(config['dbConfig']['user'])
지금은 다음 해킹을 사용하고 있습니다.
args = sys.argv[1:]
sys.argv = sys.argv[0:1]
인수를 로컬 변수로 읽은 다음 모든 추가 인수를 삭제합니다. sys.argv
그래서 코는 그들에 의해 혼란스러워지지 않습니다.
코를 달리고 매개 변수를 통과하는 것만으로는 코가 인수를 코 매개 변수로 해석하려고 시도하여보고있는 문제를 얻을 수 있습니다.
나는 코지지 매개 변수가 아직 직접 통과한다고 생각하지 않지만이 코 플러그인 코 테스트 콘피드 아래와 같은 테스트를 작성할 수 있습니다.
from testconfig import config
def test_os_specific_code():
os_name = config['os']['type']
if os_name == 'nt':
pass # some nt specific tests
else:
pass # tests for any other os