– Django的单元测试是否会引发异常警告?

我正在使用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后端 – 它会对数据库执行各种操作 – 并且该调用将在调用代码之前重置警告处理.

最佳答案 鉴于更新的信息,我倾向于说这是Django正在做的事情; MySQL的警告可以指示任何数量的事情,包括数据丢失(例如,如果你试图插入一个大于列可以容纳的值,MySQL会发出警告并静默截断),这就是你想要的东西.了解何时进行测试.因此,您最好的选择是查看它生成的警告并更改您的代码,以便它不再导致这些警告发生.

点赞