Django单元测试中的数据库权限

2 投票
5 回答
1775 浏览
提问于 2025-04-15 18:51

免责声明:

我刚接触Django,必须说到目前为止我真的很喜欢它。 :)

(现在说说“但是”...)

但是,我似乎在单元测试方面有些东西没搞明白。我正在做一个新的项目,后台使用的是Oracle。当我运行单元测试时,它在尝试创建架构时立刻就报了权限错误。所以,我明白它想做什么(创建一个干净的沙盒环境),但我真正想要的是在现有的架构上进行测试。而且我想用和我的服务器在生产环境中使用的相同用户名和密码来运行测试。当然,这个用户是没有任何DDL(数据定义语言)权限的。

所以,我看到的基本问题是:我的系统(以及大多数系统)希望“app_user”账户只有运行所需的权限。通常,这些是基本的“增删改查”权限。然而,Django的单元测试似乎需要比这更多的权限才能进行测试。

其他人是怎么处理这个问题的?Django有没有什么设置、解决方法或功能是我不知道的(请参考最初的免责声明)。

提前感谢你的帮助。

大卫

5 个回答

2

在我看到David的问题后,我也很好奇这个事情,但我没有看到我期待的答案。所以让我试着重新表述一下我认为David想问的部分。在实际的生产环境中,我相信他的Django模型可能没有权限去创建或删除数据库表。他的数据库管理员可能不会允许他有这样的权限。(我们假设这是对的。)他在数据库中的登录权限只是普通用户的权限。但是在他的开发环境中,Django的单元测试框架强制他需要更高的权限来进行单元测试,而不是普通用户的权限,因为Django需要这些权限来创建或删除模型的单元测试表。由于单元测试现在是在比生产环境更高的权限下运行的,你可以说在开发中运行的单元测试并不是100%有效的,生产环境中可能会出现一些错误,而这些错误在开发中可能会被发现,如果Django能够用普通用户的权限来运行单元测试的话。

我很好奇Django的单元测试是否会有能力用一个用户的(更高)权限来创建或删除表,并用另一个用户的(较低)权限来运行单元测试。这将有助于在开发中更准确地模拟生产环境。

也许在实际操作中,这根本不是个问题。而且相比于得到的好处,这个风险是微不足道的,所以不值得担心。

2

正如你发现的,Django默认的测试运行器有很多假设,其中之一就是它能创建一个新的测试数据库来运行测试。

如果你需要改变这些默认的假设,可能就需要编写一个自定义的测试运行器。这样,你就可以完全控制测试是如何被发现、启动和运行的。

(如果你正在使用Django的开发版本,或者期待Django 1.2,注意最近定义自定义测试运行器变得简单多了。)

如果你多看看,会发现有一些示例,还有自定义测试运行器可以帮助你入门。

现在,记住一旦你接管了测试运行,你需要确保满足与Django内置运行器相同的环境假设。特别是,你需要保证你使用的测试数据库是一个干净、全新的数据库来进行测试——如果你尝试在一个内容不确定的数据库上运行测试,你会非常不高兴。

2

不要强迫Django去做一些不自然的事情。

  1. 让它自己创建测试数据库结构。这是件好事。

  2. 从你现有的数据库结构中,使用unload命令生成数据的.JSON文件。这些文件就是你的“数据模板”。Django会用这些数据模板来填充测试数据库。这是最棒的测试工具。一旦你把数据模板整理好,效果真的很好。

  3. 把你的数据模板文件放到每个应用包中的fixtures目录里。

  4. 更新你的单元测试,指定每个测试案例所需的数据模板文件。

这样做实际上是在用现有的数据库结构进行测试。它会在一个全新的数据库中重建、重新加载并测试,这样你就可以完全确保它的工作不会破坏(甚至影响)真实的数据。

撰写回答