2012-06-05 24 views
35

Sự khác biệt giữa chiến lược cơ sở dữ liệu cắt ngắn, giao dịch và xóa khi sử dụng Rspec là gì? Tôi không thể tìm thấy bất kỳ tài nguyên nào giải thích điều này. Tôi đọc readme cơ sở dữ liệu Cleaner nhưng nó không giải thích những gì từng làm.Sự khác biệt giữa các chiến lược cắt xén, giao dịch và xóa cơ sở dữ liệu

Tại sao chúng ta phải sử dụng chiến lược cắt ngắn cho Capybara? Tôi có phải dọn dẹp cơ sở dữ liệu của mình khi kiểm tra hoặc tôi có thể vô hiệu hóa nó hay không. Tôi không hiểu tại sao tôi nên làm sạch cơ sở dữ liệu của tôi sau mỗi trường hợp thử nghiệm, nó sẽ không chỉ làm chậm thử nghiệm?

Trả lời

54

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

+1

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

+13

Đ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. –

Các vấn đề liên quan