【问题标题】:Writing django tests that use the main database编写使用主数据库的 django 测试
【发布时间】:2018-10-16 05:31:50
【问题描述】:

我的 django 项目有几个数据迁移,大约需要 2 小时才能应用。这些数据迁移构成了对原始数据集的一系列转换(清理、提取新字段等)。数据库的最终状态由 15-20 个表组成。

我还有每天导入新数据的代码,这些数据也以相同的格式推送到现有的数据库表中。

我想编写测试以确保数据库的内容在任何给定时刻都是正确的(在应用初始数据迁移之后,在新导入之后等)。测试将检查诸如预期不具有空值的特定列是否确实没有,派生字段的值是否正确等。

我的问题是,django 每次运行测试时都会尝试通过应用所有迁移来创建测试数据库。但是由于数据迁移需要很长时间才能应用,因此运行这样的测试变得非常不切实际。我也不想使用 keepdb 选项,因为我还想在更改原始数据库后运行这些测试。

对于这种情况,我不确定一般最好的 django 惯用方法是什么。

【问题讨论】:

    标签: django testing


    【解决方案1】:

    您可以使用pytest 访问/重用数据库。

    只需在您的测试用例中使用@pytest.mark.django_db

    pytest 非常适合测试您的 django 代码。我绝对推荐它。

    更多信息请参见here

    【讨论】:

    • 感谢您的回复!我无法从链接中完全收集到这一点,但是使用 pytest 不需要创建测试数据库是对的吗?
    【解决方案2】:

    您可以运行 django 测试用例来持久化测试数据库。

    python manage.py test -k
    

    它会一次性创建测试数据库,并保留它。

    【讨论】:

    • 您好,感谢您的回复!有没有办法阻止 django 一开始就创建测试数据库?我的测试从未真正修改数据库,因此在主数据库上执行它们没有风险。
    • 如果没有数据库,如何显示数据,说明是静态网站。
    • 有一个数据库。我只是不想创建一个单独的测试数据库来进行测试,而是使用主数据库运行测试。
    【解决方案3】:

    备份您当前的数据库并将其命名为“test_database_name”。

    例如。 DB_name = django.然后将备份数据库的名称保留为 test_django。

    mysqldump -u username -p database_name > database_backup.sql
    mysql -u username -p test_database_name < database_backup.sql
    

    当你运行测试时,使用这个命令

    python manage.py test --keepdb
    

    Django 将使用备份数据库进行测试,然后您不必一次又一次地应用迁移。但要确保测试数据库的名称是正确的。命令 --keepdb 将保留数据库,并且不允许 Django 在每次运行测试时删除数据库。

    此外,每次运行测试时,Django 都会刷新备份数据库中的所有数据,但不会刷新迁移。因此,每次运行测试时,您都必须创建一个 SetUp 类 来设置所有用户、权限、组等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 2023-03-09
      • 2018-08-26
      • 2011-09-09
      • 2020-04-22
      • 2014-05-28
      • 2022-08-02
      相关资源
      最近更新 更多