У меня очень сложный файл tests.py
.
Собственно, классы тестов и методы генерируются во время выполнения w/ type
(для учета данных, перечисленных во вспомогательных файлах). Я делаю вещи следующим образом (см. Ниже для получения более кода):
klass = type(name, (TestCase,), attrs)
setattr(current_module, name, klass)
FYI, с обычным тестовым бегуном django, все эти тесты запускаются при выполнении ./manage.py test myapp
(благодаря показанному выше setattr
).
Я хочу выполнить только часть этих тестов, не перечисляя их имена вручную.
Например, я могу дать каждому тегу "теги" в именах классов или именах методов, чтобы я мог их фильтровать. Например, я бы выполнил: запустите все тесты, имя метода содержит строку "test_postgres_backend _"
Я попытался использовать django-nose
из-за опции nose
-m
, которая должна иметь возможность выбирать тесты на основе регулярных выражений - идеальное решение моей проблемы.
К сожалению, вот что происходит при использовании django-носа в качестве тест-лидера django:
-
./manage.py test myapp
не находит автоматическиtype
-генерированные тестовые классы (в отличие от тестового бегуна django) - ни
./manage.py test -m ".*" myapp
, ни./manage.py test myapp -m ".*"
найдите ЛЮБОЙ тест, , даже если обычные нормальныеTestCase
классы присутствуют в файле
Итак:
- У вас есть другое решение моей общей проблемы, вместо того, чтобы пытаться использовать django-nose
-m
? - С
django-nose
, знаете ли вы, как сделать работу-m
?
mcve
Добавьте в пустой файл myapp/tests.py
следующее:
from django.test import TestCase
from sys import modules
current_module = modules[__name__]
def passer(self, *args, **kw):
self.assertEqual(1, 1)
def failer(self, *args, **kw):
self.assertEqual(1, 2)
# Create a hundred ...
for i in xrange(100):
# ... of a stupid TestCase class that has 1 method that passes if `i` is
# even and fails if `i` is odd
klass_name = "Test_%s" % i
if i % 2: # Test passes if even
klass_attrs = {
'test_something_%s' % i: passer
}
else: # Fail if odd
klass_attrs = {
'test_something_%s' % i: failer
}
klass = type(klass_name, (TestCase,), klass_attrs)
# Set the class as "child" of the current module so that django test runner
# finds it
setattr(current_module, klass_name, klass)
Если делает для этого выходного запуска (в порядке alphab) django test runnner: F.F.F.F.F.F.FF.F.F.F.F..F.F.F.F.F.FF.F.F.F.F..F.F.F.F.F.FF.F.F.F.F..F.F.F.F.F.FF.F.F.F.F..F.F.F.F.F..
Если вы перейдете на django_nose
test runner, ничего не произойдет на ./manage.py test myapp
.
После исправления этого, я бы хотел, чтобы он мог запускать только те методы тестирования, имена которых заканчиваются символом 0
(или какой-либо другой тип фильтрации с возможностью повторного поиска)