寻找一个用于模拟数据库的Python库

16

我即将完成一个涉及Python的大学项目,但我们的团队缺少测试用例,尤其是数据库的测试用例。然而,这就需要使用mocking。我们需要一种Python特定的库来模拟数据库,以便测试用例不使用SQL或访问真实的数据库。我们正在使用MySQL作为真实的数据库。对我来说,很难找到一个易于使用的Python数据库mocking库。在没有接触到它的情况下,有什么更好的方法来测试Python中的数据库吗?非常感谢您的建议,谢谢:-)


你能不能创建一个数据库的测试版本呢?如果由于某些原因你不想或者不能使用MySQL进行测试,那么从2.7版本开始,SQLite已经与Python捆绑在一起了。 - tMC
Python是否使用任何内置数据库,就像Ruby一样? - Michael Minkov
我知道 Ruby on Rails 框架有一个抽象层,因此您不必构建 SQL,这是您所指的吗?Python 语言本身没有内置类似的功能;如果您说的是我想的那个,那是框架的一个函数,而不是 Ruby 语言。我可能完全错了。 - tMC
是的,我在谈论框架,Rails。我们正在使用Python框架Django。 - Michael Minkov
1
很遗憾,我认为你正在错误的地方寻找功能。Python语言并没有提供你所需要的功能,但我认为其他语言也不会有。跟随Eli的建议,听起来你可能需要配置一个Django/MySQL的测试实例。 - tMC
显示剩余3条评论
5个回答

6

如果你一定要使用模拟对象而不是其他人提到的Django工具,我建议使用 FudgeMock


3
Mock现在已经被包含在Python 3的标准库中。 - logc

5
如果你正在使用django,fixtures可以解决你的问题。我不太清楚你所说的mocking library是什么意思,但它们允许你用测试数据填充数据库。然后你可以在TestCase中与其进行交互。测试数据在每个TestCase之后都会被销毁。 http://docs.djangoproject.com/en/dev/howto/initial-data/

2
个人而言,我倾向于编写单元测试使用一个独立的测试数据库。因此,我通常会有一个名为testing.conf的文件,其中包含我的数据库信息,与我的常规development.conf和/或production.conf文件分开。这使得我的单元测试更类似于在生产环境下执行代码的实际条件。
例如,我最近为一个Python库开发了一个模块级别的initialize函数,用户调用该函数并传入配置文件的名称。然后,initialize函数使用ConfigParser模块解析配置文件,启动它需要运行的任何线程,创建urllib处理程序,建立数据库连接等等。
这种设置允许轻松进行单元测试,因为您可以简单地让您的单元测试在执行之前调用initialize函数,并传入指向您的测试数据库的配置。

谢谢...但是我的领导需要一个模拟库...Python有一个好的、程序员友好的吗? - Michael Minkov
如果您的测试确实涉及数据库,那么它们不是“单元测试”,而是“集成测试”。 - Dimitre Novatchev

1

根据一些评论,看起来你正在使用Django。如果是这样的话,那么你需要使用数据夹具将测试数据填充到测试数据库中。关于这个主题的一个很好的资源是Karen M. Tracey的书Django 1.1 Testing and Debugging

以下是你需要做的事情的摘要:

使用管理界面将数据输入到您的实时/真实数据库中。
使用以下命令从您的实时数据库中转储数据:
``` python manage.py dumpdata {django-app} --indent 4 > test_data.json ```
将`{django-app}`替换为您的Django应用程序的名称。
将`test_data.json`放在目录`{django-app}/fixtures`中。
使用以下代码指定您的测试案例应加载fixture数据:
```python class MyTest(TestCase): fixtures = ['test_data.json']
def testThisCode(self): # Test code ```

如需更多信息,除了Karen M. Tracey的书之外,您还可以查看Django关于Fixture Loading的文档。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接