如何测试一个Gem
gem开发完了,想要给别人用,那就需要测试啊,测试一个gem其实很简单,这里我们用minitest为例,rspec也一样适用。先来看看我们当前这个gem的目录结构:
-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
安装minitest
。
新建一个test
文件夹,存放我们的测试的用例,然后新建一个test_helper.rb
文件,放在里面。test_helper.rb
的内容如下:
$LOAD_PATH << "./lib" # 把lib添加到load path
require 'minitest/autorun' # 引进minitest
require 'mygem'
再来新建一个测试用例,test_mygem.rb
:
require "test_helper"
class MygemTest < Minitest::Test
def test_hello_output
assert_equal(Mygem.hello, "hello from my gem")
end
end
现在就来执行测试吧:
$ 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'
了,还挺麻烦。好,执行一下试一试:
$ 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'
,很是麻烦,现在来简化这一个流程。
首先添加Rake::TestTask
到Rakefile
中:
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
参考链接: