[Django] Multiple Unittest Files
Django에서 유닛테스트 코드가 너무 길어서 모듈화(여러 파일로 분리?)하고 싶을 경우 이용할 수 있는 방법.
Django에서 프로젝트를 만들거나 App을 생성하면 기본적으로 Tests.py 라는 유닛테스트 파일이 생성된다. 그런데 이게 Django의 manage.py를 통해서 실행해야 되다 보니 기존 Python 방식으로 만들기엔 좀 낭패다. 그래서 Tests.py에 테스트코드를 주욱 나열하다 보니 너무 덩치가 커져 버렸다. 그래서 이런 방법을 찾아봤다는 비화가... -_-
주요 힌트는 test시 tests모듈을 import한다는 것. 즉, tests라는 디렉토리를 만들고 이 녀석을 모듈로 만들어 버리면 된다는 의미가 된다.
tests디렉토리를 만들고나서 좀 귀찮지만
이제 tests디렉토리 밑에 django 유닛테스트 파일을 만들어서 쑤셔넣고 테스트 해 보자. 되면 다행. 안되면 삽질. 하하. ㅠㅠ
참고: http://groups.google.com/group/django-developers/browse_thread/thread/5477ad69eceb56af?pli=1
ps. 이 방법을 이용하면 원래 tests.py 파일 안에서 쓰던 import문 중에 일부는 수정이 필요할 수도 있다. 당연히 파일이 위치하던 경로가 바뀌게 되니까. PYTHONPATH에 등록된 환경에 따라 적당히 import...as...로 수정하면 크게 바꿀 건 없는 듯.
Django에서 프로젝트를 만들거나 App을 생성하면 기본적으로 Tests.py 라는 유닛테스트 파일이 생성된다. 그런데 이게 Django의 manage.py를 통해서 실행해야 되다 보니 기존 Python 방식으로 만들기엔 좀 낭패다. 그래서 Tests.py에 테스트코드를 주욱 나열하다 보니 너무 덩치가 커져 버렸다. 그래서 이런 방법을 찾아봤다는 비화가... -_-
주요 힌트는 test시 tests모듈을 import한다는 것. 즉, tests라는 디렉토리를 만들고 이 녀석을 모듈로 만들어 버리면 된다는 의미가 된다.
tests디렉토리를 만들고나서 좀 귀찮지만
tests/__init__.py
를 만들고 편집하자.def mkTestMods(): from os import path, listdir names = set() for f in listdir(path.dirname(__file__)): if f.startswith('.') or \ f.startswith('__') or \ f.startswith('CVS'): continue names.add(f.split('.')[0]) for name in names: yield(name, __import__('%s.%s' % (__name__, name), {}, {}, [''])) def setup_unittest(): import unittest for name, module in mkTestMods(): for k, v in module.__dict__.iteritems(): if not (isinstance(v, type) and issubclass(v, unittest.TestCase)): continue globals()[k] = v setup_unittest()6번째 줄에서 3개 줄에 걸쳐 무시할 파일 명을 설정해 주고 있는데, 회사에서 CVS를 아직(!)도 쓰는 관계로 이 부분을 자동으로 import 못 하도록 추가한 부분도 보인다. 뭐 필요하다면 적당히 수정하면 된다...
이제 tests디렉토리 밑에 django 유닛테스트 파일을 만들어서 쑤셔넣고 테스트 해 보자. 되면 다행. 안되면 삽질. 하하. ㅠㅠ
참고: http://groups.google.com/group/django-developers/browse_thread/thread/5477ad69eceb56af?pli=1
ps. 이 방법을 이용하면 원래 tests.py 파일 안에서 쓰던 import문 중에 일부는 수정이 필요할 수도 있다. 당연히 파일이 위치하던 경로가 바뀌게 되니까. PYTHONPATH에 등록된 환경에 따라 적당히 import...as...로 수정하면 크게 바꿀 건 없는 듯.
댓글