문제

명령 줄 인수를 받아들이는 코 테스트 스크립트를 실행하고 싶습니다. 예를 들어, 선을 따라 무언가 :

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top