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