2012-06-05 7 views
35

¿Cuál es la diferencia entre las estrategias de truncamiento, transacción y eliminación de base de datos al usar Rspec? No puedo encontrar ningún recurso que explique esto. Leí el archivo Léame de Database Cleaner pero no explica lo que hace cada uno de ellos.Diferencia entre estrategias de base de datos de truncamiento, transacción y eliminación

¿Por qué tenemos que usar la estrategia de truncado para Capibara? ¿Debo limpiar mi base de datos cuando la pruebo o puedo deshabilitarla? No entiendo por qué debería limpiar mi base de datos después de cada caso de prueba, ¿no sería más lento la prueba?

Respuesta

54

Las estrategias de limpieza de la base de datos se refieren a la terminología de la base de datos. Es decir. esos términos provienen del mundo de la base de datos (SQL), por lo que las personas generalmente familiarizadas con la terminología de la base de datos sabrán a qué se refieren.

Los ejemplos a continuación se refieren a las definiciones SQL. DatabaseCleaner, sin embargo, también es compatible con otros tipos de bases de datos que no son SQL, pero en general las definiciones serán las mismas o similares.

Supresión

Esto significa que las tablas de la base se limpian utilizando el DELETE FROM instrucción SQL. Por lo general, es slower than truncation, pero may have other advantages instead.

truncamiento

Esto significa que las tablas de la base se limpian mediante la instrucción TRUNCATE TABLE. Esto simplemente vaciará la tabla inmediatamente, sin eliminar la estructura de la tabla en sí misma o eliminar los registros individualmente.

Transacción

Esto significa utilizar BEGIN TRANSACTION declaraciones junto con ROLLBACK para hacer retroceder una secuencia de operaciones de base de datos anteriores. Piense en ello como un "botón de deshacer" para las bases de datos. Creo que este es el método de limpieza más utilizado, y probablemente el más rápido, ya que los cambios no necesitan comprometerse directamente con el DB.

Ejemplo de discusión: Rspec, Cucumber: best speed database clean strategy

Razón de la estrategia de truncamiento con Carpincho

La mejor explicación se encuentra en la Capybara docs themselves:

# Transactional fixtures do not work with Selenium tests, because Capybara 
# uses a separate server thread, which the transactions would be hidden 
# from. We hence use DatabaseCleaner to truncate our test database. 

requisitos de limpieza

No es necesario que limpie su base de datos después de cada caso de prueba. Sin embargo, debe ser consciente de los efectos secundarios que esto podría tener. Es decir. Si crea, modifica o elimina algunos registros en un solo paso, ¿los otros pasos se verán afectados por esto?

Normalmente RSpec corre con accesorios transaccionales encendidos, por lo que nunca se dará cuenta de esto cuando se ejecuta RSpec - simplemente mantendrá la base de datos automáticamente limpia para usted:

https://www.relishapp.com/rspec/rspec-rails/v/2-10/docs/transactions

+1

Gracias por su explicación detallada. Eso realmente explica mucho. El enlace a rspec-rails docs también es extremadamente útil.Te agradezco mucho tu ayuda :) –

+13

Esto no es del todo cierto. La [estrategia de eliminación] (https://github.com/bmabey/database_cleaner/blob/master/lib/database_cleaner/active_record/deletion.rb) se supone que es más rápida que el truncamiento porque ejecuta "DELETE FROM table" en lugar de 'Tabla TRUNCATE TABLE' - por lo que elimina todos los registros sin hacer cosas como restablecer secuencias. –

Cuestiones relacionadas