【敏捷开发】Ruby简单演示:TDD如何工作

【敏捷开发】Ruby简单演示:TDD如何工作

在看Kent Beck的Test-Driven Development,首先翻到了附录B,因为那有个菲波拉契数列的实用例子。我用Ruy的unit test来实现。
菲波拉契数列:0,1,1,2,3,5,8,13。。。。

大师的观点是php?name=%B2%E2%CA%D4" onclick="tagshow(event)" class="t_tag">测试先行。那我们就先编写个php?name=%B2%E2%CA%D4" onclick="tagshow(event)" class="t_tag">测试用例:
注:test_fib.rb , fib.rb分别放在test,lib文件夹下。
我们首先测试fib(0)=0
新增一个测试
test_fib.rb:

$: .unshift File.join(File.dirname(__FILE__),"..","lib") #加载路径
require 'test/unit'
require 'fib'

class TestFib < Test::Unit::TestCase
 def testFibonacci
  assert_equal(0,fib(0))
 end
end
方法中断言预期和实际是否相等。
我们必须先让测试来运行起来,为了让测试能通过,我们在fib.rb中编写如下代码:
def fib(n)
  return 0
end

我们运行测试文件,OK,可以通过。
1 tests, 1 assertions, 0 failures, 0 errors

再加测试:修改testFibonacci方法:
def testFibonacci
  assert_equal(0,fib(0))
  assert_equal(1,fib(1))
end

再次修改fib.rb方法:
def fib(n)
  return 0 if n == 0
  return 1
end

OK,通过。。。
这样修改测试代码是不是有点烦了???我们来改进一下:
def testFibonacci
  hash = Hash[0,0,1,1]
  hash.each{|k,v|
  assert_equal(v,fib(k))
  }
end
这样,我们再添加测试的时候,就不用再增加多余的行了。
好,测试通过。

继续:
def testFibonacci
  hash = Hash[0,0,1,1,2,1]
  hash.each{|k,v|
  assert_equal(v,fib(k))
  }
end
OK,通过。
运行所有的测试程序,并失败
继续:
def testFibonacci
  hash = Hash[0,0,1,1,2,1,3,2]
  hash.each{|k,v|
  assert_equal(v,fib(k))
  }
end
终于失败了吧,呵呵,我们来改fib.rb来让测试代码通过。(做一些小小的改动)
def fib(n)
 return 0 if n == 0
 return 1 if n <= 2
 return 2
end
测试通过。。。

我们来看看,能不能把fib方法中来一般化,即,能不能通用。
def fib(n)
 return 0 if n == 0
 return 1 if n <= 2
 return 1+1
end

当n = 3的时候,要return 1+1
第一个1是fib(2)的直,第二个1是fib(1)的直

这样更加一般化
def fib(n)
 return 0 if n == 0
 return 1 if n <= 2
 return fib(n-1) + fib(n-2)
end
测试通过。。。

当n = 2的时候,同样满足fib(n-1) + fib(n-2),再修改:
def fib(n)
 return 0 if n == 0
 return 1 if n == 1
 return fib(n-1) + fib(n-2)
end
测试通过。。。
运行所有的测试程序,并全部通过。。。
对,Ruby里还可以把最后一行的表达式的return去掉。。。
(重构代码以消除重复设计,优化设计结构)
def fib(n)
 return 0 if n == 0
 return 1 if n == 1
 fib(n-1) + fib(n-2)
end
测试,OK。。。

这就是整个测试驱动开发的工作过程。。。当然有很多细节需要我摸索,但是通过这个示例,可以对TDD有个基本的认识。。。文中的红色部分,即是TDD的工作环节。

我怎么觉得反而更麻烦了?
嗯....貌似是这个例子举的不恰当
毕竟生成fibnacci属于用纸笔都能写出来的程序...
这个例子要说明的不是fibnacci
重点是TDD的工作过程。。。呵呵
你的关注点不在fibnacci
而应该在TDD的环节
引用:
原帖由 blackanger 于 2007-9-30 21:38 发表
你的关注点不在fibnacci
而应该在TDD的环节
呵呵,这个例子是在kent beck的书上附录里的例子,我只是用Ruby来改写一下。
还有刚看了那个日本的ruby代码规范,发现例子中的代码有点不符合规范。
引用:
(重构代码以消除重复设计,优化设计结构)
def fib(n)
 return 0 if n == 0
 return 1 if n == 1
 fib(n-1) + fib(n-2)
end
过段时间用Ruby实现TDD的money那个例子发上来,另外还一个例子。
嗯,好文一篇
让小生长了见识了。
多谢blackanger
引用:
原帖由 blackanger 于 2007-10-1 11:03 发表
过段时间用Ruby实现TDD的money那个例子发上来,另外还一个例子。