2012-06-05 10 views
35

Jaka jest różnica między strategiami dotyczącymi obcinania, transakcji i usuwania bazy danych podczas korzystania z Rspec? Nie mogę znaleźć żadnych materiałów wyjaśniających to. Czytam readme Database Cleaner, ale nie wyjaśnia, co każdy z nich robi.Różnice między strategiami bazy danych dotyczącymi obcięcia, transakcji i usuwania

Dlaczego musimy stosować strategię obcięcia dla Capybara? Czy muszę wyczyścić bazę danych podczas testowania lub czy mogę ją wyłączyć? Nie rozumiem, dlaczego powinienem wyczyścić bazę danych po każdym przypadku testowym, czy nie spowolniłoby to testów?

Odpowiedz

54

Strategie czyszczenia bazy danych odnoszą się do terminologii bazy danych. To znaczy. te terminy pochodzą ze świata baz danych (SQL), więc ludzie zwykle znający terminologię bazy danych będą wiedzieli, co oznaczają.

Poniższe przykłady odnoszą się do definicji SQL. DatabaseCleaner obsługuje również inne typy baz danych niż SQL, ale ogólnie definicje będą takie same lub podobne.

Usunięcie

Oznacza to, że tabele bazy danych są czyszczone za pomocą SQL DELETE FROM oświadczenie. Zazwyczaj jest to slower than truncation, ale may have other advantages instead.

Obcinanie

Oznacza to, że tabele bazy danych są czyszczone za pomocą instrukcji TRUNCATE TABLE. Spowoduje to natychmiastowe opróżnienie tabeli bez usuwania samej struktury tabeli lub pojedynczego usuwania rekordów.

transakcja

Oznacza to wykorzystanie BEGIN TRANSACTION oświadczenia w połączeniu z ROLLBACK cofnąć sekwencję poprzednich operacji bazodanowych. Pomyśl o tym jako o "przycisku cofania" dla baz danych. Myślę, że jest to najczęściej używana metoda czyszczenia i prawdopodobnie najszybsza, ponieważ zmiany nie muszą być bezpośrednio zatwierdzone do bazy danych.

Przykład dyskusyjne: Rspec, Cucumber: best speed database clean strategy

Powód strategii obcięcia z Kapibara

Najlepszym wyjaśnieniem został znaleziony w 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. 

wymagania chemiczna

Nie musisz koniecznie czyścić bazy danych po każdym przypadku testowym. Musisz jednak zdawać sobie sprawę z efektów ubocznych, jakie mogą mieć. To znaczy. jeśli tworzysz, modyfikujesz lub usuwasz niektóre rekordy w jednym kroku, czy wpłyną na to inne kroki?

Normalnie RSpec biegnie z aktualnościami transakcyjnych włączone, więc nie będzie to zauważyć podczas uruchamiania rspec - będzie to po prostu zachować bazę danych automatycznie dla was czyste:

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

+1

Dziękujemy za szczegółowe wyjaśnienie. To naprawdę dużo wyjaśnia. Bardzo przydatny jest także link do dokumentacji rspec-rails.Bardzo doceniam, że pomogłeś :) –

+13

To nie do końca prawda. [Strategia usuwania] (https://github.com/bmabey/database_cleaner/blob/master/lib/database_cleaner/active_record/deletion.rb) rzeczywiście ma być szybsza niż obcięcie, ponieważ wykonuje 'DELETE FROM table' zamiast 'TRUNCATE TABLE table' - więc usuwa wszystkie rekordy bez wykonywania czynności takich jak resetowanie sekwencji. –

Powiązane problemy