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以提高可读性?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)