12/08/2018, 15:57
Gem rspec-kickstarter, Auto generate rspec code
Giới thiệu TDD(Test-driven development) là một cách tiếp cận rất hữu ích và cần thiết khi thực hiện dự án, nhưng thực tế nhiều dự án được triển khai mà không hoàn toàn dựa trên TDD và đôi khi chúng ta phải bổ sung các testcase cho các dự án này. Trong tình huống như vậy thì rspec-kickstarter ...
- Giới thiệu
- TDD(Test-driven development) là một cách tiếp cận rất hữu ích và cần thiết khi thực hiện dự án, nhưng thực tế nhiều dự án được triển khai mà không hoàn toàn dựa trên TDD và đôi khi chúng ta phải bổ sung các testcase cho các dự án này. Trong tình huống như vậy thì rspec-kickstarter là một công cụ hữu ích.
- Theo đúng quy trình ta cần viết các test TDD trước khi thực hiện việc viết code. Nhưng không phải lúc nào cũng dễ dàng để để làm đc điều này vì:
- Các developer có nhiều việc phải làm trước khi bắt đầu viết các phần thiết yếu của testcase.
- Thật lộn xộn khi tạo ra một tệp tin mới hoặc tìm ra tệp spec hiện có, tìm ra các trường hợp thử nghiệm thiếu và viết các nội dung thông thường bắt đầu bằng 'describe'.
- Để giải quyết vấn đề này thì rspec-kickstarter cho phép các developer có thể viết Test ngay lập tức. Nếu file spec chưa tồn tại nó sẽ tạo ra một tập tin spec mới. Hơn nữa, nó bổ sung các trường hợp thử nghiệm thiếu (có chú thích là TODO) vào tệp tin spec hiện có nếu chúng được tìm thấy.
Lưu ý:
- Việc tạo các trường hợp test thử nghiệm cho các method không phải là hoàn hảo nhưng nó là khá quan trọng để giảm rào cản tâm lý, và khắc phục được những vấn đề đã nêu trên.
- Các trường hợp test mà rspec-kickstarter đưa ra chỉ là các testcase đơn giản, ko đầy đủ các trường hợp có thể xảy ra trong code của bạn, vì vậy bạn cần được định nghĩa thêm các trường hợp này.
- Vì thế theo mình thấy thì việc sử dụng rspec-kickstarter này chủ yếu là:
- Để tạo ra một cái khung cơ bản cho file spec của mình.
- Để mình biết được mình sẽ test những nội dung gì.
- Giúp mình đỡ bỡ ngỡ khi bắt đầu viết rspec, ko biết bắt đầu từ đâu, ko biết phải test những cái gì bla bla.
- Trong bài viết này mình sẽ trình bày một số ví dụ về việc áp dụng rspec-kickstarter
- Cài đặt gem install rspec-kickstarter
- Sử dụng rspec-kickstarter ./app rspec-kickstarter ./lib rspec-kickstarter ./lib/yourapp/util.rb
- Các option: Bạn có thể xem các options bằng cách gõ lệnh sau vào terminal: rspec-kickstarter -h
Usage: rspec-kickstarter [options] -f Create if absent or append to the existing spec --force -n Dry run mode (shows generated code to console) --dry-run -r Run in Rails mode --rails -o VAL Output directory (default: ./spec) --output-dir VAL -D VAL Delta tempalte path (e.g. ./rails_controller_delta.erb) --delta-template VAL -F VAL Full template path (e.g. ./rails_controller_full.erb) --full-template VAL -v Print version
- Ví dụ
5.1 Với các file nằm trong rspec-kickstarter ./lib
- Đầu tiên ta tạo file lib/foo/auto_test.rb với nội dung
module Foo class AutoTest def self.fuction_1 a, b end def fuction_2 end private def fuction_3 a end end end
- Hiện tại file này chưa có spec file. giờ ta sẽ sử dụng rspec-kickstarter để generate ra code spec. Ta chạy lệnh $ rspec-kickstarter lib/foo/auto_test.rb ./spec/foo/auto_test_spec.rb created.
- Kết quả ta được file auto_test_spec.rb tạo theo đúng cây thư mục trong folder spec: /spec/foo/auto_test_spec.rb có nội dụng như sau:
# -*- encoding: utf-8 -*- require 'spec_helper' require 'foo/auto_test' describe Foo::AutoTest do # TODO: auto-generated describe '#fuction_1' do it 'works' do a = double('a') b = double('b') result = Foo::AutoTest.fuction_1(a, b) expect(result).not_to be_nil end end # TODO: auto-generated describe '#fuction_2' do it 'works' do auto_test = Foo::AutoTest.new result = auto_test.fuction_2 expect(result).not_to be_nil end end end
5.2 Bổ sung các test case bị thiếu
- Ta có thể sử dụng -f để thêm các testcase bị thiếu trong các spec hiện có.
- Ví dụ trong file auto_test.rb ta bổ sung thêm 1 function có tên là additional_function như sau:
module Foo class AutoTest def self.fuction_1 a, b end def fuction_2 end def additional_function end private def fuction_3 a end end end
- Tiếp đến ta thực hiện lệnh: $ rspec-kickstarter -f lib/foo/auto_test.rb ./spec/foo/auto_test_spec.rb modified.
- Và kết quả đạt được sau khi modified thì file /spec/foo/auto_test_spec.rb sẽ được bổ sung thêm:
# TODO: auto-generated describe '#additional_function' do it 'works' do auto_test = Foo::AutoTest.new result = auto_test.additional_function expect(result).not_to be_nil end end
5.3 Với các file nằm trong rspec-kickstarter ./app
- Đối với các file trong controller
- Ta chạy lệnh rspec-kickstarter -r app/controllers/root_controller.rb
- và kết quả ta được spec/controllers/root_controller_spec.rb:
# -*- encoding: utf-8 -*- require 'rails_helper' describe CommentsController do # TODO: auto-generated describe 'GET index' do it 'works' do get :index, {}, {} expect(response.status).to eq(200) end end # TODO: auto-generated describe 'GET show' do it 'works' do get :show, {}, {} expect(response.status).to eq(200) end end # TODO: auto-generated describe 'GET new' do it 'works' do get :new, {}, {} expect(response.status).to eq(200) end end # TODO: auto-generated describe 'GET edit' do it 'works' do get :edit, {}, {} expect(response.status).to eq(200) end end # TODO: auto-generated describe 'POST create' do it 'works' do post :create, {}, {} expect(response.status).to eq(200) end end # TODO: auto-generated describe 'PUT update' do it 'works' do put :update, {}, {} expect(response.status).to eq(200) end end # TODO: auto-generated describe 'DELETE destroy' do it 'works' do delete :destroy, {}, {} expect(response.status).to eq(200) end end end
- Tương tự bạn có thể tạo file spec đối với các file trong helper, model...
- Kết luận
- Trên đây mình đã giới thiệu các vấn đề cơ bản để sử dụng gem rspec-kickstarter để auto generate rspec code. Với nguồn tham khảo tại https://github.com/seratch/rspec-kickstarter.
- Và tác dụng của việc áp dụng gem này vào dự án thì đối với người mới viết rspec sẽ không phải bỡ ngỡ khi không biết bắt đầu từ đâu. Còn đối với người đã có kinh nghiệm thì việc dùng rspec-kickstarter sẽ giúp mình tạo 1 khung viết test một cách nhanh chóng.