Bắt đầu viết test với RSpec
Đa phần các lập trình viên thường chỉ lo viết code mà ít ai chú ý đến việc viết test cho những đoạn code mà mình vừa viết ra. Điều này có thể làm bạn cảm thấy không thành vấn đề khi bạn làm việc một mình, nhưng khi bạn làm việc với những lập trình viên khác, với những dự án lớn hơn, nhiều chức năng phức tạp thì chắc chắn việc không kiểm soát được code của mình sẽ gây ra nhiều vấn đề khiến bạn đau đầu.
Một khi bạn dành nhiều thời gian để viết test thật cẩn thận thì sau này khi bạn refactor code sẽ dễ dàng hơn rất nhiều, đồng thời giảm thiểu được bugs của ứng dụng do đó sẽ nâng cao được chất lượng sản phẩm và tiết kiệm được rất nhiều thời gian để test lại khi bạn nâng cấp hoặc bổ sung thêm chức năng cho ứng dụng về sau.
Trong bài viết này, mình sẽ giới thiệu về cách sử dụng Rspec để kiểm thử chức năng của ứng dụng web Ruby on Rails. Có thể việc viết test sẽ gặp nhiều khó khăn khi mới bắt đầu, tuy nhiên cũng có khá nhiều resources hỗ trợ việc viết test dễ dàng hơn. Hi vọng bài viết này sẽ có ích với các bạn mới bắt đầu.
Trong bài viết này chúng ta sẽ tìm hiểu những vấn đề sau
1. Cài đặt RSpec, Capybara, Shoulda-Matchers, Database Cleaner.
2. Cài đặt và tạo dữ liệu test bằng dữ liệu giả sử dụng Factory Girl và Faker.
3. Viết test cho Models (Model specs).
4. Viết test cho Controllers (Controller specs).
5. Viết test cho Features (Feature specs).
6. Viết test cho Routings (Routing specs).
Bắt đầu
Tạo 1 project mới
1. Cài đặt RSpec, Capybara, Shoulda-Matchers, Database Cleaner.
1.1 Cài đặt RSpec
Thêm gem rspec-rails vào group :development và :test trong Gemfile
Chạy bundle install và khởi tạo rspec
Cấu trúc thư mục của Rspec
Rspec phân chia các thư mục theo chức năng tương ứng
-
spec/controllers: chứa các file test cho controller.
-
spec/models: chứa các file test cho model.
…
1.2 Cài đặt Shoulda Matcher và Database Cleaner
Thêm vào Gemfile gem shoulda-matchers
và database_cleaner
Chạy bundle install
Shoulda Matchers
shoulda matchers giúp cho việc viết test dễ dàng hơn, tiết kiệm được thời gian khi viết các test dài và phức tạp, code ngắn gọn, dễ đọc. Tiếp theo, chúng ta cần cung cấp cho shoulda matcher:
– Test framework mà chúng ta sử dụng (rspec, minitest,…)
– Những matcher mà chúng ta muốn sử dụng (active-record, model, controller)
Để shoulda-matchers
làm việc với RSpec thêm config sau vào rails_helper.rb
Database Cleaner
database cleaner thực hiện cleaning database giữa mỗi test, tức là sau khi chạy xong một test nó sẽ rollback database lại trạng thái trước khi chạy test, đảm bảo database luôn nhất quán trong suốt quá trình thực hiện tất cả các test.
Để tích hợp database-cleaner
với RSpec, đầu tiên ta cần thay đổi config trong file spec/rails_helper.rb
Thành
Có nghĩa là chúng ta muốn disable việc rspec-rails
ngầm định chạy test trong một database transaction.
Tạo thư mục spec/support
để chứa file config cho database-cleaner
spec/support/database_cleaner.rb
1.3 Cài đặt Capybara
Capybara là một framework tự động, giúp chúng ta kiểm tra các ứng dụng web bằng cách mô phỏng cách mà một người dùng thực sự tương tác với ứng dụng của chúng ta.
Thêm gem capybara
vào group development
và test
trong Gemfile
Chạy bundle install
Mở file spec/spec_helper.rb và thêm require capybara
2. Cài đặt Factory Girl và Faker
Faker rất hữu ích trong việc tạo dữ liệu giả như tên, địa chỉ, số điện thoại,… một cách ngẫu nhiên để phục vụ cho việc test. Factory girl cho phép chúng ta tạo ra các object cần thiết cho việc test với các giá trị mặc định, kết hợp cùng với Faker chúng ta có thể tạo ra các object(factory) với gía trị ngẫu nhiên thay vì chỉ sử dụng giá trị mặc định.
Thêm gem factory_girl_rails
và faker
vào Gemfile
$ bundle install
Cách tạo một factory
Tạo thư mục factories
trong thư mục spec
để chứa các file tương ứng với model.
Ví dụ: spec/factories/user.rb
Xem đầy đủ các thuộc tính mà Faker hỗ trợ tại đây.
Factory girl sẽ sử dụng các giá trị ngẫu nhiên được sinh ra từ faker để tạo ra các factories sử dụng trong quá trình test và chúng ta sẽ không cần phải quan tâm đến việc tạo hàng loạt dữ liệu bằng cách manual để test nữa.
Tạo hai model User và Article sau đó thực hiện migrate database
Bây giờ chúng ta đã có thể chạy test thử
$ rake spec
hoặc
$ rspec spec
Mặc định khi chạy lệnh trên RSpec sẽ thực thi toàn bộ file trong thư mục spec
Ta cũng có thể chạy từng phần riêng biệt
Chỉ chạy specs cho model
Chỉ chạy spec cho UsersController
3. Model Specs
Sau đây là một số ví dụ đơn giản về cách viết test cho model.
3.1 Kiểm tra database schema
spec/models/user_spec.rb
Chạy lại spec để xem kết quả
$ rspec spec/models
3.2 Kiểm tra model validations
Thêm vào file spec/models/user_spec.rb
phần kiểm tra các validations
Chạy lại spec
Kết quả trả về failed vì chúng ta chưa thêm bất cứ validation nào vào model User.
Thêm validations vào app/models/user.rb
Chạy lại spec và sẽ không còn thông báo lỗi.
3.3 Kiểm tra associations
Bây giờ, chúng ta sẽ thêm association vào model User và Article sau đó tiến hành viết spec cho association này
spec/models/user_spec.rb
spec/models/article_spec.rb
3.4 Kiểm tra instance methods
Thêm một instance method vào model Article để kiểm tra một article đã được đăng hay chưa
app/models/article.rb
Viết test cho method này như sau spec/models/article_spec.rb
4. Controller Specs
Tạo 1 controller
Các file spec của controller sẽ được đặt trong thư mục spec/controllers
Mở file spec/controllers/articles_controller_spec.rb
và bắt đầu viết test cho action new
Chạy spec
$ rspec spec/controllers
Chương trình sẽ báo lỗi No route matches {:action=>"new", :controller=>"articles"}
bởi vì chưa có route tương ứng với controller.
Thêm vào file config/routes.rb
Chạy lại spec và chúng ta sẽ vẫn nhận thông báo lỗi vì chưa định nghĩa action new trong controller
Định nghĩa action new trong ArticleController và thêm file new.html.erb
vào thư mục view của articles.
Chạy lại spec một lần nữa và không có lỗi
1 example, 0 failures
Tương tự, chúng ta sẽ tiếp tục viết spec cho các actions show
and create
app/controllers/articles_controller.rb
5. Feature Specs
Bây giờ, chúng ta thử viết test cho chức năng tạo mới article, user sẽ nhập vào title và content, sau đó nhấn nút “Create” để tạo article mới, khi thành công sẽ chuyển sang màn hình show với thông điệp “Article was successfully created!”.
views/articles/new.html.erb
views/articles/sh.html.erb
Tạo thư mục features/articles
trong thư mực spec
để chứa spec cho các features của article.
Viết test cho chức năng create article trong file spec/features/articles/create.rb
6. Routing Specs
Tạo thư mục spec/routing
sau đó tạo file articles_routing_spec.rb
để viết test cho articles routing
articles_routing_spec.rb
Ví dụ chúng ta có thêm 1 section admin
thì cách viết test cho namespace :admin như sau
P/S Trên đây chỉ là một phần giới thiệu đơn giản về RSpec, cách cài đặt môi trường và các gem cần thiết để hỗ trợ việc viết test, hi vọng sẽ giúp các bạn mới bắt đầu sẽ có được cái nhìn tổng quan. Để có thể viết test cho các trường hợp phức tạp hơn, các bạn có thể tham khảo thêm