행위

LuaUnit

아래 코드를 좀 더 개선시킨 버전이 http://phil.freehackers.org/programs/luaunit/index.html 에 있습니다. 그리고 아래 코드는 아무 제한 없이 자유로이 사용할 수 있습니다(퍼블릭 도메인).

(Much improved version is available at http://phil.freehackers.org/programs/luaunit/index.html . And about licence: as Philippe have guessed, this source code is in the Public Domain.)


Lua 용 단위검사 프레임웍이 없어서 아쉬웠는데 Lua 공부하면서 한 번 만들어 봤습니다. jUnit 등에 비하면 원시적인 차원이지만 뭐 이정도면 쓸만할 것 같아요 :)

수정, 개선 환영...

--류광

우선 사용 예부터...

require('luaunit')

function Number(num)
    local ClassBody = {Value}
    if ( num == nil) then
        ClassBody.Value = 0
    else
        ClassBody.Value = num
    end

    ClassBody.Add = function(self, num)
        --self.Value = self.Value + num
        return self
    end
    return ClassBody

end

NumberTest = {} --class

    function NumberTest:setUp()
        self.Num = Number(100)
    end

    function NumberTest:testTest()
        luaUnit:assertEquals( 100, self.Num.Value)
    end

    function NumberTest:testConstruct()
        n = Number(10)
        luaUnit:assertEquals( 10, n.Value)
    end

    function NumberTest:testAddition()
        n = Number(1)
        n:Add(2)
        luaUnit:assertEquals( 3, n.Value)
    end
-- class NumberTest

-- 테스트 실행
luaUnit:run('NumberTest')

run 메서드에서, 테스트 클래스 이름을 문자열로 지정해야 함.

출력:

NumberTest
==========
testConstruct.. OK.

testAddition.. failed.
    ----------
    expected : 3
    actual : 1
    ----------


testTest.. OK.

==========
3 tests run
1 failure(s).

LuaUnit 코드

luaunit.lua

0.0.4

  • 테스트 케이스의 독립성을 위해, setUp, tearDown를 매번 호출하도록 변경

0.0.3

  • run 메서드 첫 번째 매개변수에 테스트 슈트 클래스 이름을 문자열로 지정하도록 변경
-- luaunit.lua
-- A unit testing framework
-- author: Ryu, Gwang

function isFunction(aObject)
    if  'function' == type(aObject) then
        return true
    else
        return false
    end
end

luaUnit = {
    FailedCount = 0,
    TestCount = 0,
    FunctionName = 0,
    LastMessage = ''
}
    function luaUnit:assertEquals(expected, actual)
        if  actual ~= expected  then
            self.FailedCount = self.FailedCount + 1
            self.LastMessage = self.LastMessage .. '    expected : ' .. expected
                .. 'n    actual : ' .. actual
        end
    end

    function luaUnit:runTestCase(aName, aFunc)
        self.FunctionName = aName
        local failed = self.FailedCount
        self.LastMessage = ''
        aFunc()
        if (failed < self.FailedCount) then
            result = aName .. '.. failed.n    ----------n' .. self.LastMessage
                .. 'n    ----------n'
        else
            result = aName .. '.. OK.'
        end
        print(result)
        self.TestCount = self.TestCount + 1
    end

    function luaUnit:run( aTestSuiteName, aDescription)
        t = _G[aTestSuiteName]
        if aDescription then
            print(aDescription)
        else
            print(aTestSuiteName)
        end

        print('==========')

        -- run tests
        for name, func in  t do
            -- run setUp first(if any)
            if isFunction( t.setUp) then
                t:setUp()
            end


            if isFunction(func) and string.sub(name, 1, 4) == "test" then
                f = loadstring(aTestSuiteName .. ':' .. name .. '()')
                print( luaUnit:runTestCase(name, f) )
            end

            -- lastly, run tearDown(if any)
            if isFunction(t.tearDown) then
                t:tearDown()
                 print('----------')
            end
        end

        print('==========')
        print(self.TestCount .. ' tests run')
        if self.FailedCount > 0 then
            print(self.FailedCount .. ' failure(s).')
        else
            print('No failures.')
        end
    end
-- class luaUnit