일반적인 테스트 디렉토리 구조로 unittest 실행 테스트를 실행하는 일반적인 방법은 무엇입니까? 나는

간단한 파이썬 모듈조차도 매우 일반적인 디렉토리 구조는 단위 테스트를 자체 test디렉토리 로 분리하는 것 같습니다 .

new_project/
    antigravity/
        antigravity.py
    test/
        test_antigravity.py
    setup.py
    etc.

예를 들어이 Python 프로젝트 howto 를 참조하십시오 .

내 질문은 단순히 실제로 테스트를 실행하는 일반적인 방법은 무엇입니까? 나는 이것이 나를 제외한 모든 사람에게 명백한 것으로 생각하지만 모듈이 경로에 없으므로 python test_antigravity.py테스트 디렉토리에서 실행할 수 없습니다 import antigravity.

나는 PYTHONPATH 및 기타 검색 경로 관련 트릭을 수정할 수 있다는 것을 알고 있지만 이것이 가장 간단한 방법이라고 믿을 수는 없습니다. 통과.

다른 대안은 테스트 파일을 다른 디렉토리에 복사하는 것입니다.하지만 약간 바보처럼 보이고 별도의 디렉토리에 파일을 넣는 요점을 놓칩니다.

소스를 내 새 프로젝트에 다운로드 한 경우 어떻게 단위 테스트를 실행합니까? “사용자에게 단위 테스트를 실행하려면 X를 수행하십시오.”라는 대답을 원합니다.



답변

내 생각에 가장 좋은 해결책은 unittest 명령 줄 인터페이스 를 사용하여 디렉토리를 추가 sys.path할 필요가 없으므로 TestLoader클래스 에서 수행하지 않아도됩니다 .

예를 들어 다음과 같은 디렉토리 구조

new_project
├── antigravity.py
└── test_antigravity.py

당신은 그냥 실행할 수 있습니다 :

$ cd new_project
$ python -m unittest test_antigravity

귀하와 같은 디렉토리 구조의 경우 :

new_project
├── antigravity
   ├── __init__.py         # make it a package
   └── antigravity.py
└── test
    ├── __init__.py         # also make test a package
    └── test_antigravity.py

test패키지 내부의 테스트 모듈에서 antigravity평소와 같이 패키지 및 해당 모듈을 가져올 수 있습니다 .

# import the package
import antigravity

# import the antigravity module
from antigravity import antigravity

# or an object inside the antigravity module
from antigravity.antigravity import my_object

단일 테스트 모듈 실행

이 경우 단일 테스트 모듈을 실행하려면 다음을 수행하십시오 test_antigravity.py.

$ cd new_project
$ python -m unittest test.test_antigravity

테스트 모듈을 가져 오는 것과 같은 방식으로 참조하십시오.

단일 테스트 사례 또는 테스트 방법 실행

또한 단일 TestCase또는 단일 테스트 방법을 실행할 수 있습니다 .

$ python -m unittest test.test_antigravity.GravityTestCase
$ python -m unittest test.test_antigravity.GravityTestCase.test_method

모든 테스트 실행

테스트 검색 을 사용하여 모든 테스트를 검색하고 실행할 수 있습니다. 모듈이나 패키지라는 이름이어야합니다 test*.py( -p, --pattern플래그 로 변경할 수 있음 ).

$ cd new_project
$ python -m unittest discover
$ # Also works without discover for Python 3
$ # as suggested by @Burrito in the comments
$ python -m unittest

패키지 test*.py내부의 모든 모듈 이 실행 test됩니다.


답변

사용자를위한 가장 간단한 솔루션 runtests.py은 필요한 경우 루트 프로젝트 디렉토리를 sys.path임시로 추가하는 등 필요한 테스트 환경을 부트 스트랩 하는 실행 스크립트 ( 또는 그와 유사한 스크립트)를 제공하는 것 입니다. 이것은 사용자가 환경 변수를 설정할 필요가 없으며 부트 스트랩 스크립트에서 다음과 같이 작동합니다.

import sys, os

sys.path.insert(0, os.path.dirname(__file__))

그러면 사용자에게 ” python runtests.py” 처럼 간단하게 지시 할 수 있습니다 .

물론, 실제로 필요한 경로가 인 경우 os.path.dirname(__file__)전혀 추가 할 필요가 없습니다 sys.path. 파이썬은 항상 현재 실행중인 스크립트의 디렉토리를의 시작 부분에 넣습니다. sys.path따라서 디렉토리 구조 runtests.py에 따라 올바른 위치에 위치하는 것이 필요할 수 있습니다.

또한 Python 2.7+unittest 모듈 ( Python 2.6 및 이전 버전의 unittest2 로 백 포트 됨 )에는 테스트 검색 기능이 내장되어 있으므로 자동 테스트 검색을 원할 경우 더 이상 코가 필요하지 않습니다. 사용자 지침은 다음과 같이 간단 할 수 있습니다. python -m unittest discover.


