【问题标题】:Do unit tests on the 'live' database in settings.py while using Django's 'manage.py test'在使用 Django 的“manage.py 测试”时对 settings.py 中的“实时”数据库进行单元测试
【发布时间】:2011-01-23 19:35:58
【问题描述】:

如果您在 Django 中设置了数据库,如何让 TestRunner 使用“实时”数据库(根据 settings.py 中的 DATABASE_* 设置)而不是在临时测试数据库上运行它们。

例如,我想在settings.py 中指定的live 数据库上运行以下测试:

import unittest

from example import models

class DBDriverTest(unittest.TestCase): 
    db testDriver(self):
       "Connect to the live database and drop in sample value."
       m = models.MyModel('hello')
       m.save() # ... save to the live database from settings.py

目前上面的代码只会保存到已经构建好的测试数据库中。这是非常有限的,因为我的应用程序有多个在数据库上工作的并行进程——而且我的单元测试将是不完整的(并且不连贯的),而无法将内容泵入“实时”数据库并查看它们在短暂睡眠后所处的位置。

我能想到的两个潜在选择是:

  1. 插入 Django API 以了解如何在 settings.py 中“手动”连接到数据库

  2. 与“实时”数据库建立低级连接并手动填充它

先验是有问题的,因为它依赖于 Django 的公共 API 下的东西。后者是有问题的,因为它放弃了与数据库无关的 Django 数据库 API,并且需要更多的手动操作。

感谢您的想法和意见。

布赖恩

【问题讨论】:

    标签: django unit-testing django-models django-database


    【解决方案1】:

    您必须定义自己的 test_runner tearDown 方法,因为每个测试都是单独运行的,并且每次运行后都会清除数据库。您可以通过简单地构建自己的test_runner 来完成您所要求的事情,我们已经完成了一次(尽管团队中不是我),使用 Web 服务访问的数据库,有一段时间我们没有有任何方法可以从那里删除任何内容,但要手动删除整个数据库;-) 这很有趣。

    回答您的问题:创建您自己的 test_runner 并准备创建您自己的 tearDown 方法,在这些方法中您只会删除您创建的对象。您必须以某种方式将 primary keys 存储在那里,这样您就不会从实时数据库中删除任何内容。

    但是,我认为这不是一个好方法。在实时数据库上运行测试是在问自己一场灾难。迟早你会遇到麻烦。你应该做的是转储你的实时数据库,从这些数据中准备fixtures 并在你的测试中使用它们。这是有据可查的,而且很容易做到。这样,您将拥有实时环境,而不会冒着宝贵数据的风险,并且您无需编写自己的 test_runner。在我看来,这是最好和最安全的方式。

    【讨论】:

    • 谢谢,Gruszczy。我同意创建test_runner 通常不是最好的方法,但我们的情况与常规情况有些不同。首先,大约 5 分钟后数据无关紧要。其次,数据库轮询(由一个守护进程)插入(由 Django)。如果守护程序在一行中看到某些数据,则可能会更改该行。我们希望我们的单元测试能够测试 (1) 插入是否正确,以及 (2) 守护进程是否正常工作。不幸的是,fixture 不能解决如何允许守护进程访问单元测试数据库的问题。但是自定义 test_runner 应该可以解决问题!
    • 哇! 5分钟后数据无关紧要??你到底在做什么,因为它听起来非常实时和酷:-)
    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多