2023-07-17 20:47:18

파이썬에서 단위테스트를 할 때 많이 사용되는 라이브러리 중에 unittest라는 것이 있습니다. 표준 라이브러리이기 때문에 파이썬을 설치하면 자동으로 설치되어 사용할 수 있는 라이브러리입니다. 

 

기능 구현

우선 다음과 같은 3가지 함수를 개발했다고 가정해보겠습니다.

 

def add(num1: int, num2: int):
    return num1 + num2

def prod(num1: int, num2: int):
    time.sleep(1)
    return num1*num2

def params2dict(name: str, age: str):
    return {
        "name": name,
        "age": age,
    }

 

add 함수는 매개변수로 받은 두 개의 정수를 더한 것을 반환하는 함수입니다. 

prod 함수는 매개변수로 받은 두 개의 정수를 곱한 것을 반환하는 함수입니다.

params2dict 함수는 매개변수로 받은 두 개의 문자열을 딕셔너리의 값으로 각각 담은 후 그 딕셔너리를 반환하는 함수입니다.   

 

테스트 코드 작성1

그러면 이 함수들이 의도한 대로 잘 작동하는지 테스트하는 테스트 코드를 함께 작성해보겠습니다. 

 

import unittest


def add(num1: int, num2: int):
    return num1 + num2

def prod(num1: int, num2: int):
    return num1*num2

def params2dict(name: str, age: str):
    return {
        "name": name,
        "age": age,
    }


class MyTests(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(12, 4), 16)
    
    def test_prod(self):
        self.assertEqual(prod(3, 5), 15)

    def test_params2dict(self):
        self.assertEqual(params2dict("홍길동", 35), {"name": "홍길동", "age": 35})


if __name__ == "__main__":
    unittest.main()

 

add(12, 4) = 16이어야 하고, prod(3, 5) = 15이어야 하고, params2dict("홍길동", 35) = {"name": "홍길동", "age": 35}이어야 한다는 내용의 테스트 코드입니다. 모든 테스트를 정상적으로 통과하면 다음과 같은 내용이 화면이 출력될 것입니다.

 

 

이번에는 add 함수를 테스트 하는 부분에서 아래와 같이 변경한 후에 코드를 실행해보겠습니다.

 

def test_add(self):
	self.assertEqual(add(12, 5), 16)

 

 

이번에는 첫번째 테스트에서 실패해서 F..와 같은 결과가 나오고 자세히 어떤 부분에서 테스트를 통과하지 못했는지 알려줍니다. 

 

테스트 코드 작성2

이번에는 테스트하는 각 함수의 실행시간까지도 출력되게 코드를 업그레이드 해보겠습니다. 일부러 prod 함수에 time.sleep(1)을 넣어줘서 1초가 소요되게 했습니다. 또한 setUpClass, tearDownClass 메서드를 작성하여 해당 클래스에 담겨져 있는 테스트 코드의 시작과 끝에 실행될 코드를 넣어줬고, setUp, tearDown 메서드를 작성하여 각 테스트 메서드 실행 시작과 끝에 실행될 코드를 넣어줬습니다. 

 

import unittest
import sys
import time


def add(num1: int, num2: int):
    return num1 + num2

def prod(num1: int, num2: int):
    time.sleep(1)
    return num1*num2

def params2dict(name: str, age: str):
    return {
        "name": name,
        "age": age,
    }


class MyTests(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("\nMyTests 단위 테스트 시작" + ">"*20)

    @classmethod
    def tearDownClass(cls):
        print("\n" + "<"*20 + "MyTests 단위 테스트 종료\n")

    def setUp(self):
        self.begin_time = time.time() 

    def tearDown(self):
        self.end_time = time.time()
        print(f"\n{self.end_time - self.begin_time:4f}초 소요\n\n")

    def test_add(self):
        print(f"\n\n{sys._getframe(0).f_code.co_name} 테스트>")
        self.assertEqual(add(12, 4), 16)
    
    def test_prod(self):
        print(f"\n\n{sys._getframe(0).f_code.co_name} 테스트>")
        self.assertEqual(prod(3, 5), 15)

    def test_params2dict(self):
        print(f"\n\n{sys._getframe(0).f_code.co_name} 테스트>")
        self.assertEqual(params2dict("홍길동", 35), {"name": "홍길동", "age": 35})


if __name__ == "__main__":
    unittest.main()

 

위 코드를 실행한 결과 화면은 다음과 같습니다. 각 함수별로 소요되는 시간도 함께 확인할 수 있습니다.