tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

「テスト駆動開発入門」で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




「テスト駆動開発入門」