장고 단위 테스트를 여러 파일에 분산시키는 방법은 무엇입니까?


126
  • python-django 응용 프로그램이 있습니다.
  • 단위 테스트 프레임 워크를 사용하고 있습니다.
  • 테스트는 모듈 디렉토리의 "tests.py"파일에 정렬됩니다.
  • 다음을 통해 테스트를 실행하고 있습니다. ./manage.py test app

지금..

  • tests.py파일이 오히려 큰 / 복잡한지고 / 지저분한
  • tests.py작은 테스트 모음 으로 나누고 싶습니다 ...

어떻게?

답변:


47

Django 1.6에서 동작이 변경되었으므로 더 이상 패키지를 만들 필요가 없습니다. 파일 이름 만 지정하면 test*.py됩니다.

Django 1.7 문서에서

테스트를 실행할 때 테스트 유틸리티의 기본 동작은 이름이 test로 시작하는 파일에서 모든 테스트 케이스 (즉, unittest.TestCase의 하위 클래스)를 찾고 해당 테스트 케이스에서 테스트 스위트를 자동으로 빌드하는 것입니다. 그 스위트를 실행하십시오.

에서 장고 1.6 문서 ,

테스트 검색은 unittest 모듈의 기본 제공 테스트 검색을 기반으로합니다. 기본적으로 현재 작업 디렉토리 아래의 "test * .py"파일에서 테스트를 검색합니다.

Django 1.5 문서의 이전 동작 :

테스트를 실행할 때 테스트 유틸리티의 기본 동작은 models.py 및 tests.py에서 모든 테스트 케이스 (즉, unittest.TestCase의 하위 클래스)를 찾고 해당 테스트 케이스에서 테스트 스위트를 자동으로 빌드하는 것입니다. 그 스위트를 실행하십시오.

모듈에 대한 테스트 스위트를 정의하는 두 번째 방법이 있습니다. models.py 또는 tests.py에 suite ()라는 함수를 정의하면 Django 테스트 실행기는 해당 함수를 사용하여 해당 모듈에 대한 테스트 스위트를 구성합니다. 이는 단위 테스트에 대해 제안 된 구성을 따릅니다. 복잡한 테스트 스위트를 구성하는 방법에 대한 자세한 내용은 Python 문서를 참조하십시오.


4
장고 2.6에서 정말 ... 아무것도 발견하지 않습니다
LtWorf

2
현재 장고 1.10, 나는 내 모든 넣어 원하는 사용 test*.py이라는 폴더에있는 파일을 tests이 가능하지만 실행해야합니다 - 깨끗한 폴더를 유지하기 위해 ./manage.py test app.tests모든 관련 수입 수준 (최대 갈 필요가 from .models된다 from ..models).
스캇 스티븐스

123

이 접근 방식은 Django 1.6에서 더 이상 유효하지 않습니다 . 이 게시물을 참조하십시오 .

내부에 tests폴더를 만들 수 있습니다 ___init___.py(패키지가되도록). 그런 다음 분할 테스트 .py 파일을 거기에 추가하고 ___init___.py.

즉 : test.py파일처럼 보이고 작동하는 모듈로 파일을 대체 합니다.

tests해당 앱 아래 에 디렉토리 생성

앱
app \ models.py
app \ views.py
앱 \ 테스트
app \ tests \ __ init__.py
app \ tests \ bananas.py
app \ tests \ apples.py

하위 모듈을 app\tests\__init__.py다음 으로 가져옵니다 .

from bananas import *
from apples import *

이제 ./manage.py를 단일 파일에있는 것처럼 사용할 수 있습니다.

./manage.py test app.some_test_in_bananas

1
도. 테스트중인 애플리케이션 아래에 '테스트'모듈을 만드는 것을 의미했습니다. 테스트라는 새로운 애플리케이션이 아닙니다. 이제 이해가된다. 대박. 감사!
John Mee 2011-06-08

@John : 더 이상 내 대답을 인식 할 수 없습니다! :-) 그러나 당신은 그것이 정확하더라도 너무 모호했다는 완전히 옳습니다-당신의 예는 내 원래 문구와는 반대로 명확하게 만듭니다.
Tomasz Zieliński 2011 년

2
@Tomasz .. 당신의 말은 여전히 ​​거기에 있습니다. 당신이 나를 올바른 길로 인도 한 이후로 나는 그것을 조금 구체화했습니다.
존 미는

