Cách để tăng tốc test thông qua :build_stubbed
Bài đăng này đã không được cập nhật trong 6 năm
Rspec là một thứ tuyệt vời sinh ra cho cộng đồng Ruby, hầu hết chúng ta đều sử dụng nó để viết test. Tuy nhiên, thỉnh thoảng trong các project lớn, test của chúng ta chạy rất chậm. Nếu phải mất đến hơn 30 phút để chạy xong yêu cầu test của bạn, chắc hẳn bạn đã làm sai ở đâu đó.
Có nhiều cách để cải thiện: xóa data, dùng cache, stub các request gọi ra ngoài,...
Trong bài viết này sử dụng FactoryGirl (FactoryBot). Tiếp theo mình sẽ mô tả cách sử dụng :build_stubbed
để tăng tốc độ test.
create:
FactoryBot.create(:comment)
Trong trường hợp này, chúng ta sẽ tạo comment và tất cả association của nó.
build:
FactoryBot.build(:comment)
Lưu ý: đây là một quan điểm sai lầm, chúng ta không lưu lại đối tượng nhưng vẫn tạo ra request đến database nếu factory có associations
:build
không tạo ra đối tượng, nhưng tạo ra các association của đối tượng.
factory :comment do
association :post
end
FactoryBot.build(:comment)
(0.1ms) begin transaction
Post Create (0.5ms) INSERT INTO "posts" DEFAULT VALUES
(0.6ms) commit transaction
build_stubbed:
FactoryBot.build_stubbed(:comment)
build_stubbed
sẽ không gọi đến database trong bất kì trường hợp nào. Nó chỉ tạo ra và gán các thuộc tính để đối tượng có thể hoạt động được. Nó được gán một id
. Đó là lý do vì sao nhanh như vậy.
Vậy còn liên kết?
Các liên kết vẫn hoạt động. build_stubbed
cũng tạo các liên kết thông qua build_stubbed
, trong khi build
tạo các liên kết thật.
comment = FactoryBot.build_stubbed(:comment)
#<Comment:0x007f94d2b92df0 id: 1002, post_id: 1001, body: "text">
comment.post
#<Post:0x007f94d5883440 id: 1001, name: nil>
Lưu ý: build_stubbed
dùng cho các phương thức sau:
- persisted?
- new_record?
- created_at Những phương thức sau sẽ gây ra exception:
- update_attribute
- update_column
- save
- destroy
- connection
- reload
comment.save
RuntimeError: stubbed models are not allowed to access the database - Comment#save()
build_stubbed
không phải giải pháp hoàn hảo cho mọi trường hợp. Tuy nhiên, nó là một giải pháp khá tốt trong một số trường hợp. Ví dụ như test model hoặc services.
Nguồn tham khảo: https://anadea.info/blog/speed-up-tests-via-build-stubbed
All rights reserved