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
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 :) –
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. –