English 中文(简体)
Django单元测试中的DB权限
原标题:DB Permissions with Django unit testing

免责声明:

我对Django非常新。我必须说,到目前为止,我真的很喜欢它。 :)

(现在是“但是”的时候了……)

但是,似乎我在单元测试方面缺少了一些东西。我正在一个使用Oracle后端的新项目上工作。当你运行单元测试时,它立即在尝试创建模式时给出权限错误。所以,我知道它想做什么(创建一个干净的沙盒),但是我真正想要的是对现有模式进行测试。我希望使用与我的服务器在生产中将要使用的相同的用户名/密码运行测试。当然,该用户不会具有任何DDL类型的权限。

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

其他人是如何处理这个问题的?是否有一些 Django 的设置/解决方法/功能是我没有意识到的(请参考初始免责声明)。

事先感谢您的帮助。

大卫

最佳回答

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

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

  2. 从现有的模式中,执行卸载以创建数据的.JSON转储文件。 这些文件是您的“装置”。 Django使用这些夹具填充测试数据库。 这是有史以来最伟大的测试工具。 一旦您解决了您的装置问题,这确实运作良好。

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

  4. 更新您的单元测试,命名为所需的各种固定装置文件,以供测试用例使用。

这实际上是对现有模式进行测试。它重建、重新加载和在一个没有数据的数据库中进行测试,以确保没有破坏(或甚至未触及)现有数据的情况下,它能够正常工作。

问题回答

如你发现的那样,Django的违约测试操作员做了一些假设,包括无法建立一个新的测试数据库来进行测试。

如果您需要覆盖这个或任何这些默认假设,您可能想要编写一个自定义的测试运行器。这样做可以完全控制测试的发现、引导和运行过程。

如果你正在运行Django的开发版本或者期待着Django1.2,注意定义自定义的测试运行器已经变得相当容易了。

如果你仔细找找,你会发现一些示例,你可以用它们自定义测试运行程序来开始。

现在,请记住,一旦控制了测试运行,您需要确保您满足关于环境的相同假设,这些假设与Django内置的运行器相同。特别是,您需要确保您将使用的任何测试数据库都是测试的干净,新鲜的数据库-如果您尝试针对具有不可预测内容的数据库运行测试,您将感到非常不满意。

阅读了David的问题(OP)后,我也很好奇,但我没有看到我希望看到的答案。所以让我尝试重新表述我认为David的问题的部分内容。在生产环境中,我相信他的Django模型可能没有访问创建或删除表的权限。他的DBA可能不允许他这样做。(让我们假设这是真的)。他将只以普通用户特权登录数据库。但在开发环境中,Django单元测试框架强制他具有更高级别的特权,而不是普通用户,因为Django要求为模型单元测试创建/删除表。由于单元测试现在以比生产环境中更高的特权运行,您可以认为在开发中运行单元测试并不100%有效,并且如果Django能够以用户特权运行单元测试,则在生产中可能会发生错误,这在开发中可能已被捕获。

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

或许在实际应用中,这真的不是个问题。而且风险与回报相比如此微小,以至于不值得担心它。

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

我建议的是,你只授权给你的 app_user 在你的test_数据库上进行 DDL 必要的特权。

如果您不喜欢这种解决方案,那么请看一下这篇博客文章,在那里一位开发者也遇到了您的情况,并用解决方法解决了它。

将此翻译为中文:http://www.stopfinder.com/blog/2008/07/26/flexible-test-database-engine-selection-in-django/ Django中灵活的测试数据库引擎选择

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

HTH。

Sorry, "aj" is not a valid word or phrase that can be translated into Chinese. Please provide more context or information.

What you can do, is creating separate test settings. As I ve learned at http://mindlesstechnology.wordpress.com/2008/08/16/faster-django-unit-tests/ you can use the sqlite3 backend, which is created in memory by the Django unit test framework.

引用:

Create a new test-settings.py file next to your app’s settings.py containing:

从projectname.settings导入* DATABASE_ENGINE = sqlite3

Then when you want to run tests real fast, instead of manage.py test, you run

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

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

Obviously you still want to run tests on your real db backend, but this is awesome for sanity checks, and while you’re doing test development.

为了加载初始数据,请在你的测试用例中提供 fixtures。

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




相关问题
what is wrong with this mysql code

$db_user="root"; $db_host="localhost"; $db_password="root"; $db_name = "fayer"; $conn = mysqli_connect($db_host,$db_user,$db_password,$db_name) or die ("couldn t connect to server"); // perform query ...

Users asking for denormalized database

I am in the early stages of developing a database-driven system and the largest part of the system revolves around an inheritance type of relationship. There is a parent entity with about 10 columns ...

Easiest way to deal with sample data in Java web apps?

I m writing a Java web app in my free time to learn more about development. I m using the Stripes framework and eventually intend to use hibernate and MySQL For the moment, whilst creating the pages ...

join across databases with nhibernate

I am trying to join two tables that reside in two different databases. Every time, I try to join I get the following error: An association from the table xxx refers to an unmapped class. If the ...

How can I know if such value exists in database? (ADO.NET)

For example, I have a table, and there is a column named Tags . I want to know if value programming exists in this column. How can I do this in ADO.NET? I did this: OleDbCommand cmd = new ...

Convert date to string upon saving a doctrine record

I m trying to migrate one of my PHP projects to Doctrine. I ve never used it before so there are a few things I don t understand. In my current code, I have a class similar to this: class ...

热门标签