Django:如何在单元测试中隐藏Traceback以提高可读性?

Django:如何在单元测试中隐藏Traceback以提高可读性?,第1张

概述我发现为一个简单的失败单元测试获得如此多的细节有点恼人.是否有可能抑制除了实际定义的断言消息之外的所有内容? Creating test database for alias 'default'....F======================================================================FAIL: test_get_sales_item 我发现为一个简单的失败单元测试获得如此多的细节有点恼人.是否有可能抑制除了实际定义的断言消息之外的所有内容?

Creating test database for alias 'default'....F======================================================================FAIL: test_get_sales_item_for_company (my_app.tests.SalesItemmodelTest)----------------------------------------------------------------------Traceback (most recent call last):  file "/home/kave/projects/my/my_app/tests.py",line 61,in test_get_sales_item_for_company    self.assertEqual(sales_items.count(),1,'Expected one sales item for this company,but got %s' % sales_items.count())AssertionError: Expected one sales item for this company,but got 2----------------------------------------------------------------------Ran 2 tests in 0.313sFailed (failures=1)Destroying test database for alias 'default'...

我觉得这不必要了.我需要知道失败的测试名称(方法)和断言消息.真的不需要回溯..

Traceback (most recent call last):  file "/home/kave/projects/my/my_app/tests.py",but got %s' % sales_items.count())
解决方法 猴子修补救援.你可以通过继承Django的TestCase来消除你的Django安装,从而摆脱故障的追溯,如下所示:

import typesfrom django.utils.unittest.result import failfastfrom django.test import TestCase@failfastdef addFailureSansTraceback(self,test,err):    err_sans_tb = (err[0],err[1],None)    self.failures.append((test,self._exc_info_to_string(err_sans_tb,test)))    self._mirrorOutput = Trueclass NoTraceTestCase(TestCase):    def run(self,result=None):        result.addFailure = types.MethodType(addFailureSansTraceback,result)        super(NoTraceTestCase,self).run(result)

现在只需将你的测试用例替换为NoTraceTestCase而不是TestCase,你就可以了.不再追溯失败. (注意异常仍然会打印回溯.如果你愿意的话,可以用类似的方法对它们进行修补.)

这是它的工作原理(感谢Jason Pratt for the quick lesson on monkey patching):

> Django的测试运行器为每次测试运行调用TestCase的run方法. result参数是django.utils.unittest.result.TestResult类的一个实例,它处理向用户显示测试结果.每当测试失败时,run都会进行以下调用:result.addFailure(self,sys.exc_info()).这就是回溯的来源 – 作为sys.exc_info()返回的元组中的第三项.
>现在,简单地使用原始代码的副本覆盖运行并根据需要调整它将起作用.但是run方法是一个很好的75行长,所有需要改变的是一行,并且在任何情况下为什么错过了使用猴子修补的乐趣的机会?
> result.addFailure赋值将传递给NoTraceTestCase的run方法的结果对象中的addFailure方法更改为新定义的addFailureSansTraceback函数 – 该函数首先转换为与types.MethodType结果对象兼容的方法.
>超级调用调用Django现有的TestCase运行.现在,当现有代码运行时,对addFailure的调用将实际调用新版本,即addFailureSansTraceback.
> addFailureSansTraceback执行addFailure的原始版本 – 复制两行代码 – 除了添加一行用None替换回溯(在下一行中使用err_sans_tb而不是err).而已.
>注意原始的addFailure有一个failfast装饰器,因此导入并使用它.说实话,我没看过它做什么!

免责声明:我没有彻底研究过Django的测试代码.这只是一个快速的补丁,让它在常见的情况下工作.使用风险自负!

总结

以上是内存溢出为你收集整理的Django:如何在单元测试中隐藏Traceback以提高可读性?全部内容,希望文章能够帮你解决Django:如何在单元测试中隐藏Traceback以提高可读性?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1196665.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存