Django TestCase:测试后不清空数据库

0 投票
1 回答
1058 浏览
提问于 2025-04-18 18:03

我正在做一个Django的API项目,配置有点特别(我觉得):我实际上有两个Django项目,一个是主API,另一个是用户API。每当我通过主API创建一个用户时,用户实际上是在用户API的数据库中创建的(我通过http请求在两个API之间进行通信)。在主API中,我有一个用户表,只包含一个唯一的ID。当用户在用户API中创建时,它会使用与主API相同的唯一ID。

我这样做是因为在生产环境中,我需要将数据存储在不同的服务器上。

现在我遇到了问题。

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

假设我有一个test_a方法,它创建了用户A,还有一个test_b方法,它创建了用户B。使用django.test.TestCase时,test_a会先运行,用户A会被创建,ID为1。然后我认为测试数据库(主API的数据库)会被清空,因为当test_b运行时,用户B也会被创建,ID也是1。问题是,在这两个测试之间,用户API的数据库没有被清空,所以我会遇到错误,因为我无法在测试数据库中创建用户B。

我在寻找一个优雅的解决方案来处理这个问题,但我真的没有头绪。

(抱歉,这段话有点长,但我想尽量准确一些)。

1 个回答

0

你不能在测试案例的 setUp 方法里清空数据库吗?因为这个方法会在每个测试之前运行一次,所以你可以为 test_a 和 test_b 准备一个干净的数据库。

如果你想用一个 bash 脚本来清空数据库,可以使用 subprocess,像这样:

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

撰写回答