加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:29:32 所属栏目:Python 来源:网络整理
导读:我发现为一个简单的失败单元测试获得如此多的细节有点恼人.是否有可能抑制除了实际定义的断言消息之外的所有内容? Creating test database for alias 'default'....F======================================================================FAIL: test_get
我发现为一个简单的失败单元测试获得如此多的细节有点恼人.是否有可能抑制除了实际定义的断言消息之外的所有内容?

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.313s

FAILED (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 types
from django.utils.unittest.result import failfast
from django.test import TestCase

@failfast
def 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 = True

class 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的测试代码.这只是一个快速的补丁,让它在常见的情况下工作.使用风险自负!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读