Python Django剖面测试
因此,我找到了2016年的一篇文章,详细介绍了如何创建一个定制的测试运行程序,以捕获在Django中运行测试所需的时间: runner.py: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
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
获得输出),但我无法打印出最终结果。我的意思是在不重写方法的情况下运行?而且我也不明白你的输出中缺少了什么。