44行写就Ruby单元测试框架

发表于:2012-3-27 10:14

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:唐尤华 译    来源:51Testing软件测试网采编

  在去年的YOW Melbourne开发者大会上,我参加了一些研习班。这些研习班由coreyhaines和rains负责,因此TDD(测试驱动开发)成为了主要讨论的内容。通常这不是一个问题,但是令人沮丧的是(考虑到这是2010年举办的开发者大会),那时上网还不是很方便,我刚装上linux的笔记本无法下载Rspec。幸运的是几周前,我决定自己写一个单元测试框架(因为我有这个能力:)),接着我就有了一个可用的测试框架,问题解决了。但是,这让我想到一个问题,最少可以用多少代码写成一个可用的单元测试框架?

  一个最小可用的单元测试

  刚开始写一个单元测试框架的时候代码是很少的,但当我想给它加入一些特性时就变得没有那么精炼了:) 幸运的是重写是很容易的。我们真正需要做的是执行下面的代码:

describe"some test"do
  it"should be true"do
    true.should ==true
  end
  
  it"should show that an expression can be true"do
    (5==5).should ==true
  end
  
  it"should be failing deliberately"do
    5.should ==6
  end
end

  正如你看到的,它很像是一个基本的Rspec测试。让我们写一些代码来执行它。

  译注:RSpec 工具是一个 Ruby 软件包,可以用它构建有关您的软件的规范。该规范实际上是一个描述系统行为的测试。

  构建一个简单的框架

  首先要做的是使用“describe”来定义一个新的测试。既然我们想要把”describe” block放在任何地方(例如,文件本身),我们需要对Ruby做一点扩展。“puts”函数在Kernel block中,因此可以在任何地方使用(因为Object类包含了Kernel并且Ruby中的每个对象都继承自Object类),同样的我们会把describe放到Kernel block中以赋予同样的能力):

moduleKernel
  defdescribe(description, &block)
    tests = Dsl.new.parse(description, block)
    tests.execute
  end
end

  译注:Ruby block:Ruby语言的block功能类似回调函数。

  正如你看到的,”describe”接收一个用来描述测试的字符串和包含了测试代码的block。在这里,我们将测试的代码和”describe”分开讲解(例如,”it” block)。因此我们创建了Dsl类,用它的parse函数处理待测试的block,结果会产生一个可以执行我们所有测试的对象,但是不要高兴得太早。Dsl类看上去是这样的:

classDsl
  definitialize
    @tests= {}
  end
  defparse(description, block)
    self.instance_eval(&block)
    Executor.new(description,@tests)
  end
  defit(description, &block)
    @tests[description] = block
  end
end

  这里要做的是在Dsl对象的上下文里对block求值:

self.instance_eval(&block)

  我们的Dsl对象有一个”it”函数,同样也接收一个描述和一个block,这里和describe block包含的内容完全一致,一切都运行得很好(例如,我们基本上会在几个函数调用时使用”it”函数,每次都传入一个描述和一个block)。我们还可以在Dsl对象中定义其他的函数,并且这些函数会成为允许在”describe” block中使用的“语言”的一部分)。

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号