如何测试你本身的 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官方技术博客

相关文章
相关标签/搜索