답변

필자는 일반적으로 프로젝트 디렉토리 (소스 디렉토리와 공통 디렉토리 test)에 “모든 테스트”제품군을로드 하는 “테스트 실행”스크립트를 작성합니다 . 이것은 일반적으로 상용구 코드이므로 프로젝트마다 재사용 할 수 있습니다.

run_tests.py :

import unittest
import test.all_tests
testSuite = test.all_tests.create_test_suite()
text_runner = unittest.TextTestRunner().run(testSuite)

test / all_tests.py ( 디렉토리에서 모든 Python 단위 테스트어떻게 실행합니까? )

import glob
import unittest

def create_test_suite():
    test_file_strings = glob.glob('test/test_*.py')
    module_strings = ['test.'+str[5:len(str)-3] for str in test_file_strings]
    suites = [unittest.defaultTestLoader.loadTestsFromName(name) \
              for name in module_strings]
    testSuite = unittest.TestSuite(suites)
    return testSuite

이 설정을 사용하면 include antigravity테스트 모듈 에서만 가능 합니다. 단점은 특정 테스트를 실행하기 위해 더 많은 지원 코드가 필요하다는 것입니다 … 나는 매번 실행합니다.


답변

링크 한 기사에서 :

test_modulename.py 파일을 만들고 unittest 테스트를 넣으십시오. 테스트 모듈은 코드와 별도의 디렉토리에 있으므로 모듈의 상위 디렉토리를 PYTHONPATH에 추가하여 실행해야 할 수 있습니다.

$ cd /path/to/googlemaps

$ export PYTHONPATH=$PYTHONPATH:/path/to/googlemaps/googlemaps

$ python test/test_googlemaps.py

마지막으로, 파이썬을위한 대중적인 단위 테스팅 프레임 워크가 있습니다. nose는 내장 된 단위 테스트 프레임 워크를 단순화하고 확장하는 데 도움이되지만 (예를 들어 자동으로 테스트 코드를 찾고 PYTHONPATH를 설정할 수 있음) 표준 Python 배포에는 포함되어 있지 않습니다.

아마 당신은 제안한대로 를 봐야 합니까?


답변

별도의 단위 테스트 폴더로 동일한 문제가 발생했습니다. 언급 된 제안에서에 절대 소스 경로 를 추가합니다 sys.path.

다음 솔루션의 장점은 test/test_yourmodule.py테스트 디렉토리로 처음 변경하지 않고 파일 을 실행할 수 있다는 것입니다 .

import sys, os
testdir = os.path.dirname(__file__)
srcdir = '../antigravity'
sys.path.insert(0, os.path.abspath(os.path.join(testdir, srcdir)))

import antigravity
import unittest


답변

“python setup.py develop”을 실행하면 패키지가 경로에있게됩니다. 그러나 시스템 파이썬 설치를 감염시킬 수 있으므로 virtualenvbuildout 과 같은 도구 가 존재 하기 때문에 그렇게하지 않을 수도 있습니다.


답변

Python unittest 모듈 솔루션 / 예

다음과 같은 프로젝트 구조가 주어집니다.

ProjectName
 ├── project_name
 |    ├── models
 |    |    └── thing_1.py
 |    └── __main__.py
 └── test
      ├── models
      |    └── test_thing_1.py
      └── __main__.py

당신과 루트 디렉토리에서 프로젝트를 실행할 수 python project_name있는 호출을 ProjectName/project_name/__main__.py.


python test효과적으로 실행하여 테스트를 실행하려면 ProjectName/test/__main__.py다음을 수행해야합니다.

1) 파일 test/models을 추가 하여 디렉토리를 패키지로 바꾸 십시오 __init__.py. 그러면 하위 디렉토리 내의 테스트 사례가 상위 test디렉토리 에서 액세스 할 수 있습니다 .

# ProjectName/test/models/__init__.py

from .test_thing_1 import Thing1TestCase        

2) 디렉토리 test/__main__.py를 포함하도록 시스템 경로를 수정하십시오 project_name.

# ProjectName/test/__main__.py

import sys
import unittest

sys.path.append('../project_name')

loader = unittest.TestLoader()
testSuite = loader.discover('test')
testRunner = unittest.TextTestRunner(verbosity=2)
testRunner.run(testSuite)

이제 project_name테스트에서 항목을 성공적으로 가져올 수 있습니다 .

# ProjectName/test/models/test_thing_1.py    

import unittest
from project_name.models import Thing1  # this doesn't work without 'sys.path.append' per step 2 above

class Thing1TestCase(unittest.TestCase):

    def test_thing_1_init(self):
        thing_id = 'ABC'
        thing1 = Thing1(thing_id)
        self.assertEqual(thing_id, thing.id)