Estoy tratando de migrar mis pruebas unitarias de H2 a Postgresql.
Actualmente, H2 me proporciona un esquema en memoria de modo que cada conexión se asigna a un esquema único, crea las tablas, ejecuta la prueba y descarta el esquema. La creación y destrucción del esquema es manejada automáticamente por H2.
Las pruebas unitarias se ejecutan simultáneamente.
¿Cuál es la mejor manera de hacer esto en Postgresql? Específicamente,
- ¿Cómo obtengo un esquema único por conexión?
- ¿Debería el marco de prueba generar nombres únicos o hay un mecanismo incorporado para hacerlo?
- ¿Cómo me aseguro de que se caiga el esquema cuando se cae la conexión?
- No quiero terminar con esquemas colgantes cuando se matan las pruebas unitarias.
- ¿Qué enfoque producirá el mayor rendimiento?
- Necesito crear / soltar decenas de esquemas por segundo.
ACTUALIZACIÓN : Encontré una respuesta relacionada aquí, pero no deja caer los esquemas en caso de que el proceso que ejecuta las pruebas unitarias se elimine.
fuente
pg_temp
es un esquema único, ¿verdad? Entonces, cuando ejecuto pruebas unitarias concurrentes, ¿no se golpearán entre sí las tablas / datos?SET search_path
; useSET LOCAL search_path
para configurar por subtransacción, o si lo desea, puede configurar a nivel de usuario conALTER USER mytestuser SET search_path = 'pg_temp'
, o a nivel de base de datos conALTER DATABASE mytestdb SET search_path = 'pg_temp'
pg_temp
esquema?Usted puede obtener el nombre del esquema temporal actual (después de crear la primera tabla temporal), como se establece en el enlace que ha añadido:
Pero su plan actual todavía no tendría mucho sentido. Para crear tablas en el esquema temporal actual, solo cree tablas temporales. Eso es todo. Por defecto,
search_path
se define de modo que las tablas temporales sean visibles primero. Uno nunca necesita calificar esquemáticamente tablas temporales. Nunca debería tener que abordar el esquema temporal actual directamente de ninguna manera, eso es un detalle de implementación.fuente
If you're explicitly sequences ...
: Creo que tu último comentario contenía un error tipográfico. ¿Qué quisiste decir entreexplicitly
ysequences
?¿Sus pruebas involucran transacciones? DDL es transaccional en PostgreSQL, por lo que si crea su esquema y tablas, luego ejecuta sus pruebas, todo dentro de una sola transacción que luego se revierte, el esquema nunca se confirma y es visible para otras sesiones.
Aún necesitaría usar un nombre probablemente único para su esquema (tal vez incluir nombre de host y PID), ya
CREATE SCHEMA
que fallará inmediatamente si ya existe un esquema con nombre idéntico y se bloqueará si otra sesión ha creado un esquema con nombre idéntico en Una transacción no comprometida.Una alternativa posiblemente sería usar tablas temporales, si puede modificar sus scripts de creación de base de datos para hacerlo.
fuente
CREATE SCHEMA
es la única que puede garantizar que desaparezcan cuando se mata la prueba de la unidad.Acabo de tener una idea.
Postgresql garantiza que una sesión no puede ver las tablas temporales de otra. Supongo que esto significa que cuando crea una tabla temporal, crea un esquema temporal. Entonces quizás podría hacer lo siguiente:
No me gusta confiar en los detalles de implementación, pero en este caso esto parece bastante seguro.
fuente