我正在使用Django的单元测试设备(manage.py test),它会抛出错误并在代码生成警告时停止。使用标准Python unittest模块测试时,相同的代码会生成警告,但会继续通过它们执行代码。
一项小小的研究表明,Python可以设置为向异常发出警告,我认为这会导致测试框架认为发生了错误。不幸的是,关于测试的Django文档对“错误”的定义或如何修改警告的处理有点了解。
那么:Django单元测试框架是否设置为默认情况下会向错误发出警告? Django中有一些设施可以改变这种行为吗?如果没有,有没有人对Django如何打印错误但继续执行代码有任何建议?还是我完全误解了这个问题?
更新: 测试代码停止调用MySQLdb上的警告。这些调用是由一个模块完成的,该模块在Python单元测试框架下测试时抛出相同的警告,但不会停止。我会考虑一种有效的方法来尝试复制代码中的情况,足以发布。
解答:
更多研究表明这种行为与Django的MySQL后端有关:
的/ usr / ... django的/.../ MySQL的/ base.py:
if settings.DEBUG:
...
filterwarnings("error", category=Database.Warning)
当我更改settings.py以便DEBUG = False时,代码会抛出警告但不会停止。
我之前没有在Django中遇到过这种行为,因为我的数据库调用是由我自己的后端生成的。由于我没有调用Django后端,因此我没有重置警告的处理,尽管有警告,代码仍在继续。 Django测试框架肯定会调用Django后端 - 它会对数据库执行各种操作 - 并且该调用会在调用代码之前重置警告处理。
答案 0 :(得分:2)
鉴于更新的信息,我倾向于说这是Django正在做的事情; MySQL的警告可以指示任何数量的事情,包括数据丢失(例如,如果你试图插入一个大于列可以容纳的值,MySQL会发出警告并静默截断),这就是你想要的东西。了解何时进行测试。因此,您最好的选择是查看它生成的警告并更改您的代码,以便不再导致这些警告发生。