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

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

지금..

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

어떻게?



답변

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


답변

이 접근 방식은 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


답변

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


답변

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

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

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


답변

http://docs.python.org/library/unittest.html#organizing-tests 는 파일을 모듈로 분할하는 방법에 대해 설명하며 바로 위에있는 섹션에 예제가 있습니다.


답변

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

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


답변

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