如何測試你本身的 RubyGem?

##如何測試一個Gemhtml

gem 開發完了,想要給別人用,那就須要測試啊,測試一個gem其實很簡單,這裏咱們用 minitest 爲例, rspec 也同樣適用。先來看看咱們當前這個 gem 的目錄結構:ruby

-rw-rw-r-- 1 lizhe lizhe   90  7月  2 15:52 Gemfile
-rw-rw-r-- 1 lizhe lizhe  379  7月  3 10:09 Gemfile.lock
drwxrwxr-x 3 lizhe lizhe 4096  7月  2 15:52 lib
-rw-rw-r-- 1 lizhe lizhe 1062  7月  2 15:52 LICENSE.txt
-rw-rw-r-- 1 lizhe lizhe  923  7月  3 10:09 mygem.gemspec
drwxrwxr-x 2 lizhe lizhe 4096  7月  2 18:33 pkg
-rw-rw-r-- 1 lizhe lizhe  187  7月  3 10:35 Rakefile
-rw-rw-r-- 1 lizhe lizhe  556  7月  2 15:52 README.md

打開 mygem.gemspec ,添加minitest測試

spec.add_development_dependency "minitest", "~> 5.7.0"

執行bundle install安裝minitestui

新建一個test文件夾,存放咱們的測試的用例,而後新建一個test_helper.rb文件,放在裏面。test_helper.rb的內容以下:code

$LOAD_PATH << "./lib" # 把lib添加到load path

require 'minitest/autorun'  # 引進minitest
require 'mygem'

再來新建一個測試用例,test_mygem.rbhtm

require "test_helper"

class MygemTest < Minitest::Test

  def test_hello_output
    assert_equal(Mygem.hello, "hello from my gem")
  end

end

如今就來執行測試吧:ip

$ ruby test/test_mygem.rb

/home/lizhe/.rvm/rubies/ruby-2.1.5/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- test_helper (LoadError)
    from /home/lizhe/.rvm/rubies/ruby-2.1.5/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
    from test/test_mygem.rb:1:in `<main>'

出錯了!找不到test_helper,由於它沒有在加載路徑裏嘛,那就來換個方式,require_relative 'test_helper',由於咱們的命令是在 gem 根目錄下的,因此相對路徑就是當前的路徑,若是是在 test 目錄下執行,就須要寫成require_relative '../test_helper'了,還挺麻煩。好,執行一下試一試:ci

$ ruby test/test_mygem.rb

Run options: --seed 30741

# Running:

.

Finished in 0.000793s, 1260.9959 runs/s, 1260.9959 assertions/s.

1 runs, 1 assertions, 0 failures, 0 errors, 0 skips

##利用 Rake::TestTask 簡化測試流程開發

前面的測試方法中,咱們要手動添加 lib 目錄到 load path ,而後在每一個測試用例文件中要require_relative 'test_helper',非常麻煩,如今來簡化這一個流程。get

首先添加 Rake::TestTaskRakefile 中:

require 'rake/testtask'

Rake::TestTask.new do |t|
  t.libs << 'test' << 'lib'
  t.pattern = "test/test_*.rb"
end

如今把testhelper中的$LOADPATH << './lib'去掉,再把測試用例文件中的 require_relative 替換爲 require ,由於rak test task已經把 test 和 lib 兩個目錄都添加到 load path 中了,而後執行rake test

$ rake test

Run options: --seed 29947

# Running:

.

Finished in 0.000969s, 1031.6447 runs/s, 1031.6447 assertions/s.

1 runs, 1 assertions, 0 failures, 0 errors, 0 skips

進一步簡化,每一個測試用例文件都要require 'test_helper',也是夠麻煩的,能不能讓它自動執行這個動做呢?能夠,只須要再加上一個選項便可:

require 'rake/testtask'

Rake::TestTask.new do |t|
  t.libs << 'test' << 'lib'
  t.pattern = "test/test_*.rb"
  t.ruby_opts << "-r test_helper" # 添加ruby運行參數,require指定的文件
end

如今把測試用例中的require 'test_helper'這一行也去掉,執行rake test,一樣能夠運行測試,又少寫了一行,:smile :

如今來設置默認的 task :

require 'rake/testtask'

Rake::TestTask.new do |t|
  t.libs << 'test' << 'lib'
  t.pattern = "test/test_*.rb"
  t.ruby_opts << "-r test_helper" # 
添加 ruby 運行參數,require指定的文件
end

task :default => :test

這樣我就能夠直接執行 rake 就能夠跑測試了,連那個 test 都省了。

若是咱們有多個測使用例,這個 rake test task 會跑全部測試,若是想跑指定的某一個怎麼作呢?指定一個 TEST 參數便可:

rake test TEST=test/test_mygem.rb

參考連接:


本文系OneAPM工程師原創文章。OneAPM是中國基礎軟件領域的新興領軍企業,能幫助企業用戶和開發者輕鬆實現:緩慢的程序代碼和SQL語句的實時抓取。想閱讀更多技術文章,請訪問OneAPM官方技術博客

相關文章
相關標籤/搜索