当我在Django中打破测试时,我想立刻知道。而不是总是单独运行manage.py test
,有没有办法在运行manage.py runserver
时在后台运行测试并将它们报告给同一个终端?理想情况下,在保存文件时重新运行测试,就像正常重新加载服务器一样。
这样可以更快地发现错误。甚至更好的是它在你的脸上,而不是隐藏在手动测试步骤之后。
这可能吗?
答案 0 :(得分:1)
我最终覆盖了管理命令。
应用名\管理\命令\ runserver.py:强>
from __future__ import print_function
import subprocess
from threading import Thread
from django.core.management.commands.runserver import Command as BaseCommand
# or: from devserver.management.commands.runserver import Command as BaseCommand
from django.conf import settings
from termcolor import colored
BEEP_CHARACTER = '\a'
def call_then_log():
try:
output = subprocess.check_output('manage.py test --failfast',
stderr=subprocess.STDOUT, shell=True)
except subprocess.CalledProcessError as ex:
print(colored(ex.output, 'red', attrs=['bold']))
print(BEEP_CHARACTER, end='')
return
print(output)
def run_background_tests():
print('Running tests...')
thread = Thread(target=call_then_log, name='runserver-background-tests')
thread.daemon = True
thread.start()
class Command(BaseCommand):
def inner_run(self, *args, **options):
if settings.DEBUG and not settings.TESTING:
run_background_tests()
super(Command, self).inner_run(*args, **options)
<强> requirements.txt:强>
termcolor
这会在后台线程中运行您的测试,每次Django自动重新加载时都会运行。旧线程将被停止。如果任何测试失败,它将发出蜂鸣声,并且第一个失败结果将以红色打印到终端。
This answer也值得一读,以加快测试速度,实现更快的反馈循环。