Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django剖面测试_Python_Django_Python Unittest - Fatal编程技术网

Python Django剖面测试

Python Django剖面测试,python,django,python-unittest,Python,Django,Python Unittest,因此,我找到了2016年的一篇文章,详细介绍了如何创建一个定制的测试运行程序,以捕获在Django中运行测试所需的时间: runner.py: from unittest.runner import TextTestResult from django.test.runner import DiscoverRunner import time class TimeLoggingTestRunner(DiscoverRunner): def __init__(self, slow_te

因此,我找到了2016年的一篇文章,详细介绍了如何创建一个定制的测试运行程序,以捕获在Django中运行测试所需的时间:

runner.py:

from unittest.runner import TextTestResult
from django.test.runner import DiscoverRunner

import time

class TimeLoggingTestRunner(DiscoverRunner):
    def __init__(self, slow_test_threshold=0.0, *args, **kwargs):
        self.slow_test_threshold = slow_test_threshold
        return super().__init__(
            resultclass=TimeLoggingTestResult,
            *args,
            **kwargs,
        )
    def run(self, test):
        result = super().run(test)
        self.stream.writeln(
            "\nSlow Tests (>{:.03}s):".format(
                self.slow_test_threshold))
        for name, elapsed in result.getTestTimings():
            if elapsed > self.slow_test_threshold:
                self.stream.writeln(
                    "({:.03}s) {}".format(
                        elapsed, name))
        return result

    def get_resultclass(self):
        return TimeLoggingTestResult

class TimeLoggingTestResult(TextTestResult):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.test_timings = []
    def startTest(self, test):
        self._test_started_at = time.time()
        super().startTest(test)
    def addSuccess(self, test):
        elapsed = time.time() - self._test_started_at
        name = self.getDescription(test)
        self.test_timings.append((name, elapsed))
        super().addSuccess(test)
    def getTestTimings(self):
        return self.test_timings
settings.py:

TEST_RUNNER = 'core.utils.test_runner.runner.TimeLoggingTestRunner'
但是,最后没有打印任何内容。我知道代码在运行,因为调试语句在这两个类中都会触发-但实际的最终结果(
run
)似乎没有被调用

我所做的是获得打印的计时(通过在
TimeLoggingTestResult
中添加打印语句),但我似乎无法在最后将它们全部打印出来

有没有人有做这种事情的经验?
run
方法似乎根本无法访问


使用Django 1.11.

我知道这是一个老问题,但我在寻找一种方法来分析我的测试时遇到了它,并试图自己实现它。我在Django3.0.8上,但与询问者有相同的问题

在研究它之后,我发现
DiscoverRunner
不是从TextTestRunner继承的,它使用组合。它不调用
self.run()
而是调用
runner.run()
。请参阅下面的代码

class DiscoverRunner:
...
test\u runner=unittest.TextTestRunner
...
def run_套件(自我、套件、**kwargs):
kwargs=self.get\u test\u runner\u kwargs()
跑步者=自我测试跑步者(**kwargs)
返回跑步者。跑步(套件)
我所做的是使
TimeLoggingTestRunner
继承DiscoveryRunner和TextTestRunner,并重写
run\u suite()

类TimeLoggingTestRunner(DiscoveryRunner,TextTestRunner):
定义初始值(self,*args,慢速测试阈值=0.0,**kwargs):
self.slow\u test\u threshold=slow\u test\u threshold
DiscoverRunner.\uuuuu init\uuuuuu(self,*args,**kwargs)
TextTestRunner.\uuuuu初始化(self,*args,**self.get\uTest\uRunner\uKwargs())
[...]
def run_套件(自我、套件、**kwargs):
返回self.run(套件)
也许有更好的方法来处理继承,但它正在发挥作用


另一种选择可能是创建两个TestRunner,分别继承DiscoveryRunner和TextTestRunner,然后以DiscoveryRunner相同的方式组合它们。

我不理解您所有的问题(我不是django大师)。但是几天前,我也创建了自己的测试运行程序,我正在覆盖
run\u tests
方法而不是
run
。是的,我在文档中看到了这一点,但是
run\u tests
的工作方式不同,我不确定如何让它与此代码一起工作。你是对的,在中有一个
run
方法。如果您使用此运行程序运行测试,但删除了自己的
run
方法,您可以打印会发生什么情况吗?因此测试会运行(因为我从
TimeLoggingTestResult
获得输出),但我无法打印出最终结果。我的意思是在不重写方法的情况下运行?而且我也不明白你的输出中缺少了什么。