Chiến lược làm sạch cơ sở dữ liệu đề cập đến thuật ngữ cơ sở dữ liệu. I E. những thuật ngữ này đến từ thế giới cơ sở dữ liệu (SQL), vì vậy mọi người thường quen thuộc với thuật ngữ cơ sở dữ liệu sẽ biết ý nghĩa của chúng.
Ví dụ bên dưới đề cập đến định nghĩa SQL. Tuy nhiên, DatabaseCleaner
cũng hỗ trợ các loại cơ sở dữ liệu không phải SQL khác, nhưng nhìn chung các định nghĩa sẽ giống nhau hoặc tương tự.
Xóa
Điều này có nghĩa các bảng cơ sở dữ liệu được làm sạch bằng cách sử dụng SQL DELETE FROM
tuyên bố. Đây thường là slower than truncation, nhưng may have other advantages instead.
Rút gọn
Điều này có nghĩa các bảng cơ sở dữ liệu được làm sạch sử dụng câu lệnh TRUNCATE TABLE
. Thao tác này sẽ đơn giản làm trống bảng ngay lập tức mà không xóa cấu trúc bảng hoặc xóa từng bản ghi.
giao dịch
Điều này có nghĩa sử dụng BEGIN TRANSACTION
báo cáo cùng với ROLLBACK
để quay trở lại một chuỗi các hoạt động cơ sở dữ liệu trước đó. Hãy suy nghĩ về nó như là một nút "hoàn tác" cho cơ sở dữ liệu. Tôi nghĩ rằng đây là phương pháp làm sạch thường xuyên nhất được sử dụng, và có lẽ là nhanh nhất kể từ khi thay đổi không cần phải trực tiếp cam kết với DB.
Ví dụ thảo luận: Rspec, Cucumber: best speed database clean strategy
Lý do chiến lược cắt ngắn với Capybara
Lời giải thích tốt nhất đã được tìm thấy trong 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.
yêu cầu làm sạch
Bạn không nhất thiết phải làm sạch cơ sở dữ liệu của bạn sau mỗi trường hợp thử nghiệm. Tuy nhiên bạn cần phải nhận thức được tác dụng phụ này có thể có. I E. nếu bạn tạo, sửa đổi hoặc xóa một số bản ghi trong một bước, các bước khác có bị ảnh hưởng bởi điều này không?
thường RSpec chạy với đồ đạc giao dịch bật, vì vậy bạn sẽ không bao giờ nhận thấy điều này khi chạy RSpec - nó chỉ đơn giản là sẽ giữ cho cơ sở dữ liệu tự động sạch cho bạn:
https://www.relishapp.com/rspec/rspec-rails/v/2-10/docs/transactions
Cám ơn lời giải thích chi tiết của bạn. Điều đó thực sự giải thích rất nhiều. Liên kết đến tài liệu rspec-ray cũng rất hữu ích.Tôi đánh giá cao sự giúp đỡ của bạn :) –
Điều này không hoàn toàn đúng. [Chiến lược xóa] (https://github.com/bmabey/database_cleaner/blob/master/lib/database_cleaner/active_record/deletion.rb) thực sự được cho là nhanh hơn cắt xén vì nó thực hiện 'DELETE FROM table' thay vì 'Bảng TABLE TRUNCATE' - vì vậy nó loại bỏ tất cả các bản ghi mà không thực hiện các công việc như sắp xếp lại các chuỗi. –