학습
Lua 단위 테스트 작성
Lua 단위 테스트 작성 — 중급
Lua 단위 테스트 작성
1. 도입 (왜 배워야 하는가)
단위 테스트는 소프트웨어 개발에서 코드의 품질을 높이고, 버그를 사전에 방지하는 중요한 과정입니다. 특히 Lua와 같은 스크립트 언어에서는 코드 변경으로 인한 문제를 빠르게 확인할 수 있어야 합니다. 단위 테스트가 없다면, 코드 수정 후 의도치 않은 오류가 발생할 가능성이 높아지고, 이는 서비스의 신뢰성을 떨어트리게 됩니다. 예를 들어, 쇼핑몰 웹사이트에서 결제 시스템이 고장나면 큰 손실을 초래할 수 있습니다. 따라서 단위 테스트는 코드의 신뢰성을 확보하는 필수적인 도구입니다.
2. 핵심 개념 설명
단위 테스트란 특정 코드 블록(함수, 모듈 등)이 올바르게 작동하는지를 검증하는 테스트입니다. 이 개념은 마치 요리에서 각 재료가 제 역할을 잘 수행하는지를 확인하는 것과 비슷합니다. 모든 재료가 조화를 이루어야 맛있는 요리가 되듯이, 모든 코드가 제대로 작동해야 소프트웨어가 정상적으로 작동합니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| 테스트 케이스 | 특정 입력에 대한 예상 결과를 정의한 예제 |
| 테스트 프레임워크 | 테스트를 작성하고 실행하는 데 사용하는 도구 |
| 어서션 | 특정 조건이 참인지 검사하는 함수 |
3. 기본 코드 예제
단위 테스트를 작성하기 위해 Lua에는 luaunit와 같은 테스트 프레임워크가 있습니다. 아래는 간단한 함수와 그에 대한 테스트 케이스를 작성하는 예시입니다.
-- sum.lua
local function sum(a, b)
return a + b
end
return { sum = sum }
-- test_sum.lua
local luaunit = require('luaunit')
local sumModule = require('sum')
function testSum()
luaunit.assertEquals(sumModule.sum(1, 2), 3) -- 1 + 2는 3이어야 함
luaunit.assertEquals(sumModule.sum(-1, 1), 0) -- -1 + 1은 0이어야 함
end
os.exit(luaunit.LuaUnit.run())
실행 결과
Test summary
------------
Tests run: 1, Failures: 0, Errors: 0
코드 한 줄씩 동작 설명
sum.lua파일에서sum함수를 정의하고, 이 모듈을 반환합니다.test_sum.lua파일에서luaunit라이브러리를 불러옵니다.sum모듈을 불러와sum함수를 테스트합니다.testSum함수에서는assertEquals를 사용해 예상 결과와 실제 결과를 비교합니다.luaunit.LuaUnit.run()을 호출하여 테스트를 실행합니다.- 단위 테스트는 코드 품질을 높이고 버그를 예방하는 중요한 도구입니다.
- Lua에서
luaunit과 같은 테스트 프레임워크를 사용하여 효율적으로 테스트를 작성할 수 있습니다. - 각 테스트 케이스는 특정 입력에 대한 예상 결과를 검증해야 합니다.
- 자주 하는 실수는 예상 결과를 잘못 설정하거나, 결과를 확인하지 않는 것입니다.
4. 실전 활용 예제
예제 1: 쇼핑몰의 할인 계산기
쇼핑몰에서 할인된 가격을 계산하는 함수를 단위 테스트합니다.
-- discount.lua
local function calculateDiscount(price, discount)
return price * (1 - discount)
end
return { calculateDiscount = calculateDiscount }
-- test_discount.lua
local luaunit = require('luaunit')
local discountModule = require('discount')
function testCalculateDiscount()
luaunit.assertEquals(discountModule.calculateDiscount(100, 0.1), 90) -- 10% 할인
luaunit.assertEquals(discountModule.calculateDiscount(200, 0.2), 160) -- 20% 할인
end
os.exit(luaunit.LuaUnit.run())
예제 2: 사용자 입력 검증
사용자가 입력한 이메일 주소가 유효한지 검사하는 함수를 테스트합니다.
-- validator.lua
local function isValidEmail(email)
return string.match(email, "^[%w%.]+@[%w%.]+%.%w+$") ~= nil
end
return { isValidEmail = isValidEmail }
-- test_validator.lua
local luaunit = require('luaunit')
local validatorModule = require('validator')
function testIsValidEmail()
luaunit.assertTrue(validatorModule.isValidEmail("[email protected]"))
luaunit.assertFalse(validatorModule.isValidEmail("invalid-email"))
end
os.exit(luaunit.LuaUnit.run())
5. 흔한 실수와 주의사항
실수 1: 테스트 케이스에서 예상 결과를 잘못 설정
-- 잘못된 코드
luaunit.assertEquals(sumModule.sum(1, 2), 4) -- 잘못된 기대값
실수 2: 어서션을 사용하지 않음
-- 잘못된 코드
function testSum()
sumModule.sum(1, 2) -- 결과를 확인하지 않음
end
올바른 코드
-- 올바른 코드
luaunit.assertEquals(sumModule.sum(1, 2), 3)
6. 정리
다음에 학습하면 좋은 주제는 테스트 주도 개발(TDD)입니다. TDD는 테스트를 먼저 작성하고, 그에 따라 코드를 구현하는 방법론으로, 실무에서의 코드 품질을 더욱 높일 수 있습니다.