如果您在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
目前,上述代码仅保存到已构建的测试数据库中。这是非常有限的,因为我的应用程序有多个并行进程在数据库上工作 - 我的单元测试将是不完整的(和不连贯的),没有能力将事物泵送到“实时”数据库并看到它们在短暂睡眠后的位置。
我能想到的两个可能的选择是:
插入Django API,了解如何在settings.py中“手动”连接数据库
与“实时”数据库建立低级别连接并手动填充
之前的问题是因为它依赖于Django公共API下面的东西。后者是有问题的,因为它放弃了与数据库无关的Django数据库API,并且更加手动密集。
我很感激你的想法和意见。
布赖恩
答案 0 :(得分:2)
您必须定义自己的test_runner
tearDown
方法,因为每个测试都是隔离运行的,并且每次运行后都会清除数据库。你可以通过简单地构建自己的test_runner
来做你想要的事情,我们已经完成了一次(虽然不是团队中的我),数据库是由Web服务访问的,有一段时间我们没有没有办法从那里删除任何东西,但要手动删除整个数据库;-)这很有趣。
回答您的问题:创建您自己的test_runner
并准备创建自己的tearDown
方法,您只会删除自己创建的对象。您必须以某种方式存储primary keys
,因此您不会从实时数据库中删除任何内容。
然而,我认为这不是一个好方法。在实时数据库上运行测试会让自己陷入灾难。迟早你会遇到麻烦。你应该做的是转储你的实时数据库,从这些数据准备fixtures并在你的测试中使用它们。这有很好的记录并且很容易完成。通过这种方式,您将拥有实时环境,而不会冒宝贵数据的风险,您无需编写自己的test_runner
。在我看来,这是最好和最安全的方式。