Mam bardzo skomplikowany plik tests.py
.Uruchamianie konkretnych testów Django (z django-nose?)
Faktycznie testy klasy i metody są generowane w czasie wykonywania w/type
(w celu uwzględnienia danych wymienionych w plikach pomocniczych). Robię rzeczy w następujący sposób (patrz poniżej, aby uzyskać więcej kodzie):
klass = type(name, (TestCase,), attrs)
setattr(current_module, name, klass)
FYI, ze zwykłymi testowej Django biegacza, wszystkie te testy się uruchomić, gdy robi ./manage.py test myapp
(dzięki setattr
przedstawionym powyżej).
Co chcę zrobić, to uruchomić tylko część tych testów, bez podawania ich nazwisk ręcznie.
Na przykład, mógłbym nadać każdemu testowi "znaczniki" w nazwach klas lub nazwach metod, aby umożliwić ich filtrowanie. Na przykład chciałbym następnie wykonać: uruchomić wszystkie testy, którego nazwa metoda zawiera ciąg znaków „test_postgres_backend_”
Próbowałem za pomocą django-nose
powodu -m
opcji nose
„s, która powinna być w stanie wybrać testy na podstawie wyrażeń regularnych, jak idealne rozwiązanie mojego problemu.
Niestety, tutaj jest to, co dzieje się przy użyciu django-nos jako biegacza testowej Django:
./manage.py test myapp
nie jest znalezienie automatycznie przeztype
-generated klas testowych (w przeciwieństwie do biegacza testowego django)- ani
./manage.py test -m ".*" myapp
ani./manage.py test myapp -m ".*"
znaleźć żadnego testu, nawet jeśli normalneTestCase
zajęcia są obecne w pliku
Więc:
- Czy masz inny rodzaj roztworu do mojego ogólnego problemu, zamiast próbować używać django-nos
-m
? - Dzięki
django-nose
, wiesz, jak sprawić, aby numer-m
zadziałał?
mcve
Dodaj poniższe linie do pustej myapp/tests.py
pliku:
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)
Jeśli czyni z tego biegu wyjściowego (w kolejności alphab) testem Django 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..
Jeśli zmienisz na django_nose
biegacz testowy, nic się nie dzieje na ./manage.py test myapp
.
Po ustaleniu tego, bym potem jak będzie w stanie uruchomić tylko metody badawcze, którego nazwa kończą się 0
(lub innego rodzaju filtrowanie regexable)
http://stackoverflow.com/questions/18834188/how-to-run-a-single-test-lub-single-testcase-with-django-nose –