2015-02-10 75 views
6

我使用Anaconda发行版中的Python 3.4。在这个发行版中,我发现pymysql库连接到位于另一台计算机上的现有MySQL数据库。在Python中模拟MySQL数据库

import pymysql 
config = { 
     'user': 'my_user', 
     'passwd': 'my_passwd', 
     'host': 'my_host', 
     'port': my_port 
    } 

    try: 
     cnx = pymysql.connect(**config) 
    except pymysql.err.OperationalError : 
     sys.exit("Invalid Input: Wrong username/database or password") 

我现在想编写测试代码我的应用程序,其中我想创建一个在每个测试用例的setUp一个很小的数据库,最好是在内存中。但是,当我用pymysql来试探这个问题时,它无法建立连接。

def setUp(self): 
    config = { 
     'user': 'test_user', 
     'passwd': 'test_passwd', 
     'host': 'localhost' 
    } 
    cnx = pymysql.connect(**config) 

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 61] Connection refused)") 

我一直在谷歌上搜索周围,发现约SQLiteMySQLdb一些事情。我有以下问题:

  1. sqlite3MySQLdb适合在内存中快速创建数据库吗?
  2. 如何在Anaconda软件包中安装MySQLdb
  3. 有没有在setUp中创建的测试数据库的例子?这是个好主意吗?

我没有在本地计算机上运行的MySQL服务器。

+2

答案很可能是* *获得一个MySQL数据库在本地运行。 SQLite与mysql有很多不同之处,因此用SQLite替换mysql并不是一个好的测试。 – 2015-02-10 12:45:45

回答

4

pymysql,MySQLdb和sqlite都需要一个真正的数据库来连接。 如果你只是想测试你的代码,你应该模拟你想测试的模块上的pymysql模块,并相应地使用它 (在你的测试代码中:你可以设置模拟对象以将硬编码结果返回给预定义的SQL语句)

检查本机Python的文档在嘲讽库: https://docs.python.org/3/library/unittest.mock.html

或者是,Python 2: https://pypi.python.org/pypi/mock

+2

看来这是不可能的,然后我想要的。我们的目标不是模拟pymysql,因为我想测试代码是否在“真实”SQL数据库上工作。这并不重要,如果它具有MySQL的所有特性,但它应该能够通过pymysql进行通信。在我运行测试的每台机器上本地安装MySQL服务器是不实际的。 – physicalattraction 2015-02-11 08:01:51

+2

SQLite *是一个“真实”的数据库,而不是pymysql和MySQLdb,它们只是MySQL的连接器。 – Air 2015-02-14 01:06:43

+0

另外请注意,绝不需要在“您必须运行测试的所有机器”中拥有MySQL - 在一台计算机上,所有这些机器都可以连接到同一个MySQL数据库,并给出连接URL – jsbueno 2016-01-30 15:01:32