对于 django 测试,我如何将 keepdb 与 mariadb 一起使用

Posted

技术标签:

【中文标题】对于 django 测试,我如何将 keepdb 与 mariadb 一起使用【英文标题】:For django testing, how do I use keepdb with mariadb 【发布时间】:2019-03-15 17:57:34 【问题描述】:

我有一个包含很多非托管表的数据库,我正在将这些表用于 django 应用程序。为了进行测试,我想使用 --keepdb 选项,这样我就不必每次都重新填充这些表。我正在为我的数据库使用 MariaDB。如果我不使用 keepdb 选项,一切正常,测试数据库将被正确创建和销毁。

但是当我尝试运行测试时保留数据库:

$ python manage.py test --keepdb

我收到以下错误:

使用现有的测试数据库作为别名'default'... 创建测试数据库时出错:(1064,“您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本相对应的手册,了解在 'CREATE DATABASE IF NOT EXISTS test_livedb 附近使用的正确语法;\n SET sql_note' 在第 2 行")

我认为这是 MariaDB 和 mysql 之间语法不同的问题。有没有办法让 keepdb 选项与 MariaDB 一起使用?

非常感谢!

【问题讨论】:

【参考方案1】:

两件事 - 查看 Factory Boy(用于创建测试数据),我建议也查看 Pytest。对于非托管表,我认为您会遇到的问题是(至少根据我的经验)django 不会在测试环境中创建它们,并且您最终会遇到问题,因为没有 migration 文件可创建这些表(因为它们是非托管的)。 Django 在创建测试环境时运行migration 文件。

使用 Pytest,您可以使用 --nomigrations 标志运行,该标志直接从模型构建您的测试数据库(从而为非托管模型创建所需的表)。

如果您将 Pytest 和 Factory Boy 结合起来,您应该能够想出设置测试数据的能力,使其按预期工作、可重复和可测试而不会出现问题。

我实际上是这样处理的(有点 hacky,但它适用于我们复杂的设置):

在我的模型上:

class Meta(object):
    db_table = 'my_custom_table'
    managed = getattr(settings, 'UNDER_TEST', False)

我在settings.py 中创建UNDER_TEST 变量,如下所示:

# Create global variable that will tell if our application is under test
UNDER_TEST = (len(sys.argv) > 1 and sys.argv[1] == 'test')

这样 - 当应用程序是 UNDER_TEST 时,模型被标记为托管(Pytest 将创建适当的数据库表)。然后 FactoryBoy 处理将我所有的测试数据放入该表(在测试的 setUp 或其他地方),以便我可以针对它进行测试。

这是我的建议 - 其他人可能有更清晰或更清晰的东西。

【讨论】:

【参考方案2】:

值得一提的是:这个错误是在 Django 2.0.0 中引入并在 Django 2.1.3 中修复的 (https://code.djangoproject.com/ticket/29827)

【讨论】:

以上是关于对于 django 测试,我如何将 keepdb 与 mariadb 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何对 django url 进行单元测试?

如何在托管 = False 的 Django 测试期间创建表?

如何将 django 单元测试分布在多个文件上?

为 django 模型编写测试用例

Django-Bower + Foundation 5 + SASS,如何配置?

如何自动销毁django测试数据库