如何测试你自己的 RubyGem?

原创 2015年07月07日 10:44:54

如何测试一个Gem

gem 开发完了,想要给别人用,那就需要测试啊,测试一个gem其实很简单,这里我们用 minitest 为例, rspec 也一样适用。先来看看我们当前这个 gem 的目录结构:

-rw-rw-r-- 1 lizhe lizhe   90  72 15:52 Gemfile
-rw-rw-r-- 1 lizhe lizhe  379  73 10:09 Gemfile.lock
drwxrwxr-x 3 lizhe lizhe 4096  72 15:52 lib
-rw-rw-r-- 1 lizhe lizhe 1062  72 15:52 LICENSE.txt
-rw-rw-r-- 1 lizhe lizhe  923  73 10:09 mygem.gemspec
drwxrwxr-x 2 lizhe lizhe 4096  72 18:33 pkg
-rw-rw-r-- 1 lizhe lizhe  187  73 10:35 Rakefile
-rw-rw-r-- 1 lizhe lizhe  556  72 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官方技术博客

版权声明:本文为博主原创文章,未经博主允许不得转载。

解决gem连接失败的问题

由于国内网络原因(你懂的),导致 rubygems.org 存放在 Amazon S3 上面的资源文件间歇性连接失败,我是在执行 gem install bundler --no-ri --no-rd...
  • a454213722
  • a454213722
  • 2017年01月04日 18:02
  • 552

如何制作自己的Ruby gem

如何生成自己的gem,以及如何组织自己的gem结构
  • yangcs2009
  • yangcs2009
  • 2014年12月30日 10:05
  • 3617

给你一个网站,你将如何测试?

首先,查找需求说明、网站设计等相关文档,分析测试需求。 制定测试计划,确定测试范围和测试策略,一般包括以下几个部分:功能性测试;界面测试;性能测试;数据库测试;安全性测试;兼容性测试   设计测...
  • qq_30261301
  • qq_30261301
  • 2017年04月05日 10:50
  • 650

如何开发一个自己的 RubyGem?

什么是 RubyGemRubyGem 是 Ruby 语言的标准源码打包格式。大家一直都在用gem这个命令,但是很少有人知道这个东西是怎么来的,这里我从网上扒下一些资料汇总一下,分享给大家。最后面会有这...
  • wangpeng198688
  • wangpeng198688
  • 2015年07月06日 23:44
  • 630

你为啥喜欢软件测试

你喜欢软件测试吗?你为啥喜欢软件测试? 这是我被问到的第一个问题。我曾有很多关于该问题的答案。当然了,答案不会对面试的结果产生太大影响,但是我想当面试官问起这个问题时,这并不太好回答。 作为测试人...
  • czblog
  • czblog
  • 2013年02月20日 19:49
  • 1005

作为一个面试官,我是怎么来面试测试人员的?

其实之前关于面试也说了好多,知乎上我也开过一个面试的Live,也有幸被选进了知乎2016精选。不过今天我想说的是在实际过程中如果我去面试了,我会怎么进行面试,会问什么问题,会遵照哪些原则。我本身的行事...
  • qq_14935437
  • qq_14935437
  • 2017年04月18日 13:20
  • 2532

浅谈从苏格拉底的“认识你自己”到尼采的“成为你自己”

  本文是对苏格拉底的“认识你自己”和尼采的“成为你自己”两个哲学命题的一些阐述,形成以及转变的原因的一些浅薄的看法和评论。 一、苏格拉底和“认识你自己”据说,德尔菲神庙的墙上,有一些铭文,其中有两条...
  • onlythree
  • onlythree
  • 2010年12月23日 15:06
  • 9830

测试你打游戏所适合的职业

测试你打游戏所适合的职业 http://vega.cs.tku.edu.tw/~u7197120/RPG_Test.htm流云的個人資料520)this.width=520"/>攻擊37防禦56敏捷8...
  • yjm0105
  • yjm0105
  • 2005年04月24日 14:57
  • 1088

给你一个杯子,你如何测试

TX面试的时候面试官问我给我一个瓶子,如何做测试,现在转载一下别人的文章给你一个杯子,你如何测试 原文: 面试时经常会碰到这样的题目,这种题目主要考察面试者的思维缜密度,考虑问题是否逻辑性...
  • lonely_Quan
  • lonely_Quan
  • 2015年04月12日 23:33
  • 2745

活出自己的传奇

0:11非常荣幸。我一直很好奇 这会是什么感觉。 0:14八年前,我听到一个 有生以来最烂的职场建议。 有个朋友跟我说, “ 斯科特,别考虑 你喜不喜欢现在的工作, 重要的是简历上好看。 ”...
  • cl_demon
  • cl_demon
  • 2017年03月07日 01:05
  • 1294
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何测试你自己的 RubyGem?
举报原因:
原因补充:

(最多只允许输入30个字)