使用Django的'manage.py test'对settings.py中的'live'数据库进行单元测试

时间:2010-03-04 18:33:40

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

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

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

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. 与“实时”数据库建立低级别连接并手动填充

  3. 之前的问题是因为它依赖于Django公共API下面的东西。后者是有问题的,因为它放弃了与数据库无关的Django数据库API,并且更加手动密集。

    我很感激你的想法和意见。

    布赖恩

1 个答案:

答案 0 :(得分:2)

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

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

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