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 本文出自 51CTO.COM技术博客 |



blackanger
博客统计信息
热门文章
最新评论
友情链接
