【问题标题】:Finding a Python Library to Mock a Database [closed]寻找 Python 库来模拟数据库 [关闭]
【发布时间】:2011-08-22 17:44:31
【问题描述】:

我即将完成一个涉及 Python 的大学项目,而我的团队缺少测试用例。我们需要更多,具体来说,我们需要一些数据库测试用例。然而,这就是嘲笑的来源。我们需要一个可用于模拟数据库的 Python 特定库,因此测试用例不使用 SQL 或访问真实数据库。我们将 MySQL 用于真正的数据库。遇到一个易于使用的 Python 数据库模拟库对我来说有点困难。对于我们的测试用例,什么是最好的?或者,有没有更好的方法在不接触 Python 的情况下测试数据库?非常感谢您的建议。谢谢:-)

【问题讨论】:

  • 你不能只创建一个数据库的测试版本吗?如果出于某种原因您不想或不能使用 MySQL 进行测试,SQLite 与 Python 捆绑在一起,从 2.7 版开始
  • Python 是否像 Ruby 一样使用任何内置数据库?
  • 我知道 ruby​​ on rails 框架有一个抽象,所以你不必构造 SQL,你指的是这个吗? Python 语言没有类似的内置函数。如果你在谈论我在想什么,它是框架的功能,而不是 ruby​​ 语言。我可能完全错了。
  • 是的,我说的是框架,Rails。我们正在使用 Python 框架 Django。
  • 不幸的是,我认为您在错误的地方寻找功能。 Python 语言不提供您正在寻找的东西,但我认为没有。和Eli一起,听起来你可能需要配置一个Django/MySQL的测试实例

标签: python database django testing mocking


【解决方案1】:

这里有一些使用 Mock 进行数据库测试的具体示例:

http://python-mock.sourceforge.net/#example-usage

【讨论】:

    【解决方案2】:

    如果您绝对必须使用模拟而不是其他人提到的 Django,我建议您使用 Fudge 或 Mock。

    【讨论】:

    • Mock 现在在 Python 3 的标准库中
    【解决方案3】:

    根据一些 cmets,您似乎正在使用 Django。如果是这种情况,那么您将需要使用数据夹具将测试数据填充到测试数据库中。 Karen M. Tracey 的书Django 1.1 Testing and Debugging 是关于这个主题的一个极好的资源。

    以下是您要执行的操作的摘要:

    1. 使用管理界面将数据输入您的实时/真实数据库。
    2. 使用以下方法从实时数据库中转储数据:

      python manage.py dumpdata {django-app} --indent 4 >test_data.json
      

      将 {django-app} 替换为您的 Django 应用程序的名称。

    3. 将test_data.json放入目录{django-app}/fixtures

    4. 指定您的测试用例应使用以下方式加载夹具数据:

      Class MyTest(TestCase):
      
          fixtures = ['test_data.json']
      
          def testThisCode(self):
              # Test code
      

    要了解更多信息,除了Karen M. Tracey's book,您还可以查看Fixture Loading 上的Django 文档

    【讨论】:

      【解决方案4】:

      如果你使用 django,fixtures 可以解决你的问题。我真的不知道你所说的模拟库是什么意思,但它们允许你用测试数据填充你的数据库。然后您可以与您的 TestCase 进行交互。测试数据在每个 TestCase 之后被销毁。 http://docs.djangoproject.com/en/dev/howto/initial-data/

      【讨论】:

        【解决方案5】:

        我个人倾向于编写我的单元测试来使用单独的测试数据库,所以我通常会有一个包含我的数据库信息的testing.conf 文件,与我的常规development.conf 和/或production.conf 文件分开。这使得我的单元测试更接近生产环境中执行代码的实际条件。

        例如,我最近开发了一个 Python 库,用户为其调用模块级 initialize 函数,并传入配置文件的名称。然后initialize 函数使用ConfigParser 模块解析配置文件,启动它需要运行的任何线程,创建 urllib 处理程序,建立数据库连接等。

        这种设置可以轻松进行单元测试,因为您可以在执行之前简单地让单元测试调用您的 initialize 函数,并传入一个指向您的测试数据库的配置。

        【讨论】:

        • 谢谢...但是我的领导需要一个模拟库...Python 有没有好的、对程序员友好的库?
        • 如果你的测试真的在数据库上工作,那么它们不是“单元测试”,而是“集成测试”
        猜你喜欢
        • 2011-08-02
        • 2011-02-06
        • 2012-02-15
        • 1970-01-01
        • 2014-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-06
        相关资源
        最近更新 更多