나는 전혀 화가 아니었다 당신은 그냥 재미 좀 다른 모양에서 내 자신의 답변을보고했다 : 무슨 뜻인지 그의 경우 : @ 존
토 마즈 지린 스키를

4
@jMyles, "일반 django 테스트 러너" python manage.py test myapp가 실제로이 답변이 잘 작동한다는 것을 의미 한다면. (방금 시도)
Kirk Woll 2012

27

Tomasz가 말한 답이 맞습니다. 그러나 가져 오기가 __init__.py파일 구조와 일치 하는지 확인하는 것은 지루할 수 있습니다 .

폴더의 모든 테스트자동으로 감지 하려면 다음 위치에 추가 할 수 있습니다 __init__.py.

import unittest

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

이렇게하면 실행할 수 ./manage.py test appname있지만 특정 테스트 실행을 처리하지는 않습니다. 이를 위해 다음 코드를 사용할 수 있습니다 __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__)

이제 모든 테스트를 다음을 통해 manage.py test app또는 특정 테스트를 통해 실행할 수 있습니다.manage.py test app.TestApples


두 번째 조각은 어디에 배치합니까?
rh0dium

두 조각 모두 들어갑니다__init__.py
Bryce Drennan 2013

테스트 패키지 이름이 테스트 실행 중에 가져온 최상위 모듈 이름과 일치하는 경우 pkgutil 스 니펫은 테스트가 sys.modules[packagename]. 빠른 해결 방법은 del위의 이후에 문제를 일으키는 모든 것입니다. (또는 당신은 폴더 이름을 바꿀 수))
폴 Fenney에게

이것은 훌륭하지만 앱 수준 테스트 ( python manage.py test appName)를 실행할 때 두 번째 코드 비트에서 __path__사용할 수 없다는 오류가 발생하는 오류가 발생했습니다 . 두 번째 스 니펫을 if '__path__' in locals():수표 로 래핑하여 피했습니다 . 답변 해주셔서 감사합니다!
alukach

1
+1 이것은 또한 init 파일이 공통 코딩 표준을 준수 함을 보장합니다. 즉 * 또는 사용되지 않은 가져 오기가 없습니다
Martin B.

13

디렉토리 구조를 다음과 같이 만드십시오.

myapp/
    __init__.py
    tests/
        __init__.py
        test_one.py
        test_two.py
        ...
    ...

그리고 python manage.py test myapp예상대로 작동합니다.



2

init에서 아무것도 코딩 할 필요가 없습니다. 앱에 하위 디렉토리를 만드십시오. 유일한 요구 사항은 테스트라고 부르지 않는 것입니다 * 예를 들어

app/
app/__init_.py
app/serializers.py
app/testing/
app/testing/__init__.py
app/testing/tests_serializers.py

1
왜 그것을 "테스트"로 시작하는 것으로 부를 수 없습니까?
Serp C

이 답변을 Django 1.11.4에서 사용하고 있습니다. 사용 이유 : (1) "app / testing / __ init__.py"파일은 비어 있고 (2) 명령은 기본 "python manage.py test app"으로 유지됩니다
rprasad

2

Django 2.2를 사용하면 간단하고 상당히 좋은 해결책은 test앱 내부 에 폴더 를 만드는 것입니다. 관련 test_...py파일을 폴더에 추가 __init__.py하기 만하면 test됩니다.


1

더 복잡한 설정이 있거나 from ... import *-type 문 을 사용하지 않으려는 경우 suitetests.py (또는 tests / __ init__.py)에서 호출 된 함수를 정의하여 unittest.TestSuite.


0

나는 생각한다 ./manage.py test 단순히 모든 테스트 트릭을 실행 (django> = 1.7).

귀하의 경우 조직 검사 에 관한 그룹화체리 피킹 그리고 당신의 팬 nose을 사용 코 장고 :

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

코를 안다면 모든 파일에 대해 훨씬 더 멋지게 "와일드 카드"하는 방법을 알고있을 것입니다.

추신

더 나은 방법입니다. 도움이되기를 바랍니다. 대답은 여기에서 빌 렸습니다. 앱에 테스트 디렉터리가있을 때 Django에서 특정 테스트 케이스 실행


0

두 개의 파일이 있습니다. 하나는 tests.py이고 다른 하나는 입니다 test_api.py. 아래와 같이 개별적으로 실행할 수 있습니다.

   manage.py test companies.tests
   manage.py test companies.test_api

파일 명명 규칙에 대한 @osa의 응답을 참조하십시오.

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