2012-06-05 13 views
35

Qual è la differenza tra le strategie del database di troncamento, transazione e cancellazione quando si utilizza Rspec? Non riesco a trovare risorse per spiegarlo. Ho letto il readme di Database Cleaner ma non spiega cosa fanno ciascuno di questi.Differenza tra strategie di database di troncamento, transazione e cancellazione

Perché dobbiamo usare la strategia di troncamento per Capybara? Devo pulire il mio database durante il test o posso disabilitarlo. Non capisco perché dovrei pulire il mio database dopo ogni test case, non sarebbe solo rallentare i test?

risposta

54

Le strategie di pulizia del database si riferiscono alla terminologia del database. Cioè Questi termini provengono dal mondo del database (SQL), quindi le persone che hanno familiarità con la terminologia del database sapranno cosa significano.

Gli esempi riportati di seguito si riferiscono alle definizioni SQL. DatabaseCleaner tuttavia supporta anche altri tipi di database non SQL, ma generalmente le definizioni saranno uguali o simili.

Soppressione

Questo significa che le tabelle del database vengono pulite utilizzando SQL DELETE FROM dichiarazione. Questo di solito è slower than truncation, ma may have other advantages instead.

troncamento

Questo significa che le tabelle del database vengono pulite utilizzando l'istruzione TRUNCATE TABLE. Questo semplicemente svuota la tabella immediatamente, senza eliminare la struttura della tabella stessa o eliminando i record individualmente.

Transazione

Ciò significa utilizzare BEGIN TRANSACTION istruzioni accoppiato con ROLLBACK di ripristinare una sequenza di operazioni di database precedenti. Consideralo come un "pulsante Annulla" per i database. Penserei che questo sia il metodo di pulizia più utilizzato e probabilmente il più veloce poiché le modifiche non devono essere direttamente applicate al DB.

Esempio di discussione: Rspec, Cucumber: best speed database clean strategy

Motivo della strategia di troncamento con Capybara

La migliore spiegazione è stata trovata nel 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. 

esigenze di pulizia

Non è necessario pulire il database dopo ogni test case. Tuttavia è necessario essere consapevoli degli effetti collaterali che questo potrebbe avere. Cioè se crei, modifichi o elimini alcuni record in un solo passaggio, gli altri passaggi saranno influenzati da questo?

Normalmente RSpec funziona con i dispositivi transazionali accesi, in modo da non notare questo quando si esegue RSpec - si limiterà a mantenere il database automaticamente pulito per voi:

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

+1

Grazie per la spiegazione dettagliata. Questo spiega davvero molto. Anche il collegamento ai documenti rspec-rails è estremamente utile.Apprezzo molto il tuo aiuto :) –

+13

Questo non è del tutto vero. La [strategia di cancellazione] (https://github.com/bmabey/database_cleaner/blob/master/lib/database_cleaner/active_record/deletion.rb) dovrebbe essere più veloce del troncamento perché esegue "DELETE FROM table" invece di 'Tabella TRUNCATE TABLE' - quindi rimuove tutti i record senza fare cose come il reset delle sequenze. –

Problemi correlati