注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 [业内传闻]今天,7月25日..
 帮助

Ruby简单演示:TDD如何工作


2007-09-30 19:11:33
 标签:Ruby TDD   [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://blackanger.blog.51cto.com/140924/44520
在看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的工作环节。


本文出自 “{ :Alex Space => " Ruby Notes " }” 博客,请务必保留此出处http://blackanger.blog.51cto.com/140924/44520



上一篇 发现个有趣的事  下一篇 Ruby编程规范



    文章评论
 
 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: