用 Multiruby 检查 1.8 和 1.9 的兼容性

  • Werner Schuster
  • 李剑

2008 年 2 月 9 日

话题:Ruby测试语言 & 开发

从事 Ruby 类库或应用工作的开发者现在有了新的任务:确保不同 Ruby 版本间代码的兼容性。各种可选的 Ruby 实现是原因之一,不过它们的共同目标都是和 MRI 的工作方式保持一致。但是有了 Ruby 1.9 发布以后,情况就有了变化:Ruby 1.9 有了些不兼容性的变化,或是至少修改了一些代码的行为

例如,在 1.9 之前,Ruby 块中的本地变量存在着问题:

 a = 1

 foo.do_something {|a|

 a = 42

 }

 puts a
在 Ruby 1.8 中,这段代码会打印出“42”, 因为块变量 a 和所包含域中的 a 就是一个变量。Ruby 1.9 解决了这个问题,块的行为和人们的预期达成了一致,也就是打印出“1”。所以,如果某个类库或者应用的代码依赖于旧的行为,那它在 Ruby 1.9 中的表现肯定就不一样了。

Zentest 包中的 Multiruby 可以有助于避免这个问题。Zentest 的创建者Ryan Davis 解释了怎样用 Multiruby 处理 Ruby 1.8 和 1.9

现在有了 1.9,该讨论一下怎样用 Multiruby 来进行多版本测试了。Multiruby 在 Zentest 家族内的知名度不太高。它会自动构建并在内部安装多个 ruby 版本,并向所有版本发送多重命令,这样你就可以同时贯穿多个 ruby 版本执行测试。
安装 Zentest 很简单:
gem install ZenTest 
Multiruby 的工作机制如下:
  • 它会下载Ruby 版本——如 1.8 和 1.9——并进行编译
  • 然后它会在每个可用的 Ruby 版本上执行它的参数
multiruby这个命令会将所有给定的参数传递给 Ruby 二进制文件。运行上面的代码示例会得到如下的输出:
VERSION = 1.8.6-p111

 42

RESULT = 0

VERSION = 1.9.0-0



 1

RESULT = 0

TOTAL RESULT = 0



 failures out of 2

Passed: 1.8.6-p111, 1.9.0-0



Failed:
可以看到:在 1.8.x 上面的输出结果是“42”,但是在 1.9 上面就变成了“1” (上面的“RESULT”是 Ruby 解释器的退出代码)。

通常,Multiruby 只用来在大部分代码都被测试覆盖的情况下找出问题所在。但是如今 Ruby 正是一个英雄辈出的时代,像 JRuby 1.0 和 1.1、IronRuby 还有 Rubinius 如雨后春笋般纷纷涌现,有一个可以简化跨运行时测试的工具正是当务之急。

你已经开始向 Ruby 1.9 移植你的应用,或至少是开始在 Ruby 1.9 上测试你的类库或者应用了吗?

查看英文原文Checking 1.8 vs 1.9 compatibility with Multiruby

Ruby测试语言 & 开发