【问题标题】:Django TestCase: don't flush the DB after each testDjango TestCase:每次测试后不要刷新数据库
【发布时间】:2014-10-15 01:56:00
【问题描述】:

我正在开发一个配置非常不寻常的 Django API 项目(我认为): 我确实有两个 Django 项目:一个是主 API,一个是用户 API。每当我使用主 API 创建用户时,用户实际上是在用户 API 的数据库中创建的(我使用 http 请求在两个 API 之间进行通信)。在主 API 中,我保留了一个仅包含唯一 ID 的用户表。在用户 API 中创建用户时,它使用与主 API 中相同的唯一 ID 创建。 我必须这样做,因为在生产中,我必须将数据存储在不同的服务器中。

现在我的问题来了。

我想为我的主要 API 编写测试(例如测试用户创建、用户更新、用户删除)。问题是当我运行测试时,我必须运行代表用户 API 的单独的 Django 实例(使用另一个端口)。运行测试时,Django 为主 API 创建了一个测试数据库,但由于我使用 http 请求与用户 API 通信,因此没有用于用户 API 的测试数据库,因此我必须在运行所有测试后刷新数据库。到目前为止,我使用了 unittest 库,一切都很好。但我希望能够在测试期间覆盖一些设置(例如,用户 API 的地址是一个设置,我想为测试使用不同的地址)。为此,我必须使用 django.test.TestCase 但我有以下问题:

想象一下,我有一个创建用户 A 的 test_a 方法和一个创建用户 B 的 test_b 方法。使用 django.test.TestCase,运行 test_a,使用 id 1 创建用户 A。然后我相信测试数据库(主 API 的)被刷新,因为当 test_b 运行时,用户 B 也被创建为 id 1。问题是在两次测试之间,用户 API 的数据库没有刷新,所以我得到一个错误,因为我无法在测试数据库中创建用户 B。

我正在寻找一种优雅的方式来处理这个问题,但我真的不知道。

(对不起,这很长,但我想精确一点)。

【问题讨论】:

    标签: python database django unit-testing


    【解决方案1】:

    您不能在 TestCase 的 setUp 方法中进行数据库刷新吗?由于该方法在每次测试之前运行一次,因此您可以为 test_a 和 test_b 提供一个干净的数据库。

    要使用 bash 脚本刷新数据库,您可以使用子进程,如下所示:

    def setUp(self):
        import subprocess
        subprocess.call(['<path-to-bash-script>', 'arg1', 'arg2'])
    

    【讨论】:

    • 问题是正在刷新的数据库在另一个 Django 项目中,所以我不在 django 代码中进行刷新,而是在运行测试的 bash 脚本中进行。如何从另一个 django 项目中刷新一个 django 项目的数据库?
    • 你可以从 setup 方法调用 bash 脚本,例如 subprocess。我将在我的答案中添加一个示例
    • 如果我从命令行运行 bash 脚本效果很好,但如果我从 subprocess.call 运行它就不行。我收到此错误:文件“/user_API_path/manage.py”,第 10 行,在 execute_from_command_line(sys.argv) ImportError: Could not import settings 'core_API.settings'(它在 sys.path 上吗?是否有设置文件中的导入错误?):没有名为 core_API.settings 的模块
    • 这看起来像是一个 virtualenv 问题,我猜你通常是在用户项目的环境中运行你的 bash 脚本?在这种情况下,您可以尝试修改脚本以获得 python 的绝对路径,或者您可以在运行 subprocess.call 之前修改环境变量(例如,参见stackoverflow.com/questions/2231227/…)
    • 我确实使用了 virtualenv,但我的 bashrc 中的路径是绝对的(请参阅gist.github.com/anonymous/0a16a03bb811f576fe90)
    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 2019-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多