Django:如何在单元测试中隐藏Traceback以提高可读性?
我发现为一个简单的失败单元测试获得如此多的细节有点恼人.是否有可能抑制除了实际定义的断言消息之外的所有内容?
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()返回的元组中的第三项. 免责声明:我没有彻底研究过Django的测试代码.这只是一个快速的补丁,让它在常见的情况下工作.使用风险自负! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |