[python] 앱에 tests 디렉토리가있을 때 Django에서 특정 테스트 케이스 실행

Django 설명서 ( http://docs.djangoproject.com/en/1.3/topics/testing/#running-tests )에 따르면 다음과 같이 지정하여 개별 테스트 사례를 실행할 수 있다고합니다.

$ ./manage.py test animals.AnimalTestCase

이것은 Django 응용 프로그램의 tests.py 파일에 테스트가 있다고 가정합니다. 이것이 사실이면이 명령은 예상대로 작동합니다.

tests 디렉토리에 Django 애플리케이션에 대한 테스트가 있습니다.

my_project/apps/my_app/
├── __init__.py
├── tests
   ├── __init__.py
   ├── field_tests.py
   ├── storage_tests.py
├── urls.py
├── utils.py
└── views.py

tests/__init__.py파일은 스위트 () 함수가 있습니다 :

import unittest

from my_project.apps.my_app.tests import field_tests, storage_tests

def suite():
    tests_loader = unittest.TestLoader().loadTestsFromModule
    test_suites = []
    test_suites.append(tests_loader(field_tests))
    test_suites.append(tests_loader(storage_tests))
    return unittest.TestSuite(test_suites)

내가하는 테스트를 실행하려면 :

$ ./manage.py test my_app

개별 테스트 사례를 지정하려고하면 예외가 발생합니다.

$ ./manage.py test my_app.tests.storage_tests.StorageTestCase
...
ValueError: Test label 'my_app.tests.storage_tests.StorageTestCase' should be of the form app.TestCase or app.TestCase.test_method

예외 메시지가 말한 것을하려고했습니다.

$ ./manage.py test my_app.StorageTestCase
...
ValueError: Test label 'my_app.StorageTestCase' does not refer to a test

테스트가 여러 파일에있을 때 개별 테스트 사례를 어떻게 지정합니까?



답변

체크 아웃은 장고 – 코를 . 다음과 같이 실행할 테스트를 지정할 수 있습니다.

python manage.py test another.test:TestCase.test_method

또는 주석에서 언급했듯이 다음 구문을 사용하십시오.

python manage.py test another.test.TestCase.test_method


답변

Django 1.6부터 실행하려는 요소에 대한 완전한 점 표기법을 사용하여 완전한 테스트 사례 또는 단일 테스트를 실행할 수 있습니다.

자동 테스트 검색은 작업 디렉토리 아래에서 test로 시작하는 모든 파일에서 테스트를 찾으 므로 파일 이름을 바꿔야하는 질문을 해결하지만 원하는 디렉토리 안에 유지할 수 있습니다. 커스텀 파일 이름을 사용하려면 옵션 플래그를 사용하여 패턴 (기본 장고 테스트 러너)을 지정할 수 있습니다 --pattern="my_pattern_*.py".

당신이 당신에 따라서 경우 manage.py디렉토리와 테스트를 실행하려면 test_a내부 TestCase서브 클래스를 A파일 내부 tests.py응용 프로그램에서 / 모듈 example당신이 할 것입니다 :

python manage.py test example.tests.A.test_a

의존성을 포함하고 싶지 않고 Django 1.6 이상에 있다면 그렇게하는 방법입니다.

자세한 내용은 Django 설명서를 참조하십시오


답변

나는이 문제를 직접 겪고 있었고 다른 사람이 올 경우를 대비 하여이 질문을 찾았습니다. DjangoTestSuiteRuner는 build_test (label)라는 메소드를 사용하여 레이블을 기반으로 실행할 테스트 케이스를 파악합니다. 이 방법을 살펴보면 “models”또는 “test”모듈에서 getattr ()을 수행하는 것으로 나타났습니다. 즉, 스위트를 반환하면 테스트 러너가 해당 스위트에서 테스트 케이스를 찾지 않고 해당 모듈 중 하나만 찾습니다.

빠른 해결 방법 __init__.py은 제품군을 정의하는 대신 테스트를 직접 가져 오는 것입니다. 이렇게하면 “test”모듈의 일부가되므로 build_test (label)에서 찾을 수 있습니다.

위의 예에서 tests/__init__.py간단히 다음을 포함해야합니다.

from field_tests import *
from storage_tests import *

이것은 매우 우아하지 않으며 물론 스위트로 더 복잡한 것을하려고하면 작동하지 않지만이 경우에는 효과가 있습니다.


답변

이 작동합니다

python manage.py test my_app.tests.storage_tests


답변

나는 또한이 문제에 부딪 쳤고 django-nose 대신 http://www.pioverpi.net/2010/03/10/organizing-django-tests-into-folders/ 링크를 따라갔습니다 . init 을 열어야합니다 .py 테스트를 가져와야합니다.

init .py의 예 :from unique_test_file import *


답변

이 코드를 __init__.py에 넣으면 패키지 및 하위 패키지의 모든 테스트 클래스를 가져옵니다. 이렇게하면 모든 파일을 수동으로 가져 오지 않고도 특정 테스트를 실행할 수 있습니다.

import pkgutil
import unittest

for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
    module = loader.find_module(module_name).load_module(module_name)
    for name in dir(module):
        obj = getattr(module, name)
        if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase):
            exec ('%s = obj' % obj.__name__)

마찬가지로 테스트 스위트의 경우 다음을 간단히 사용할 수 있습니다.

def suite():
    return unittest.TestLoader().discover("appname.tests", pattern="*.py")

이제 새로운 테스트를 위해해야 ​​할 일은 테스트를 작성하고 테스트 폴더에 있는지 확인하는 것입니다. 수입품을 더 이상 지루하게 유지하지 않아도됩니다!


답변