Speeding up RSpec tests in Rails application
Đối với mỗi ruby on rails developer thì việc viết test là điều cần thiết đầu tiên khi viết ra một function hay một service cho ứng dụng của bạn. Đó chính là quá trình TTD(test-driven development) được triển khai phổ biết trong xây dựng và phát triển phần mềm ngày nay. Khi các test case trong ứng ...
Đối với mỗi ruby on rails developer thì việc viết test là điều cần thiết đầu tiên khi viết ra một function hay một service cho ứng dụng của bạn. Đó chính là quá trình TTD(test-driven development) được triển khai phổ biết trong xây dựng và phát triển phần mềm ngày nay. Khi các test case trong ứng dụng của bạn phải chạy lại mỗi lần khi có bất kỳ sự thay đổi code của chương trình thì việc quan tâm đến tốc độ của test thực sự quan trọng đối với TDD. Khi phải dành nhiều thời gian để chờ đợi việc kiểm tra test case phải pass hết không chỉ tốn kém thời gian mà còn gây nên sự chán nản với TDD như ví dụ thực tế dành cả tiếng đồng hồ chờ đợi dưới đây: Tất nhiên bên cạnh việc quyết định và ảnh hưởng của cấu hình máy tính bạn đến thời gian chạy rspec, bài viết này sẽ giới thiệu một số mẹo và kĩ thuật để tận dụng tối đa nguồn tài nguyên của máy tính giúp cho thời gian của mỗi lần chạy rspec được cải thiện rút ngắn
Sử dung RSpec 3 và việc thiết lập cài đặt tự động##
Bên cạnh những tính năng tuyệt vời cùa RSpec 3, giờ đây chúng ta không phải require "rails_helper.rb" mà chúng được thiết lập mặc định. Mỗi spec chúng ta có thể include spec_helper.rb hoặc rails_helper.rb, điều đó có thể gây ảnh hưởng mỗi khi rspec chạy qua. Khi mà Rspec 3 sử dụng test APIs(như là model hay class tương tự), chúng ta không phải load toàn bộ Rails framework, giúp cho thời việc thực thi spec nhanh chóng hơn.
Giảm thiểu sự phụ thuộc##
Khi chạy một spec test, các gem của bạn sử dụng trong chương trình sẽ được nạp trước, và có thể không phải tất cả các gem đó phục vụ cho việc chạy rspec. Cách đơn giản để không phải lãng phí thời gian tải những gem đó là khai báo và group chúng lại. Việc nhóm sẽ chỉ ra gem nào được sử dụng trong môi trường khác nhau là test hay development hay production/staging. Nhưng phải chú ý và biết được gem nào sử dụng hay không cho việc test, bởi có thể nó sẽ khiến việc test của bạn không đúng.
Mock và Stub##
Stubbing và Mocking là 2 tính năng tuyệt vời được sử dụng khi viết spec. Nếu chúng ta không muốn thi hành một method sử dụng đến nhiều thời gian(giống như một lời gọi đến API và chờ chúng trả lời lại), bạn có thể tạm thời thiết lập giá trị trả về cho chúng bằng cách sử dụng phương thức stubbing. Điều này sẽ thực sự khiến các spec test của bạn cải thiện thời gian rất nhiều trong những trường hợp đặc biệt như vậy.
DB-free thiết lập kết nối##
Trong một số trường hợp, bạn sẽ không cần phải kết nối tới DB. Điều đó có thể thực hiện bằng cách không lưu save các object test và thay bằng build chúng. Việc truy cập vào DB có thể là nguyên nhân chính đến việc sử dụng thời gian cho một spec test của bạn.
Spring, Guard##
Sử dụng Spring và Guard giúp cải thiện thời gian preload chương trình trước khi các spec test của bạn được thực thi. Chúng ngăn chặn việc toàn bộ ứng dụng của bạn phải tải lại khi thực thi test bằng việc xác định chỉ những class nào cần thiết phải nạp lại. Guard được chạy ngầm và hoạt động dựa trên sự thay đổi file trong ứng dụng của bạn. Từ đó giúp cho việc phải chạy lại các rspec test trở nên nhanh chóng hơn.
Sử dụng gem Parallel testing##
Một gem có thể nó là hữu ích được giới thiệu cuối cùng này là parallel_tests. Parallel testing giúp cải thiện tốc độ chạy số lượng lớn Unit + RSpec + Cucumber + Spinach dựa trên CPU của máy tính bạn là lõi kép hay lõi tứ, khi đó tốc độ có thể giảm ngắn xuống 2 lần hoặc 4 lần. Việc cài đặt và sử dụng Parallel test rất đơn giản: Để cài đặt, trong file Gemfile
gem "parallel_tests", group: :development
Cấu hình database: trong file config/database.yml
test: database: yourproject_test<%= ENV['TEST_ENV_NUMBER'] %>
Tạo database cho chương trình test của bạn chạy rake:
rake parallel:create
Copy và tạo data schema(phải chạy mỗi khi có thay đổi migrations)
rake parallel:prepare
Khi đó việc cài đặt parallel_test của bạn được hoàn tất, để chạy RSpec:
rake parallel:spec
Trên đây là một số chia sẻ giúp cho việc chạy rspec trở nên nhanh chóng hơn, hi vọng chúng sẽ giúp ích thực tế đến việc xây dựng và phát triển project của bạn! Tham khảo:
- 9 ways to speed up your RSpec tests
- #413 Fast Tests