이제 파이썬을 이용하여 제품이 응용한 지도 상당한 (아직 일년 안되었지요...) 시간이 흘러간다.
그간 여러 가지 작업을 해 봤었는데 단위테스트가 상당히 중요하다는 것을 알았다.
내부 라이브러리의 버전이 변경되었던가, 아니면
python 자체의 버전이 바뀌는 등, 여러 가지 시스템의 변화 뿐만 아니라 기존의 코딩 수정하다
발생할 수 있는 side-effect 버그 등을 테스트 하고 수정하는 것은 결코 쉬운 일이 아니다.
파이썬에서 이러한 것을 쉽게 할 수 있도록 해 놓은 것이 바로 unittest 라는 모듈이다.
물론 java에서의 JUnit 등의 다른 언어도 유사한 것이 있겠지만, 이번에 이것을 이용하면서
꼭 이 모듈을 앞으로는 사용하리라 마음 먹었다.
예를 들어, 아래와 같은 python class가 있다고 가정하고,
class myClass:
def __init__(self):
self.a = 1
self.b = 'b'
def doA(self, p_a):
self.a = p_a
return self.a
def doB(self, p_b):
self.b = p_b
return self.b
이것을 간단히 테스트 하기 위하여 아래와 같은 함수를 만들었었다.
def testMain():
my = myClass()
my.doA(2)
my.doB('ABC')
if __name__ == "__main__":
testMain()
맨 아래의 __main__ 인가를 체크하는 부분은 이 모듈이 외부에서 import 되는 것이 아니라, 바로
최상위로 실행되면 testMain()을 돌려 테스트를 하라는 부분이다.
보통은 이와 같은 방식으로 테스트를 했었는데, 이 보다는 아래와 같이 하는 것이 더
훌륭한 방법이라는 것을 알았다.
##################################################################################################
class testUnit (unittest.TestCase):
'''
@brief test case using uniitest.TestCase
'''
def setUp(self):
''' @brief this method is called before every test methods '''
pass
def tearDown(self):
''' @brief this method is called after every test methods '''
pass
def test001_init(self):
my = myClass()
self.assertTrue(my.a == 1 and my.b == 'b')
def test002_doA(self):
my = myClass()
p_a = 2
my.doA(p_a)
self.assertTrue(my.a == p_a)
if __name__ == "__main__":
#testMain() # 처음 이렇게 테스트 하는 대신
#unittest.main() # 바로 이렇게 호출하여 테스트를 진행하면 전체 OK, Not OK 여부가 나오고
# 아래와 같이 두줄로 표시를 해 주면, 상단의 test001_init ... ok, test002_doA ... ok 와 같이 출력되며 단위테스트를 할 수 있다.
suite = unittest.TestLoader().loadTestsFromTestCase(testUnit)
unittest.TextTestRunner(verbosity=2).run(suite)
위와 같이 간단한 테스트 클래스가 아니라, 메소드가 수십개를 너머서게 되면서 로직이 꼬이고 오류가 발생될 수 있다.
이런 것을 위의 unittest를 이용하여 제대로 된 테스트를 마련해야 좋은 프로그래머라 할 수 있겠다.
그간 여러 가지 작업을 해 봤었는데 단위테스트가 상당히 중요하다는 것을 알았다.
내부 라이브러리의 버전이 변경되었던가, 아니면
python 자체의 버전이 바뀌는 등, 여러 가지 시스템의 변화 뿐만 아니라 기존의 코딩 수정하다
발생할 수 있는 side-effect 버그 등을 테스트 하고 수정하는 것은 결코 쉬운 일이 아니다.
파이썬에서 이러한 것을 쉽게 할 수 있도록 해 놓은 것이 바로 unittest 라는 모듈이다.
물론 java에서의 JUnit 등의 다른 언어도 유사한 것이 있겠지만, 이번에 이것을 이용하면서
꼭 이 모듈을 앞으로는 사용하리라 마음 먹었다.
예를 들어, 아래와 같은 python class가 있다고 가정하고,
class myClass:
def __init__(self):
self.a = 1
self.b = 'b'
def doA(self, p_a):
self.a = p_a
return self.a
def doB(self, p_b):
self.b = p_b
return self.b
이것을 간단히 테스트 하기 위하여 아래와 같은 함수를 만들었었다.
def testMain():
my = myClass()
my.doA(2)
my.doB('ABC')
if __name__ == "__main__":
testMain()
맨 아래의 __main__ 인가를 체크하는 부분은 이 모듈이 외부에서 import 되는 것이 아니라, 바로
최상위로 실행되면 testMain()을 돌려 테스트를 하라는 부분이다.
보통은 이와 같은 방식으로 테스트를 했었는데, 이 보다는 아래와 같이 하는 것이 더
훌륭한 방법이라는 것을 알았다.
##################################################################################################
class testUnit (unittest.TestCase):
'''
@brief test case using uniitest.TestCase
'''
def setUp(self):
''' @brief this method is called before every test methods '''
pass
def tearDown(self):
''' @brief this method is called after every test methods '''
pass
def test001_init(self):
my = myClass()
self.assertTrue(my.a == 1 and my.b == 'b')
def test002_doA(self):
my = myClass()
p_a = 2
my.doA(p_a)
self.assertTrue(my.a == p_a)
if __name__ == "__main__":
#testMain() # 처음 이렇게 테스트 하는 대신
#unittest.main() # 바로 이렇게 호출하여 테스트를 진행하면 전체 OK, Not OK 여부가 나오고
# 아래와 같이 두줄로 표시를 해 주면, 상단의 test001_init ... ok, test002_doA ... ok 와 같이 출력되며 단위테스트를 할 수 있다.
suite = unittest.TestLoader().loadTestsFromTestCase(testUnit)
unittest.TextTestRunner(verbosity=2).run(suite)
위와 같이 간단한 테스트 클래스가 아니라, 메소드가 수십개를 너머서게 되면서 로직이 꼬이고 오류가 발생될 수 있다.
이런 것을 위의 unittest를 이용하여 제대로 된 테스트를 마련해야 좋은 프로그래머라 할 수 있겠다.
덧글|신고