对于 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 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
如何在托管 = False 的 Django 测试期间创建表?