Unit test
- Khái niệm
- Unit test là mức độ kiểm thử nhỏ nhất trong quy trình kiểm thử phần mềm. Unit test kiểm thử các đơn vị nhỏ nhất trong mã nguồn như method, class, module...Do đó Unit test nhằm kiểm tra mã nguồn của các chương trình, các chức năng riêng rẽ hoạt động đúng hay không.
- Unit testing được thực hiện bởi lập trình viên.
- Trạng thái UT
- Fail (trạng thái lỗi).
- Ignore (tạm ngừng thực hiện).
- Pass (trạng thái làm việc).
- Ứng dụng UT
- Kiểm tra mọi đơn vị nhỏ nhất là các thuộc tính, sự kiện, thủ tục và hàm.
- Kiểm tra các trạng thái và ràng buộc của đối tượng ở các mức sâu hơn mà thông thường chúng ta không thể truy cập được.
- Thiết kế UT
- Mỗi UT đều được thiết kế theo trình tự sau
- Thiết lập các điều kiện cần thiết: khởi tạo các đối tượng, xác định tài nguyên cần thiết, xây dựng các dữ liệu giả…
- Gọi các phương thức cần kiểm tra.
- Kiểm tra sự hoạt động đúng đắn của các phương thức.
- Dọn dẹp tài nguyên sau khi kết thúc kiểm tra
- Những lưu ý khi viết một test cho một controller Trạng thái trả về của phương thức Controller có render template mong muốn không? Controller có render layout mong muốn không? Controller có tạo flash messages hay không? Thông tin có thay đổi hay bị xóa bỏ hay không?
- Mỗi UT đều được thiết kế theo trình tự sau
- Rspec
-
Khái niệm
- RSpec là một trong những testing framework phổ biến nhất cho Ruby.
- RSpec-rails là một mở rộng của RSpec, cho phép bạn viết unit tests cho controller, views, helpers và model trong ứng dụng Rails.
-
Cài đặt rspec-rails
- Thêm gem "rspec-rails" vào Gemfile và chạy bundle install group :development,:test do gem "rspec-rails" end
- Thêm vào cả :development là để khi generate model/controller, file spec cho model/controller đó sẽ tự động được thêm vào mà không cần dùng RAILS_ENV=test.
- Khởi tạo và chạy rspec: rails generate rspec:install
- Chạy các file rspec: bundle exec rspec.
- Để chạy 1 file cụ thể nào đó: bundle exec rspec spec/models/book_spec.rb bundle rspec -f document spec/models/book_spec.rb
- Matcher
- rspec-expectations cung cấp một số các matchers phục vụ cho việc xác định kết quả mong đợi, link https://github.com/rspec/rspec-expectations.
- Ví dụ:
Cú pháp cơ bản
-
it: dùng để mô tả test key.
-
describe: dùng để miêu tả chung cho 1 nhóm các test
-
context: cũng dùng để miêu tả cho một nhóm các test key nhưng. dùng để phân nhánh test key theo từng trường hợp.
-
before, after: dùng để nhóm các thao tác chung như tạo dữ liệu.
-
let: dùng để khởi tạo object. let! thì nó sẽ chạy cái FactoryBot.create luôn
-
subject: xác định đối tượng object trong test key.
let(:category) {FactoryGirl.create :category} subject {category}
- Database cleaner
- Config database
- Dùng để xóa sạch toàn bộ cơ sở dữ liệu sau mỗi lần chạy 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 case. - Cài đặt:
- Nếu sử dụng nhiều ORM thì chúng ta thêm gem (gem 'database_cleaner-redis')
- Chi tiết tại: https://github.com/DatabaseCleaner/database_cleaner
- Cách sử dụng
- Trong file rails_helper ta thêm dòng sau: config.use_transactional_fixtures = false
- Trong thư mục spec, tạo thư mục support, trong đây thêm tạo thêm file database_cleaner.rb và paste thêm đoạn code sau:
- Factorybot(tên cũ facetorygirl)
- 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 giá trị ngẫu nhiên thay vì chỉ sử dụng giá trị mặc định.
- Thêm vào gem file: gem "factory_bot_rails"
- Run bundle install
- Tạo một subject:
- Shoulda Matchers
- Hỗ trợ viết test trên 1 dòng khiến tăng tốc độ code, giảm sự phức tạp, ít nhầm lẫn ngoài ý muốn
- Thêm vào gem file
- Run bundle install.
- Các hàm mathers: https://github.com/thoughtbot/shoulda-matchers#matchers
- Cách sử dụng Ví dụ: Phải có first_name. email không được trùng lặp. password phải có ít nhất 10 ký tự
Khi viết bình thường
Khi sử dụng sholda match
Một ví dụ về test mối quan hệ has_many : Cú pháp Rspec:
Cú pháp Rspec + Shoulda Matchers :