2011년 2월 14일 월요일

[Django] Multiple Unittest Files

Django에서 유닛테스트 코드가 너무 길어서 모듈화(여러 파일로 분리?)하고 싶을 경우 이용할 수 있는 방법.

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...로 수정하면 크게 바꿀 건 없는 듯.

댓글 없음 :