van.pg es un módulo de Python que proporciona un fácil creación de bases de datos PostgreSQL (y grupos) para las pruebas unitarias.
Dirty Bases de datos
Bases de datos de prueba toman mucho tiempo para crear. En general tiene que ser un poco cuidadoso cuando decide eliminar / recrear un accesorio de la base de datos de prueba.
Además, parece que no hay manera robusta en PostgreSQL de averiguar si una base de datos que se cometió o no.
Así van.pg tiene otra opción que colocar la responsabilidad en la que notificar cuando una base de datos está sucio. Si esto no se hace correctamente, se verá comprometida aislamiento prueba. No es lo ideal, pero lo mejor que podemos hacer.
Una excepción es si se utiliza constantemente el paquete de transacción (http://pypi.python.org/pypi/transaction) para gestionar la base de datos se compromete. En este caso, usted puede solicitar el recurso a ensuciarse cuando se confirma una transacción.
La integración con testresources
La forma típica de usar estos accesorios es a través testresources (http://pypi.python.org/pypi/testresources/):
& Nbsp; >>> from testresources importan ResourcedTestCase
& Nbsp; >>> from van.pg DatabaseManager importación
& Nbsp; >>> psycopg2 importación
& Nbsp; >>> def init_db (db):
& Nbsp; ... conn = psycopg2.connect (host = db.host, base de datos = db.database)
& Nbsp; ... act = conn.cursor ()
& Nbsp; ... cur.execute ("CREATE foo MESA (bar INTEGER);")
& Nbsp; ... conn.commit ()
& Nbsp; ... conn.Close ()
& Nbsp; >>> clase MyTest (ResourcedTestCase):
& Nbsp; ...
& Nbsp; ... recursos = [('db', DatabaseManager (initialize_sql = init_db))]
& Nbsp; ...
& Nbsp; ... def runTest (self):
& Nbsp; ... conn = psycopg2.connect (host = self.db.host, base de datos = self.db.database)
& Nbsp; ... act = conn.cursor ()
& Nbsp; ... cur.execute ("INSERT INTO VALORES foo (1);")
& Nbsp; ... conn.commit ()
& Nbsp; ... act = conn.cursor ()
& Nbsp; ... cur.execute ("SELECT * FROM foo")
& Nbsp; ... self.assertEquals (cur.fetchall (), [(1,)])
& Nbsp; ... # NOTA: debe cerrar las conexiones o eliminar bases de datos falla
& Nbsp; ... conn.Close ()
& Nbsp; ... self.db.dirtied () # cambiamos el PP, por lo que debe volver a la carga
En realidad ejecutar la prueba:
& Nbsp; >>> from unittest TextTestRunner importación
& Nbsp; >>> import sys
& Nbsp; >>> corredor = TextTestRunner (corriente = sys.stdout)
& Nbsp; >>> runner.run (MyTest ()) # doctest: + ELLIPSIS
& Nbsp ;.
& Nbsp; ...
& Nbsp; Aceptar
& Nbsp; ...
Bases de datos Uso de la plantilla
Si necesita volver a crear las bases de datos misma muchas veces, puede ser más rápido para que PostgreSQL copiar la base de datos a partir de una base de datos de plantilla. Usted puede hacer esto por tener uno DatabaseManager servir como plantilla para la otra:
& Nbsp; >>> template_db = DatabaseManager (initialize_sql = init_db)
& Nbsp; >>> clase MyTest2 (MyTest):
& Nbsp; ... recursos = [('db', DatabaseManager (plantilla = template_db))]
& Nbsp; >>> runner.run (MyTest2 ()) # doctest: + ELLIPSIS
& Nbsp ;.
& Nbsp; ...
& Nbsp; Aceptar
& Nbsp; ...
integración transacción
Si la palabra clave argumen dirty_on_commit es cierto que un DatabaseManager marcará la base de datos como ensuciado después de cada commit de éxito realizadas a través del módulo de transacción. Esto significa que cada prueba que ensucia la base de datos no tiene que notificar manualmente.
& Nbsp; >>> hombre = DatabaseManager (dirty_on_commit = True)
Si utiliza esta función, debe depender de la transacción (http://pypi.python.org/pypi/transaction) empaquetar usted mismo.
El uso de una base de datos existente
Por defecto, van.pg crea un nuevo clúster PostgreSQL en un directorio temporal y lanza un demonio PostgreSQL. Esto funciona la mayoría del tiempo, pero no es muy rápido.
Si tiene un cluster PostgreSQL ya se está ejecutando, se puede decir van.pg usarlo configurando el entorno VAN_PG_HOST variable. Por ejemplo, para realizar pruebas de van.pg contra un servidor local de PostgreSQL con sus tomas en / tmp / pgcluster hacer:
VAN_PG_HOST prueba setup.py = / tmp / pgcluster python
ADVERTENCIA: cualquier base de datos a partir de TEST_DB en la base de datos de destino es probable que se cayó.
Conexiones cierre
Tenga cuidado de cerrar bien todas las conexiones a la base de datos una vez que su examen se hace con ella. PostgreSQL no permite borrar bases de datos, mientras que hay conexiones abiertas. Esto hará que van.pg a error al tratar de dejar la base de datos de prueba.
Programáticamente crear un clúster de
En un nivel inferior, también se puede manipular mediante programación de su propio grupo de PostgreSQL.
Inicialice el Cluster:
& Nbsp; >>> from van.pg Cluster importación
& Nbsp; >>> clúster = Cluster ()
& Nbsp; >>> cluster.initdb ()
Que crea una base de datos en un directorio temporal:
& Nbsp; >>> os importación
& Nbsp; >>> dbdir = cluster.dbdir
& Nbsp; >>> 'pg_version' en os.listdir (dbdir)
& Nbsp; El verdadero
Iniciarlo:
& Nbsp; >>> cluster.start ()
Crear / Pruebe una base de datos:
& Nbsp; >>> dbname = cluster.createdb ()
Podemos conectar con la base de datos:
& Nbsp; >>> psycopg2 importación
& Nbsp; >>> conn = psycopg2.connect (base de datos = dbname, host = cluster.dbdir)
& Nbsp; >>> act = conn.cursor ()
Twiddle la base de datos para asegurarse de que podemos hacer lo básico:
& Nbsp; >>> cur.execute ("CREATE TABLE x (y int)")
& Nbsp; >>> cur.execute ("INSERT INTO x VALUES (1)")
& Nbsp; >>> conn.commit ()
& Nbsp; >>> cur.execute ("SELECT * from x")
& Nbsp; >>> cur.fetchall () [0] [0]
& Nbsp; 1
Detenga el daemon clúster:
& Nbsp; >>> conn.Close ()
& Nbsp; >>> cluster.stop ()
Comience de nuevo:
& Nbsp; >>> cluster.start ()
& Nbsp; >>> conn = psycopg2.connect (base de datos = dbname, host = cluster.dbdir)
& Nbsp; >>> act = conn.cursor ()
& Nbsp; >>> cur.execute ("SELECT * from x")
& Nbsp; >>> cur.fetchall () [0] [0]
& Nbsp; 1
Y la limpieza:
& Nbsp; >>> conn.Close ()
& Nbsp; >>> cluster.cleanup ()
& Nbsp; >>> cluster.dbdir es Ninguno
& Nbsp; El verdadero
& Nbsp; >>> os.path.exists (dbdir)
& Nbsp; Falso
Desarrollo
El desarrollo tiene lugar en GitHub:
& Nbsp; http: //github.com/jinty/van.pg
¿Cuál es nuevo en esta versión:
- Soporte Python 3.2.
- gota Python 2.5 apoyo.
- Añadir tox.ini para las pruebas en contra de varias versiones de python.
- Ejecutar PostgreSQL como un subproceso en lugar de como un demonio (vía pg_ctl).
- Reorganizar código para mejorar la reutilización y la cobertura de la prueba.
Requisitos :
- Python
Comentarios que no se encuentran