Я пишу специальный тестовый прогон для своего проекта, который просматривает дерево проекта, импортирует все модули, просматривает классы в каждом модуле, ищет подклассы unittest.TestCase и добавляет их все в TestSuite, затем запускает их. Таким образом, я могу отфильтровать django.contrib и включить некоторые из моих собственных unittest.TestCases, которые manage.py игнорирует (потому что их нет в myapp / tests.py и т. Д.)
Я только что написал это, и он, несомненно, полон ошибок, но на сегодняшний день это выглядит так:
from inspect import getmembers, isclass
import os
from os.path import join, relpath
import sys
from unittest import TestCase, TestLoader, TestSuite, TextTestRunner
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.test.utils import setup_test_environment
sys.path.append('..')
def import_module(modname):
print modname
try:
__import__(modname)
return sys.modules[modname]
except Exception as e:
print
print ' %s: %s' % (type(e).__name__, e)
def get_modules(root):
for subdir, dirs, fnames in os.walk(root):
for fname in fnames:
if fname.endswith('.py'):
path = relpath(join(subdir, fname))
modname = path.replace('/', '.')[:-3]
if modname.endswith('__init__'):
modname = modname[:-9]
if modname == '':
continue
yield import_module(modname)
def get_testcases(module):
for name, value in getmembers(module):
if isclass(value) and issubclass(value, TestCase) and value is not TestCase:
print ' ', name, value
yield value
def main():
setup_test_environment()
testcases = set()
for module in get_modules(os.getcwd()):
for klass in get_testcases(module):
testcases.add(klass)
print 'found %d testcases' % (len(testcases),)
suite = TestSuite()
for case in testcases:
suite.addTest(TestLoader().loadTestsFromTestCase(case))
print 'loaded %d tests' % (suite.countTestCases(),)
TextTestRunner(verbosity=2).run(suite)
if __name__ == '__main__':
main()