在看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的工作环节。
菲波拉契数列: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的工作环节。