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 ...

  1. 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
  1. Cài đặt gem install rspec-kickstarter
  2. Sử dụng rspec-kickstarter ./app rspec-kickstarter ./lib rspec-kickstarter ./lib/yourapp/util.rb
  3. 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

  1. 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...
  1. 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.
0