十一、 测试
作为Java开发者最难实现的Ruby特征之一是动态类型化。如果你习惯于一种强类型化语言,那么动态类型化看上去似乎有点混乱。DT允许各种高级元编程技巧-这在一种强类型化语言中是很难或不可能实现的。当然,你可以放弃编译时刻类型检查的安全设置。那么,是否有一个方法能够实现两种世界的最佳结合呢?
单元测试应该是每一种语言必须实现的,但是它在动态语言中特别关键。单元测试比编译揭示了更多的内容。事实上,你应该改变在单元测试和编译之间的关系上的观点。最近,一位高级软件开发专家认为,"在今后的五年内,我们会把编译作为单元测试的一种弱的实现形式"。单元测试能够提供证实(verification)-编码将如期实现,而不是仅仅进行你输入内容的语法检查。
考虑到单元测试在Ruby世界中的极端重要性,你一定会希望RDT能够使得单元测试易于运行。的确如此!单元测试被包括在Ruby内,因此你不必下载任何其它的扩展。Ruby库中包括了一个 TestCase类和一个TestSuite的概念。你可以象创建任何另外的Ruby类一样来创建你的单元测试,从Test::Unit:: TestCase中子类化你的测试。列表1是一个Employee类的实例。
列表1.Employee类
| class Employee def initialize(name, salary, hire_year) @name = name @salary = salary @hire_year = hire_year end attr_reader :name, :salary, :hire_year def raise_salary_by(perc) @salary += (@salary * (perc * 0.01)) end def to_s "Name is #{@name}, salary is #{@salary}, " + "hire year is #{@hire_year}" end end |
相应的单元测试如下:
列表2.相应于Employee类的单元测试
| require 'test/unit/testcase' require 'test/unit/autorunner' require 'hr' class TestEmployee < Test::Unit::TestCase @@Test_Salary = 2500 def setup @emp = Employee.new("Homer", @@Test_Salary, 2003) end def test_raise_salary @emp.raise_salary_by(10) expected = (@@Test_Salary * 0.10) + @@Test_Salary assert( expected == @emp.salary) end end |
为了运行这个单元测试,你可以为该单元测试类创建一个Run配置-作为一个Test::Unit类型,见图12。
![]() 图12.RDT包括一个Test::Unit Run配置 |
当你运行这个测试时,你会得到与Java单元测试相同的支持元素,包括在左下角的类JUnit格子。
![]() 图13.运行于IDE中的一个单元测试的例子 |
你还可以在Ruby中创建TestSuites。TestSuites是Ruby类,它定义一个返回TestSuite的suite方法。这个 TestSuite由自动地在每个TestCases中定义的suite组成。列表3是针对几个类的一个示例TestSuite。
列表3.一些类的示例TestSuite
| require 'test/unit/testsuite' require 'test/unit/ui/tk/testrunner' require 'test/unit/ui/console/testrunner' require 'TestEmployee' require 'TestManager' class TestSuite_AllTests def self.suite suite = Test::Unit::TestSuite.new("HR Tests") suite << TestEmployee.suite suite << TestManager.suite return suite end end #Test::Unit::UI::Tk::TestRunner.run(TestSuite_AllTests) Test::Unit::UI::Console::TestRunner.run(TestSuite_AllTests) |
不同于前面运行单个TestCase的实例,这里的suite作为一独立的应用程序运行。Ruby有两个方法可以显示TestSuite的结果。第一个是"Console Test Runner"-它在控制台输出它的结果。第二个是"Tk TestRunner",它创建一个熟悉的对话框来显示测试的结果。图14显示了一个Tk TestSuite对话框。
![]() 图14.图形式的TestSuite对话框 |
十二、 新版本中的改进
RDT的当前版本是0.50。目前,其开发者正在开发0.60版本。下一个版本中将改进的方面包括:
· 代码折叠功能-提供针对类和方法的代码折叠功能。
· Outline视图-提供更详细的信息,包括对局部变量的支持。
· RI视图-从一个RDT视图中使用Ruby的ri工具。
· 任务标签-以Ruby注释形式为可配置的关键字(如TODO,FIXME)创建任务。
· 编辑器方面的改进-自动添加大括号,圆括号和单/双引号;还有更好的代码助手。
· 检查器快捷方式-在一个调试会话期间,针对经常使用的检查器提供可配置的快捷方式,如显示一个对象的所有方法,全局常量,等等。
接下来的版本将更好地使用JRuby字节码编译器。JRuby是一项工程,它允许把Ruby代码编译为Java字节码。这意味着,RDT的以后版本将更容易地加入到Eclipse世界中,甚至提供更好的支持。
十三、 总结
Ruby最终为业界人士所广泛认可和应用。其中,部分原因应该归功于Ruby on Rails工程的成功的驱动。如今,已经到了考虑如何把Ruby加入到你的"竞争工具箱"中的时候了。当然,RDT也是吸引你加入这一领域的一个重要因素。



