Как запускать имена тестов Django, не выводя слишком много логов
Я хочу запускать тесты в моем проекте Django, отображая названия тестов, но без отображения результатов регистрации миграций базы данных.
Если я не передаю флаг -v 2
, то я не вижу имен тестов, которые я хочу видеть:
$ python manage.py run test
Found 1 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.053s
OK
Destroying test database for alias 'default'...
Однако если я передам флаг -v 2
, чтобы увеличить уровень многословности, то я увижу и имена тестов, и информацию из журнала миграции базы данных:
$ python manage.py test -v 2
Found 1 test(s).
Creating test database for alias 'default' ('test_projectname')...
Operations to perform:
Synchronize unmigrated apps: allauth, django_browser_reload, django_extensions, forms, google, hijack, hijack_admin, messages, runserver_nostatic, simple_deploy, staticfiles
Apply all migrations: account, admin, auth, contenttypes, sessions, sites, socialaccount
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Running migrations:
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0001_initial... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
# ... cut for brevity
System check identified no issues (0 silenced).
test_hello (projectname.test_login.LoginTest.test_hello) ... ok
----------------------------------------------------------------------
Ran 1 test in 0.046s
OK
Destroying test database for alias 'default' ('test_projectname')...
Как отобразить только названия тестов, не выводя всю эту дополнительную информацию о регистрации?
from unittest import TextTestResult, TestResult
from datetime import datetime
from django.test.runner import DiscoverRunner
class TerminalColors:
"""Class to hold different colors for terminal messages."""
RESET = "\033[0m"
BLACK = "\033[30m"
RED = "\033[31m"
GREEN = "\033[32m"
YELLOW = "\033[33m"
BLUE = "\033[34m"
MAGENTA = "\033[35m"
CYAN = "\033[36m"
WHITE = "\033[37m"
ORANGE = "\033[38;5;208m"
BLACK_BOLD = "\033[1;30m"
RED_BOLD = "\033[1;31m"
GREEN_BOLD = "\033[1;32m"
YELLOW_BOLD = "\033[1;33m"
BLUE_BOLD = "\033[1;34m"
MAGENTA_BOLD = "\033[1;35m"
CYAN_BOLD = "\033[1;36m"
WHITE_BOLD = "\033[1;37m"
ORANGE_BOLD = "\033[1;38;5;208m"
class TimedTestResult(TextTestResult):
"""Custom test result class that prints test execution times."""
def startTest(self, test):
"""Record the start time of the test."""
self._test_started_at = datetime.now()
super().startTest(test)
def _elapsed_time(self):
"""Calculate and return the elapsed time since the test started."""
return (datetime.now() - self._test_started_at).total_seconds()
def addSuccess(self, test):
"""Print the elapsed time for successful tests."""
elapsed = self._elapsed_time()
if elapsed > 1:
print(f"{TerminalColors.ORANGE_BOLD}{elapsed:.3f}s : {test}{TerminalColors.RESET}")
TestResult.addSuccess(self, test)
def addError(self, test, err):
"""Print the elapsed time for tests that errored."""
elapsed = self._elapsed_time()
print(f"{TerminalColors.RED_BOLD}(ERROR) -- {elapsed:.3f}s : {test}{TerminalColors.RESET}")
TestResult.addError(self, test, err)
def addFailure(self, test, err):
"""Print the elapsed time for tests that failed."""
elapsed = self._elapsed_time()
print(f"{TerminalColors.RED_BOLD}(FAIL) -- {elapsed:.3f}s : {test}{TerminalColors.RESET}")
TestResult.addFailure(self, test, err)
class GlobalTestRunner(DiscoverRunner):
"""Global unit-tests runner."""
def __init__(self, exclude_apps=None, *args, **kwargs):
"""Initialize variables for testing."""
super().__init__(*args, **kwargs)
def get_resultclass(self):
"""Return customized class for results."""
return TimedTestResult
тогда добавьте TEST_RUNNER = 'common.tests.GlobalTestRunner'
в test_settings.py
ПРИМЕЧАНИЕ: Это также добавляет истекшее время на каждом тесте, поэтому удалите его, если хотите.