44行写就Ruby单元测试框架

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

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

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

  在这个阶段,我们只是将测试计算的结构转换成一个字符串,表明测试结果通过或失败并输出。在这个过程中,我们会统计通过或失败的测试数量,所以可以在最后给出一个总结报告。这就是我们所需要的所有的代码,如果我们将他们放到一起,就是下面的44行代码:

module Kernel
  def describe(description, &block)
    tests = Dsl.new.parse(description, block)
    tests.execute
  end
end
class Object
  def should
    self
  end
end
class Dsl
  def initialize
    @tests = {}
  end
  def parse(description, block)
    self.instance_eval(&block)
    Executor.new(description, @tests)
  end
  def it(description, &block)
    @tests[description] = block
  end
end
class Executor
  def initialize(description, tests)
    @description = description
    @tests = tests
    @success_count = 0
    @failure_count = 0
  end
  def execute
    puts "#{@description}"
    @tests.each_pair do |name, block|
      print " - #{name}"
      result = self.instance_eval(&block)
      result ? @success_count += 1 : @failure_count += 1
      puts result ? " SUCCESS" : " FAILURE"
    end
    summary
  end
  def summary
    puts "\n#{@tests.keys.size} tests, #{@success_count} success, #{@failure_count} failure"
  end

  如果我们“需要”使用这个框架执行最初的那个测试,我们会得到下面输出结果:

  some test

  - should be true SUCCESS

  - should show that an expression can be true SUCCESS

  - should be failing deliberately FAILURE

  3 tests, 2 success, 1 failure

  太好了!现在,如果你因没有一个单元测试框架而烦恼并且不想莽撞地写代码,只要花上5分钟你就可以得到一个能够助你一臂之力的测试框架。当然,这里有一些略微夸大;你很快就会想到这里缺少额外的验证API、更好的输出、对象仿真和测试桩等等。然而,我们可以很容易的在精简的框架上扩展其中的一些功能(例如,增加额外的DSL元素)——只消花费很小的努力。如果你不相信我,可以看看bacon ,它只用了几百行代码就完成了Rspec一个精简版。我编写的Attest测试框架是另一个很好的例子(这么说有自卖自夸的嫌疑:P)。这两者都缺少任何内建的test double 支持,我会在另外一个时间讨论如何添加test double支持。

  译注:Test Double:在对象编程中“自动化单元测试”的专业术语,涵盖的类型有Test Stub(测试桩)、Mock Object、Test Spy、Fake Object和Dummy Object。

33/3<123
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号