【发布时间】:2009-11-01 20:47:49
【问题描述】:
我正在使用 Django 的单元测试设备(manage.py 测试),它会在代码生成警告时抛出错误并停止。使用标准 Python unittest 模块测试相同的代码时,会生成警告,但会继续通过它们执行代码。
一项小研究表明,可以将 Python 设置为对异常发出警告,我想这会导致测试框架认为发生了错误。不幸的是,关于测试的 Django 文档对“错误”的定义或如何修改警告的处理有一点启发。
那么:默认情况下,Django 单元测试框架是否设置为对错误发出警告? Django 中是否有一些工具可以改变这种行为?如果没有,是否有人对我如何 Django 打印错误但继续执行代码有任何建议?还是我完全误诊了问题?
更新: 测试代码因调用 MySQLdb 引发的警告而停止。这些调用是由一个模块发出的,该模块在 Python unittest 框架下进行测试时会抛出相同的警告,但不会停止。我会考虑一种有效的方法,尝试用足够简洁的代码来复制这种情况。
回答:
更多研究表明这种行为与 Django 的 MySQL 后端有关:
/usr/...django/.../mysql/base.py:
if settings.DEBUG:
...
filterwarnings("error", category=Database.Warning)
当我将 settings.py 更改为 DEBUG = False 时,代码会抛出警告但不会停止。
我以前在 Django 中没有遇到过这种行为,因为我的数据库调用是由我自己的后端生成的。因为我没有调用 Django 后端,所以我没有重置对警告的处理,尽管有警告,代码仍然继续。 Django 测试框架肯定会调用 Django 后端——它对数据库执行各种操作——并且该调用会在调用我的代码之前重置警告处理。
【问题讨论】:
-
我无法触发这种行为——当添加代码故意发出警告时,我得到了打印出来的警告,但测试仍然通过。有关您正在做什么以及您所看到的结果的更多信息将有助于解决此问题。
-
从文档中,Django 测试不运行调试模式:docs.djangoproject.com/en/dev/topics/testing/…,所以我不确定您引用的代码是否导致了警告/错误。作为 ./manage.py 测试过程的一部分,您如何触发“表不存在”SQL?
标签: python django unit-testing