Django TestCase:每次测试后都不要刷新数据库

时间:2014-08-21 12:19:57

标签: python database django unit-testing

我正在开发一个Django API项目,配置相当不寻常(我认为): 我确实有两个Django项目:一个是主API,一个是用户API。每当我使用主API创建用户时,用户实际上是在用户API的数据库中创建的(我使用http请求在两个API之间进行通信)。在主API中,我保留一个仅包含唯一ID的用户表。在用户API中创建用户时,使用与主API中相同的唯一ID创建用户。 我必须这样做,因为在生产中,我必须将数据存储在不同的服务器中。

现在出现了我的问题。

我想为我的主API编写测试(例如测试用户创建,用户更新,用户删除)。问题是当我运行测试时,我必须运行一个代表用户API的Django(使用另一个端口)的单独实例。运行测试时,Django为主API创建了一个测试数据库,但由于我使用http请求与用户API进行通信,因此没有用户API的测试数据库,所以我必须在运行所有测试后刷新数据库。到现在为止,我使用了unittest库,一切都很好。但我希望能够在测试期间覆盖一些设置(例如,用户API的地址是一个设置,我希望测试的地址不同)。为此,我必须使用django.test.TestCase,但我有以下问题:

想象一下,我有一个创建用户A的test_a方法和一个创建用户B的test_b方法。使用django.test.TestCase运行test_a,用id创建用户A.然后我相信测试数据库(主API)是刷新的,因为当运行test_b时,也会创建用户B,其ID为1。问题是在两个测试之间,用户API的数据库没有刷新,因此我收到错误,因为我无法在测试数据库中创建用户B.

我正在寻找一种处理这个问题的优雅方法,但我真的不知道。

(对不起,这很长,但我想要有点精确)。

1 个答案:

答案 0 :(得分:0)

你不能在TestCase的setUp方法中进行数据库刷新吗?由于该方法在每次测试之前运行一次,因此可以为test_a和test_b提供一个干净的数据库。

要使用bash脚本刷新数据库,可以使用子进程,如下所示:

def setUp(self):
    import subprocess
    subprocess.call(['<path-to-bash-script>', 'arg1', 'arg2'])