단위 테스트(Unit Testing)란 무엇인가?
단위 테스트는 소프트웨어를 구성하는 개별 구성 요소(유닛)를 각각 검증하는 소프트웨어 테스트 방식입니다. 개발자에게 단위 테스트는 필수적인 습관이며, 이를 통해 소프트웨어의 모든 구성 요소가 의도한 대로 정확하게 동작하는지 확인할 수 있습니다. 일반적으로 단위 테스트는 개발 과정의 코딩 단계에서 주로 개발자에 의해 수행됩니다.
단위 테스트의 가장 큰 장점은 문제 해결이 쉬워진다는 점입니다. 시스템 전체에서 오류를 찾는 대신, 어떤 특정 구성 요소에 문제가 있는지 바로 파악할 수 있기 때문에 해당 유닛만 집중적으로 수정하면 됩니다.
파이썬 단위 테스트
파이썬에는 unittest라는 내장 패키지가 포함되어 있어 별도의 설치 없이 단위 테스트를 수행할 수 있습니다. 단위 테스트는 코드를 미래에도 안정적으로 유지할 수 있게 해줍니다. 개발자가 코드가 실패할 가능성이 있는 다양한 경우를 미리 예측하고, 그 케이스들에 대해 코드를 검증하기 때문입니다. 물론 모든 경우를 완벽하게 커버할 수는 없지만, 대다수의 잠재적 오류 상황을 사전에 걸러낼 수 있습니다.
unittest 모듈은 아래와 같이 파이썬 프로그램에서 import하여 사용할 수 있습니다.
import unittest
실전 예제
정사각형의 넓이를 계산하는 간단한 함수가 있다고 가정해 보겠습니다. 이 파일을 'area.py'라는 이름으로 저장합니다.
def area(a):
return (a+a)이제 위 함수가 기대한 출력을 반환하는지 확인해 주는 단위 테스트 코드를 작성해 보겠습니다. 테스트 코드 파일은 'unit_test.py'라는 이름으로 저장합니다.
unit_test.py
from area import *
import unittest
class Testarea(unittest.TestCase):
def test_area(self):
self.assertAlmostEqual(area(5),25)
self.assertAlmostEqual(area(3),9)
self.assertAlmostEqual(area(4),16)여기서는 테스트 대상 코드가 담긴 파일을 먼저 import합니다. 그리고 unittest의 assertAlmostEqual() 메서드를 사용했습니다. 이 메서드는 첫 번째 매개변수로 함수 호출 결과를, 두 번째 매개변수로 기대되는 출력값을 받습니다. area() 함수가 반환한 값이 기대값과 일치하면 테스트를 통과하고, 그렇지 않으면 실패합니다.
이제 명령 프롬프트에서 unit_test.py를 실행해 area() 코드가 테스트를 통과하는지 확인해 보겠습니다.
명령 프롬프트에서 다음 명령을 실행하여 테스트 파일을 구동합니다.
python -m unittest unit_test.py
실행 결과
C:\Users\Inderjit Singh\Desktop>python -m unittest unit_test.py
F
======================================================================
FAIL: test_area (unit_test.Testarea)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\Inderjit Singh\Desktop\unit_test.py", line 7, in test_area
self.assertAlmostEqual(area(5),25)
AssertionError: 10 != 25 within 7 places (15 difference)
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)코드가 단위 테스트에 실패했습니다. 실패 원인은 traceback에 자세히 나와 있습니다. 첫 번째 테스트인 self.assertAlmostEqual(area(5),25)에서 코드가 실패했는데, 함수가 10을 반환했지만 기대 출력은 25이기 때문입니다.
함수가 매우 간단하기 때문에 원인을 금방 알 수 있습니다. area() 코드 자체가 잘못된 것입니다. 정사각형의 넓이를 계산하려면 (a+a)가 아니라 (a*a)를 반환해야 합니다.
area() 코드를 수정한 뒤 단위 테스트를 다시 실행해 보겠습니다.
def area(a):
return (a*a)unit_test.py 재실행
C:\Users\Inderjit Singh\Desktop>python -m unittest unit_test.py . ---------------------------------------------------------------------- Ran 1 test in 0.000s OK
이제 area()의 코드를 수정했더니 테스트가 OK 상태로 성공적으로 통과했습니다. 이는 우리 코드가 unit_test.py에 명시된 모든 케이스에 대해 완벽하게 동작한다는 것을 보증해 줍니다.
지금까지 살펴본 것은 단위 테스트의 기본 개념을 잡아주는 매우 간단한 예제입니다. 실제 개발 과정에서는 unittest 모듈이 제공하는 assertEqual(), assertTrue(), assertRaises() 등 다양한 검증 메서드와 setUp(), tearDown() 같은 테스트 생명주기 메서드를 활용해 더욱 체계적으로 테스트를 작성할 수 있습니다.