2015-02-10 76 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