Cách để tăng tốc test thông qua :build_stubbed
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 ...
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