【问题标题】:Does Django's Unit Testing Raise Warnings to Exceptions?Django 的单元测试是否会引发异常警告?
【发布时间】: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


【解决方案1】:

鉴于更新的信息,我倾向于说这对 Django 来说是正确的; MySQL 的警告可以指示任何数量的事情,包括数据丢失(例如,如果您尝试插入大于列可以容纳的值,MySQL 将发出警告并静默截断),这就是您想要的事情了解何时进行测试。因此,您最好的选择可能是查看它生成的警告并更改您的代码,使其不再导致这些警告发生。

【讨论】:

  • 这种行为对我来说似乎是合理的,但不要认为自己足够专业。我收到的警告是“表不存在”作为对“如果存在则删除表”的响应——我不知道如何编写 SQL 来避免这种情况。我希望我的笔记将这种情况作为一种行为来讨论,而不是一个错误,而不是一个错误。
  • 虽然 MySQL 会在截断时发出警告并继续插入,但默认情况下他们认为没问题。我个人认为 Django 在这些情况下应该遵从 DB 供应商。如果 Django 认为它应该将警告(截断数据)升级为错误(数据受到不利影响),它应该将 SQLMODE 设置为传统模式,告诉用户 MySQL 在启动期间不在传统模式下,或者只注意文档中的问题。 dev.mysql.com/doc/refman/5.0/en/…
  • Adam,Django 有自己的、独立于 DB 的标准来判断什么是正确的行为和不正确的行为(例如,无论 MySQL 存储引擎是否这样做,我们都会竭尽全力确保引用完整性) .而且,实际上,这是正确的做法,无论数据库供应商是否认为丢失/损坏数据是可以接受的。
猜你喜欢
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 2018-04-19
  • 2015-04-10
相关资源
最近更新 更多