Ruby简单演示:TDD如何工作

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

大师的观点是测试先行。那我们就先编写个测试用例:
注: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的工作环节。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值