问题标签 [django-testing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5050 浏览

django - 测试使用南迁移的 Django 应用程序

我正在尝试为使用南迁移的 Django 应用程序创建一些功能测试。
最终,我还将创建 Twill 测试。

当我尝试运行现有测试时,由于 South 迁移的问题,未成功创建测试数据库。(在 58 次迁移中的第 7 次失败)

似乎为了测试的目的,最好从 Django 模型构建测试数据库,就像 syncdb 一样,而不是从 South。

如何设置 Django 测试套件以从当前模型构建测试数据库与尝试使用 South?

0 投票
2 回答
58 浏览

django - 是否有一种自动化的方式在测试用例中的每个方法之间运行某些东西?

我正在使用 Django 提供的 TestClient 运行一些单元测试,这使得在每个测试方法中拥有相同的数据库变得容易。然而,在我的一些测试中,我连接到我想在每个测试方法之间重置的外部 Web 服务。

我可以通过简单地调用一个 url 来完成此重置,但我希望测试运行程序在每个测试方法之间自动执行此操作。

有没有一种简单的方法可以做到这一点,而不必在每个测试方法中首先调用重置函数?

0 投票
1 回答
289 浏览

python - 在 Django 中测试特定模型

是否可以仅出于测试目的而拥有一组模型?这个想法是我编写了一个包含一些辅助抽象模型 HelperBase 的应用程序。现在我想提供一些继承自它的模型以便对其进行测试,例如 DerivedTest1、DerivedTest2。但是我真的不希望这些测试模型最终出现在生产数据库中。我只想在测试数据库中构建他们的表。有可能吗?如果有的话 - 怎么做?我已经尝试在tests.py文件中创建模型,但这似乎不起作用。

0 投票
3 回答
3141 浏览

django - Django:更改媒体根以进行测试

我正在尝试为 Django 应用程序编写一些测试,涉及文件上传。为此,我想将MEDIA_ROOT临时更改为“myproject/fixtures/test_media/”。出于某种原因,这似乎阻止了 Django 找到固定装置。

我的测试用例看起来像

由于某种原因,Django 无法加载固定装置,因此所有测试都失败了

安装夹具“fixtures/test_data.json”时出现问题:回溯(最近一次通话最后一次)...

我究竟做错了什么?

0 投票
1 回答
1918 浏览

python - 单元测试之间的 django 对象 ids 增量

我在 Debian 上使用 Django 1.2.3-3+squeeze1 和 PostgreSQL 8.4.7-0squeeze2(虽然我认为 PostgreSQL 在这里不相关),并使用以下 setUp 和 tearDown 运行基于 unittest 的 Django 单元测试

这个想法是在运行单元测试之间从数据库中删除所有内容。根据 unittest 文档,这就是tearDown目的。我遇到的问题是在不同的单元测试之间似乎仍然保存了一些状态。具体来说,我看到 id 增加了。所以假设我在 中创建一个ZipFileUpload对象test1,然后在 中创建一个ZipFileUpload对象test2,那么我希望两个 id 都是1,但我看到的是 id 1fortest1和 id 2fortest2. 如果 id 来自位于这些表之外的某个索引,这将是有意义的。我对 Diago 是如何做到这一点的了解还不够,无法知道事实是否如此。如果他们这样做,我不知道为什么。对这一点的任何澄清将不胜感激。

无论如何,如果有人可以建议的话,我会选择一种干净的方式来删除数据库。这个方法大概应该进入teadDown. 测试 Django 应用程序提到了以下功能,但我未能从django.test.utils. 令人困惑的是,这个功能似乎在django/db/backends/creation.py.

destroy_test_db(old_database_name, verbosity=1)

销毁名称存储在 DATABASES 中的 NAME 中的数据库,并将 NAME 设置为使用提供的名称。

这句话的第一部分是 Ok - “Destroy the database which name is stored in NAME in the DATABASES”,但是“sets NAME to use the provided name”是什么意思呢?我假设提供的名称old_database_name

目前尚不清楚NAME上下文中的内容。是NAMEinDATABASES吗,如果是这样,为什么我需要设置已经设置的东西?我假设提供的名称是old_database_name,但如果是这样,我为什么要将它设置为一个名为 的参数old_database_name?这句话在开发文档中没有改变。

编辑:

在史蒂夫·梅恩(Steve Mayne)的回复(见下文)之后,我想我会详细说明一下这件事的背景。

此应用程序最初是在 2007/2008/2009 年编写的,包括单元测试。在大部分时间里,我都在使用 Django 的 1.0 之前的版本。根据Ken Cochran 的 Django Release History,1.0 于 2008 年 9 月 3 日发布。描述的设置在那段时间运行良好。我看到上面的 tearDown 函数最初是在 2007 年 12 月编写的。那么,也许 Django 的行为改变了?

事后看来,我意识到像tearDown上面那样清空表并不能保证 id 计数将重置为1,因为序列可以是表中的单独对象。

感谢史蒂夫的解决方案。如果它存在,我想听听关于序列重置的便携式解决方案。我也对如何使上述destroy_test_db功能起作用的解释感兴趣。

0 投票
3 回答
9828 浏览

django - Django 测试使用现有数据库

我很难自定义测试数据库设置行为。我想实现以下目标:

  • 测试套件需要使用现有的数据库
  • 测试套件不应擦除或重新创建数据库,而是从 mysql 转储中加载数据
  • 由于数据库是从转储中填充的,因此不应加载任何固定装置
  • 完成测试后,不应破坏数据库

我很难让 testsuiterunner 绕过创建。

0 投票
3 回答
5325 浏览

python - 如何在我的 Django 项目的上下文中执行任意脚本?

有时我想在我的 Django 项目的上下文中执行一个文件,就像我在使用 shell 一样,但使用文本编辑器很方便。这主要是在将其放入视图、测试、重复任务或管理命令之前尝试一些东西,或者快速原型化一些功能。

我知道我可以将这些行放在 .py 文件的顶部,它将在 Django 上下文中运行:

我认为制作一个带有参数的管理命令、一个要运行的 python 模块并在 Django 环境中执行它会更容易。这是我写的'runmodule'命令:

这看起来可行——我可以在模块中粘贴一些代码,并将其作为参数传递给该命令,它会被执行,例如

这将执行 myapp/trysomethingout.py。这是最好的方法吗?

0 投票
4 回答
16817 浏览

django - 使用 sqlite 运行 django 测试

我使用 Postgres 进行生产和开发,但我想使用 sqlite 来运行一些测试。我没有看到一种简单的方法来配置一个引擎用于测试和另一个用于开发/生产。我错过了什么吗?

0 投票
1 回答
1275 浏览

django - 如何正确测试需要 Django 会话的中间件?

我试图弄清楚如何在 django 中测试中间件。我正在编写的中间件在特定条件下(如果电子邮件中发送的密钥有效)登录用户。所以很明显我依赖于django.contrib.authand django.contrib.sessions

我在测试登录部分时遇到问题。我正在提出这样的请求:

由于未设置会话而失败。所以接下来,我在我的测试类中写了一个小片段:

并且由于'User' object has no attribute 'backend'. 我不确定这意味着什么,但我怀疑我需要运行我安装的所有中间件。

我真的不想为了运行中间件而为此制作一个假视图,但此时我看不到另一个选项。

所以我只想知道,在我不得不一直追着这只兔子之前,有没有一种不需要那么多胶带的方法?

0 投票
2 回答
7301 浏览

django - 在 Django 测试期间加载夹具时出现 IntegrityError

我正在加载使用转储数据创建的夹具,并收到以下异常:

这是使用 sqlite3 后端。

更新:使用自然键在这里没有什么不同。

这是什么意思,为什么会这样?