컨텐츠 바로가기

[Python] unittest 단위테스트 클래스 사용하기

http://mcchae.egloos.com/10584377

이제 파이썬을 이용하여 제품이 응용한 지도 상당한 (아직 일년 안되었지요...) 시간이 흘러간다.
그간 여러 가지 작업을 해 봤었는데 단위테스트가 상당히 중요하다는 것을 알았다.

내부 라이브러리의 버전이 변경되었던가, 아니면
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를 이용하여 제대로 된 테스트를 마련해야 좋은 프로그래머라 할 수 있겠다.

덧글|신고