如何在运行Django runserver时自动运行测试?

时间:2015-03-30 17:00:06

标签: python django testing

当我在Django中打破测试时,我想立刻知道。而不是总是单独运行manage.py test,有没有办法在运行manage.py runserver时在后台运行测试并将它们报告给同一个终端?理想情况下,在保存文件时重新运行测试,就像正常重新加载服务器一样。

这样可以更快地发现错误。甚至更好的是它在你的脸上,而不是隐藏在手动测试步骤之后。

这可能吗?

1 个答案:

答案 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也值得一读,以加快测试速度,实现更快的反馈循环。