「テスト駆動開発入門」でTDD Part 2
「テスト駆動開発入門」を教材に、言語を Ruby にして TDD してみました。
今回は Part 2。自作の xUnit を作成します。
今回は元言語は Python ですが、それを Ruby にします。動的型同士なので、あんまり違いが出なかったですなぁ。あとは Python には言語標準の assert があるけど、Ruby には無かった(Test::Unit 使えばいいの?なんかニュアンス違うんだよなぁ)ので、無理やり自作しちゃったなどなど、あんまりいい感じにはなりませんでした。
完成したコードは下記。なんか気に食わないけど、とりあえず終了とします。
#!/usr/local/bin/ruby class TestCase def initialize(name) @name = name end def setUp end def tearDown end def run(result) result.testStarted setUp begin eval(@name) rescue #puts $! result.testFailed ensure tearDown end return result end end class TestSuite def initialize @tests = [] end def add(test) @tests.push(test) end def run(result) @tests.each do |test| test.run(result) print "." end end end class WasRun < TestCase def testMethod @log << "testMethod " end def testBrokenMethod raise StandardError, "dummy: test error" end def setUp @log = "setUp " end def tearDown @log << "tearDown " end attr_reader :log end class TestResult def initialize @runCount = 0 @errorCount = 0 end def testStarted @runCount += 1 end def testFailed @errorCount += 1 end def summary return "%d run, %d failed" % [@runCount, @errorCount] end end def assert(condition) if ( condition == false ) puts "test failed in " + condition end end class TestCaseTest < TestCase def setUp @result = TestResult.new() end def testTemplateMethod test = WasRun.new("testMethod") test.run(@result) assert("setUp testMethod tearDown " == test.log) end def testResult test = WasRun.new("testMethod") test.run(@result) assert("1 run, 0 failed" == @result.summary) end def testFailedResult test = WasRun.new("testBrokenMethod") test.run(@result) assert("1 run, 1 failed" == @result.summary) end def testFailedResultFormatting @result.testStarted() @result.testFailed() assert("1 run, 1 failed" == @result.summary) end def testSuite suite = TestSuite.new() suite.add(WasRun.new("testMethod")) suite.add(WasRun.new("testBrokenMethod")) suite.run(@result) assert("2 run, 1 failed" == @result.summary) end end suite = TestSuite.new() suite.add(TestCaseTest.new("testTemplateMethod")) suite.add(TestCaseTest.new("testResult")) suite.add(TestCaseTest.new("testFailedResultFormatting")) suite.add(TestCaseTest.new("testFailedResult")) suite.add(TestCaseTest.new("testSuite")) result = TestResult.new() suite.run(result) puts result.summary