繁体   English   中英

Django单元测试的数据库权限

[英]DB Permissions with Django unit testing

免责声明:

我是Django的新手。 我必须说到目前为止,我真的很喜欢。 :)

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

但是,似乎缺少与单元测试有关的东西。 我正在使用Oracle后端进行新项目。 当您运行单元测试时,在尝试创建模式时,它会立即显示权限错误。 因此,我了解了它正在尝试做的事情(创建一个干净的沙箱),但是我真正想要的是针对现有架构进行测试。 我想使用服务器要在生产环境中使用的相同用户名/密码来运行测试。 当然,该用户将不会拥有任何类型的DDL类型权限。

因此,我看到的基本问题/问题归结为:我的系统(和大多数系统)希望拥有其“ app_user”帐户,以仅具有运行所需的权限。 通常,这是基本的“ CRUD”权限。 但是,Django单元测试似乎需要更多来进行测试运行。

其他人如何处理? 是否存在我不知道的Django的一些设置/解决方法/功能(请参阅初始免责声明)。

在此先感谢您的帮助。

大卫

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

  1. 允许它创建测试架构。 这是一件好事。

  2. 从现有架构中进行unload以创建数据的.JSON转储文件。 这些文件是您的“灯具”。 Django使用这些装置来填充测试数据库。 这是有史以来最强大的测试工具。 一旦摆放了灯具,这确实可以很好地工作。

  3. 将您的装置文件放入每个应用程序包内的fixtures目录中。

  4. 更新您的单元测试,以命名该测试用例所需的各种灯具文件。

实际上,这是在现有模式下进行测试。 它可以在原始数据库中重建,重新加载和测试,因此您可以绝对确定它可以正常工作,而不会破坏(甚至不涉及)实时数据。

正如您所发现的,Django的默认测试运行程序做出了许多假设,包括它将能够创建新的测试数据库来运行测试。

如果您需要覆盖此默认假设或任何这些默认假设,则可能需要编写自定义测试运行器 这样,您将完全控制如何发现,引导和运行测试。

(如果您正在运行Django的开发主干,或者期待Django 1.2,请注意,自定义测试运行器的定义最近变得相当容易 。)

如果您四处逛逛,您会发现一些可用于入门的自定义测试运行器 示例

现在,请记住,一旦您控制了测试运行,就需要确保您对Django的内置运行器的环境的要求与假设相同。 特别是,您需要保证某人将要使用的任何测试数据库都是干净,新鲜的测试数据库-如果您尝试对内容无法预测的数据库运行测试,您将非常不满意。

在阅读了David的(OP)问题之后,我也对此感到很好奇,但是我没有看到我希望看到的答案。 因此,让我尝试改写我认为至少是大卫提出的要求的一部分。 在生产环境中,我确定他的Django模型可能无法访问创建或删除表。 他的DBA可能不会允许他这样做。 (让我们假设这是真的)。 他将仅以常规用户权限登录到数据库。 但是在他的开发环境中,Django单元测试框架迫使他对单元测试拥有更高级别的特权,而不是普通用户,因为Django要求它为模型单元测试创​​建/删除表。 由于单元测试现在以比生产环境更高的特权运行,因此您可以争辩说,在开发环境中运行单元测试不是100%有效的,如果Django可以使用用户权限。

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

也许实际上这不是问题。 与回报相比,风险是如此之小,以至于不值得担心。

一般而言,当单元测试依赖于要提供的测试数据时,它们也依赖于其处于特定的格式/状态。 这样,您框架的策略不仅是执行DML(删除/插入测试数据记录),而且还执行DDL(删除/创建表)以确保在运行测试之前一切正常。

我建议您仅将test_数据库上的app_user授予DDL必要的特权。

如果您不喜欢该解决方案,请查看此博客条目,在该条目中,开发人员还遇到了您的情况并通过变通办法解决了该问题:

http://www.stopfinder.com/blog/2008/07/26/flexible-test-database-engine-selection-in-django/

就个人而言,我的选择是修改测试数据库的权限。 这样,在比较测试/生产环境之间的性能/结果时,我可以排除所有其他变量

HTH,

-AJ

您可以做的是创建单独的测试设置。 正如我在http://mindlesstechnology.wordpress.com/2008/08/16/faster-django-unit-tests/上了解到的那样,您可以使用sqlite3后端,该后端由Django单元测试框架在内存中创建。

引用:

在应用程序的settings.py旁边创建一个新的test-settings.py文件,其中包含:

来自projectname.settings import * DATABASE_ENGINE ='sqlite3'

然后,当您想真正快速地运行测试而不是manage.py test时,请运行

manage.py test --settings =测试设置

这将在不到5秒的时间内运行我的测试套件。

显然,您仍然希望在实际的数据库后端上运行测试,但这对于健全性检查以及进行测试开发时非常有用。

要加载初始数据,请在测试用例中提供固定装置。

class MyAppTestCase(TestCase):
    fixtures = ['myapp/fixtures/filename']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM