V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
OneAPM
V2EX  ›  Ruby on Rails

如何测试你自己的 RubyGem?

  •  6
     
  •   OneAPM · 2015-07-08 09:48:29 +08:00 · 3610 次点击
    这是一个创建于 3430 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如何测试一个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::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官方技术博客

    2 条回复    2015-07-08 13:03:33 +08:00
    hging
        1
    hging  
       2015-07-08 13:00:44 +08:00
    开始刷脸咯. ?
    OneAPM
        2
    OneAPM  
    OP
       2015-07-08 13:03:33 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5448 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:55 · PVG 14:55 · LAX 22:55 · JFK 01:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.