요즘 너무 오랫만에 코딩을 하다보니, unit test도 다 까먹고 kotlin에서는 어떻게 해야할지 막막했다. unit test를 다루는데에는 아무래도 python이 편하고 쉬운거 같아서 일단 python에서의 unit test를 보는중. 아직 볼게 많은데, 한번에 다 기록하려면 많으니까 일단 기본적인거만 기록해본다.
주로 참고한 곳은 유튭에서 아래에 보이는 Python Tutorial: Unit Testing Your Code with the unittest Module 요 영상이다. 유튭에 학습용 영상들 트래쉬 갈비지 쓰레기가 많은데, 이분 채널 자체가 python 입문자에겐 보석같은 존재. 현재의 내게 real python(유료)와 이분의 채널이 가장 도움이 되고 있다. 공식 문서의 레퍼런스야 당연히 참고.
다음과 같이 원화와 달러의 환율을 계산해주는 아주 간단한 변환기를 테스트한다고 해보자.
class CurrencyConverter:
def __init__(self):
self.currency = 0.00083
def won_to_dollar(self, won):
return won * self.currency
Python에서도 unit test를 위한 패키지는 여러가지가 있는데, 가장 기본적인건 ‘unittest’인듯하다. 기본적인 테스트 케이스를 만들기 위해 ‘TestCase’도 import해준다.
import unittest
from unittest import TestCase
테스트를 하려면 그 대상인 ‘CurrencyConverter’는 당연히 임포트 해야한다.
from currency_converter import CurrencyConverter
테스트 케이스를 만들려면 ‘TestCase’를 상속받아 클래스를 만들어야 한다. 각각의 테스트들은 이 클래스안에 접두어 ‘test_’를 붙여서 멤버함수로 만들어준다. ‘test_’뒤에 나오는 이름은 상관없는데, 아래 코드는 won_to_dollar() 함수를 테스트하려고 이름을 붙여줬다.
class TestCurrencyConverter(TestCase):
def test_w_to_d(self):
pass
이제 테스트를 해야하는데, TestCase에 정의된 aseert문들을 사용한다. 공식문서를 참고하면 다음과 같은 것들이 있다.
Method | Checks that | New in |
---|---|---|
assertEqual(a, b) | a == b | |
assertNotEqual(a, b) | a != b | |
assertTrue(x) | bool(x) is True | |
assertFalse(x) | bool(x) is False | |
assertIs(a, b) | a is b | 3.1 |
assertIsNot(a, b) | a is not b | 3.1 |
assertIsNone(x) | x is None | 3.1 |
assertIsNotNone(x) | x is not None | 3.1 |
assertIn(a, b) | a in b | 3.1 |
assertNotIn(a, b) | a not in b | 3.1 |
assertIsInstance(a, b) | isinstance(a, b) | 3.2 |
assertNotIsInstance(a, b) | not isinstance(a, b) | 3.2 |
환율의 초기값이 0.00083이므로, 만약 간단하게 천원을 변환하면 0.83 달러가 될 것이다. 요걸 테스트 케이스로 만들면 다음과 같이 된다.
class TestCurrencyConverter(TestCase):
def test_won_to_dollar(self):
cc = CurrencyConverter()
self.assertEqual(cc.won_to_dollar(1000), 0.83)
다음과 같은 명령행으로 테스트를 실행할 수 있다.
>python -m unittest tests\test_currency_converter.py
테스트 하기전에, 특정 값을 설정하는등 초기화 작업이 필요하면, ‘setUp()’을 사용하고 테스트가 끝나고 변경된 값을 돌려놓거나 리소스를 해제하려면 tearDown()을 쓴다. 이들은 각 테스트 메소드가 실행될 때마다 setUp()-test_method1()-tearDown()-setUp()-test_method2()-tearDown()…과 같이 호출된다. 이를 앞의 테스트 클래스에 적용하면 다음과 같다.
class TestCurrencyConverter(TestCase):
def setUp(self) -> None:
self.cc = CurrencyConverter() # 객체생성부분이 여기로 옮겨왔다.
def tearDown(self) -> None:
pass
def test_won_to_dollar(self):
self.assertEqual(self.cc.won_to_dollar(1000), 0.83)
만약, 테스트 클래스 전체에서 여러테스트를 하는동안 한번씩만 호출되게 하려면 setUpClass(cls), tearDownClass(cls)를 클래스 메소드로 정의한다.
...
@classmethod
def setUpClass(cls) -> None:
pass
@classmethod
def tearDownClass(cls) -> None:
pass
...
pyCharm에서는 테스트 대상 클래스에서 Ctrl+Shift+T 를 누르면 원하는 테스트 클래스를 자동으로 생성해준다. 이렇게 생성되면Ctrl+Shift+F10으로 실행했을 때, 자동으로 unittest로 실행해준다.
오늘은 여기까지. 이것만 가지고도 기본적인 unit test는 작성할 수 있을 것이다. 나머지는 좀 더 공부하고 최종적으론 Kotlin을 목표로.
나를 위한 기록으로 대충 적었어야 하는데, 어느새 무슨 튜토리얼 처럼 상세하게 적고 있는 나를 발견했다. 블로그글로 에너지를 많이 뺏기기도 싫고, 완벽하려고 스트레스 받기도 싫다. 담부터는 좀 더 대충 적어야지 ㅋㅋㅋ