44行写Ruby单元测试框架
作者:网络转载 发布时间:[ 2012/3/9 11:14:27 ] 推荐标签:
在去年的YOW Melbourne开发者大会上,我参加了一些研习班。这些研习班@coreyhaines和 @rains负责,因此TDD(测试驱动开发)成为了主要讨论的内容。通常这不是一个问题,但是令人沮丧的是(考虑到这是2010年举办的开发者大会),那时上网还不是很方便,我刚装上linux的笔记本无法下载Rspec。幸运的是几周前,我决定自己写一个单元测试框架(因为我有这个能力:)),接着我有了一个可用的测试框架,问题解决了。但是,这让我想到一个问题,少可以用多少代码写成一个可用的单元测试框架?
一个小可用的单元测试
刚开始写一个单元测试框架的时候代码是很少的,但当我想给它加入一些特性时变得没有那么精炼了:) 幸运的是重写是很容易的。我们真正需要做的是执行下面的代码:
1 describe "some test" do
2 it "should be true" do
3 true.should == true
4 end
5
6 it "should show that an expression can be true" do
7 (5 == 5).should == true
8 end
9
10 it "should be failing deliberately" do
11 5.should == 6
12 end
13 end
正如你看到的,它很像是一个基本的Rspec测试。让我们写一些代码来执行它。
译注:RSpec 工具是一个 Ruby 软件包,可以用它构建有关您的软件的规范。该规范实际上是一个描述系统行为的测试。
构建一个简单的框架
首先要做的是使用“describe”来定义一个新的测试。既然我们想要把”describe” block放在任何地方(例如,文件本身),我们需要对Ruby做一点扩展。“puts”函数在Kernel block中,因此可以在任何地方使用(因为Object类包含了Kernel并且Ruby中的每个对象都继承自Object类),同样的我们会把describe放到Kernel block中以赋予同样的能力):
1 module Kernel
2 def describe(description, &block)
3 tests = Dsl.new.parse(description, block)
4 tests.execute
5 end
6 end
译注:Ruby block:Ruby语言的block功能类似回调函数。
正如你看到的,”describe”接收一个用来描述测试的字符串和包含了测试代码的block。在这里,我们将测试的代码和”describe”分开讲解(例如,”it” block)。因此我们创建了Dsl类,用它的parse函数处理待测试的block,结果会产生一个可以执行我们所有测试的对象,但是不要高兴得太早。Dsl类看上去是这样的:
1 class Dsl
2 def initialize
3 @tests = {}
4 end
5 def parse(description, block)
6 self.instance_eval(&block)
7 Executor.new(description, @tests)
8 end
9 def it(description, &block)
10 @tests[description] = block
11 end
12 end
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11