ruby單元測試庫

來源:互聯網
上載者:User
這幾天在學ruby, 自己寫了一個簡單的單元測試庫, 有點DSL的感覺。
似乎沒有ruby的格式化, 用Lua湊合一下吧。
sample code:require 'rUnit'
include RUnit

testSuite :SampleTestSuite do
  setup do
  end
  tearDown do
  end
  testCase :TestEqualPass do
    assertEqual 1.0, 4.0-3.0
  end
  testCase :TestEqualFail do
    assertEqual 1, 2
  end
  testCase :TestFail do
    assert 1>3
  end
  testCase :TestException do
    raise 'Exception raised'
  end
end

Output:SampleTestSuite
    Passed:TestEqualPass
    Failed:TestEqualFail (Expected <1> but <2>.)
    Failed:TestFail (Expected <true> but <false>)
    Failed:TestException (Exception raised)

Lib Source:

rUnit
module RUnit
  class TestSuite
    attr_reader :name
    attr_accessor :setup, :teardown
    def initialize(name)
      @name = name
      @testCases = []
    end
    
    def addTestCase(testCase)
      @testCases << testCase
      self
    end
    
    def run()
      @testCases.collect do |tc|
        begin
          @setup.run if @setup
          tc.run
        ensure
          @teardown.run if @teardown
        end
      end
    end
  end
  
  class SetUp
    def initialize(block)
      @block = block
    end
    
    def run
      @block.call
    end
  end
  
  class TearDown < SetUp
  end
  
  class TestCase
    attr_reader :name
    def initialize(name, block)
      @name = name
      @block = block
    end
    
    def run()
      @block.call()
      TestResult.new(@name, true)
    rescue =>ex
      TestResult.new(@name,false,ex)
    end
  end
  
  class TestResult
    attr_reader :message,:status,:testCaseName
    def initialize(testCaseName, status, message=nil)
      @testCaseName = testCaseName
      @status = status
      @message = message
    end
  end

  def printResult(name,results)
    puts name
    results.each do |r|
      status = :Failed
      status = :Passed if r.status
      message = "\t#{status}:#{r.testCaseName}"
      message += " (#{r.message})" if r.message
      puts message
    end
  end  

  module_function
  def testSuite(name, &block)
    @testSuite = TestSuite.new(name)
    block.call
    results = @testSuite.run
    printResult(name, results)
  end
  
  def testCase(name, &block)
    @testSuite.addTestCase TestCase.new(name, block)
  end
  
  def setup(&block)
    raise 'Test suite can have only one setup method' if @testSuite.setup
    @testSuite.setup = SetUp.new(block)
  end
  
  def tearDown(&block)
    raise 'Test suite can have only one teardown method' if @testSuite.teardown
    @testSuite.teardown = TearDown.new(block)
  end
  
  def assert(expression)
    assertFail 'Expected <true> but <false>' unless expression
  end
  
  def assertEqual(expected, actual)
    assertFail "Expected <#{expected}> but <#{actual}>." unless expected == actual
  end
  def assertFail(message)
    raise message
  end  
end
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.