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


165

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

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

답변:


156

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

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

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

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

감사합니다 @ sdolan. hekevintran과 같은 문제가 발생했습니다. django-nose로 전환하여 문제를 해결했으며 기본 Django 테스트 러너보다 훨씬 잘 작동합니다.
LeeMobile

이것은 테스트를 실행하지만 전체 TestCase를 실행하는 방법은 무엇입니까?
jMyles

5
@jMyles :another.test:TestCase
Sam Dolan

4
Stackoverflow에서 맹목적으로 붙여 넣는 사람들과 같은 사람들의주의 : 언급 된 플러그인없이 오류가 발생합니다 .Django 1.6 이상에서 작동하는 다른 답변 (: 대신 :.)에 설명 된 구문을 사용하십시오.
Andy Smith

1
이 답변은 OP의 질문에 실제로 답변하지 않기 때문에 Django 에서이 작업을 수행하는 방법이었습니다. 오히려, 그것은 단지 Nosetest로 전환 할 것을 제안합니다
Josh Brown

175

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 설명서를 참조하십시오


장고에 내장 된이 기능을 만나서 반갑습니다.
hekevintran

나는 전혀 작업이 얻을 수 없습니다 : error: option --pattern not recognizedinvalid command name
geoidesic

이것은 장고 v3에서 잘 작동합니다!
커크

11

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

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

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

from field_tests import *
from storage_tests import *

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




3

이 코드를 __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")

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.