0

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

例如,我想在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. 与“实时”数据库建立低级连接并手动填充它

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

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

布赖恩

4

1 回答 1

2

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

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

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

于 2010-03-04T18:57:28.187 回答