2015-02-10 22 views
6

Io uso Python 3.4 dalla distribuzione Anaconda. All'interno di questa distribuzione, ho trovato la libreria pymysql per connettersi a un database MySQL esistente, che si trova su un altro computer.Mock un database MySQL in Python

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") 

Ora voglio scrivere codice di prova per la mia domanda, nella quale voglio creare un piccolo database al setUp di tutti i casi di test, preferibilmente in memoria. Tuttavia, quando provo tutto ciò con il blu pymysql, non è possibile stabilire una connessione.

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)") 

Ho stato googling intorno, e hanno trovato alcune cose su SQLite e MySQLdb. Ho le seguenti domande:

  1. E` sqlite3 o MySQLdb adatto per la rapida creazione di un database in memoria?
  2. Come installare MySQLdb all'interno del pacchetto Anaconda?
  3. Esiste un esempio di un database di test, creato nello setUp? Questa è anche una buona idea?

Non ho un server MySQL in esecuzione sul computer locale.

+2

la risposta potrebbe essere quella di ottenere * * un db MySQL in esecuzione a livello locale. SQLite ha molte differenze con mysql quindi non sarebbe un buon test per sostituire mysql con SQLite. –

risposta

4

Sia pymysql, MySQLdb e sqlite vogliono anche un vero database da connettere. Se vuoi solo testare il tuo codice, devi solo prendere in giro il modulo pymysql sul modulo che vuoi testare e usarlo di conseguenza (nel tuo codice di test: puoi configurare l'oggetto mock per restituire i risultati hardcoded a istruzioni SQL predefinite)

controllare la documentazione su Python nativo beffardo biblioteca: https://docs.python.org/3/library/unittest.mock.html

Oppure, per Python 2: https://pypi.python.org/pypi/mock

+2

Sembra che non sia possibile ciò che voglio allora. L'obiettivo non è quello di prendere in giro pymysql, dal momento che voglio testare se il codice funziona su un "vero" database SQL. Non importa se questo ha tutte le peculiarità di MySQL, ma dovrebbe essere in grado di comunicare con attraverso pymysql. Installare un server MySQL localmente su tutti i computer su cui eseguo i test non è pratico. – physicalattraction

+2

SQLite * è * un database "reale", al contrario di pymysql e MySQLdb che sono semplicemente connettori a MySQL. – Air

+0

Si noti inoltre che in nessun modo è necessario avere un MySQL in "tutte le macchine che devono eseguire test" - tutti possono connettersi a uno stesso database MySQL, in una singola macchina, dato un URL di connessione – jsbueno