본문 바로가기
Python/Study

[창시모] unittest in python

by beeny-ds 2022. 9. 5.

들어가며,,

git을 통해 모델링 개발을 하다보면 소스 코드의 파이프라인을 뜯어 보고 싶을 때가 있다. 전체 flow를 sequence하게 work하기보다는 모듈 단위로 구획을 나누어 확인해보고 싶은 경험이 다들 있을 것이다. 이때 중요한 건 각 모듈이 input 형태는 어떤지, output 형태는 어떤지 알고 있어야 한다는 점이다. 이를 통해 소스 코드 수정 및 업그레이드를 할 수 있다.

본 글에서 소개하는 기능은 파이썬의 단위 테스트인 unittest이다. DaleSeo 님의 블로그 글을 인용 + 필자의 의견을 종합하여 소개하고자 한다. 원본 글은 다음 링크를 확인하길 바란다.
https://www.daleseo.com/python-unittest-testcase/#%EB%A7%88%EC%B9%98%EB%A9%B4%EC%84%9C

 

[파이썬] 단위 테스트의 기본 (unittest)

Engineering Blog by Dale Seo

www.daleseo.com


 

unittest 모듈이란?

어떤 프로그램 언어를 사용하여 코딩을 하든 unittest(a.k.a 단위 테스트)는 신뢰할 수 있는 애플리케이션을 개발하기 위해서 필수적으로 습득해야 하는 기술이다. 파이썬은 내장 모듈인 unittest를 통해 간단하게 단위 테스트를 작성할 수 있다.

unittest 모듈은 Java의 JUnit, JavaScript의 Jest 또는 Mocha와 같은 단위 테스트 프레임워크다. 다만 다른 언어와 달리 기본적으로 언어에 내장되어 있기 때문에 파이썬만 설치가 되어 있다면 바로 모듈을 불러와서(import) 사용할 수 있다.

import unittest
from unittest import TestCase

 

unittest 사용법

단위 테스트를 사용할 때는 TestCase 클래스를 상속하는 클래스를 작성해야 한다. 또한 아래와 같이 작성한 클래스 내에 메소드 이름은 test로 시작해야 한다. 그래야 테스트를 실행할 때 해당 메서드가 누락되지 않고 정확히 test case로 인식 된다.

from unittest import TestCase


class MyTests(TestCase):
    def test_one_plus_two(self):
        self.assertEqual(1 + 2, 3)

위의 예시에서 assertEqual 이란 메서드(함수)는 1+2 와 3이 동일한지 확인해주는 기능이다. 상속한 TestCase 클래스에서 정의한 메서드이기 때문에 작성한 클래스의 메서드에서 바로 사용이 가능하다. assertEqual 외에도 다양한 메서드가 존재한다. 그 중에서 많이 쓰는 메서드의 예시를 보자.

from unittest import TestCase


class MyTests(TestCase):
    def test_one_plus_two(self):
        self.assertEqual(1 + 2, 3)

    def test_other_assertions(self):
        self.assertTrue(1 == 1)
        self.assertFalse(1 == 2)
        self.assertGreater(2, 1)
        self.assertLess(1, 2)
        self.assertIn(1, [1, 2])
        self.assertIsInstance(1, int)

메서드의 이름이 직관적이다. True/False는 True/False인지 확인해주는 메서드이고 Greater/Less는 큰지 작은지 확인해주는 메서드다. 나머지 메서드도 직관적인 의미와 동일한 역할을 한다.

만약 assert 메서드의 기능이 True가 아닐때, 예를들어 assertEqual(1 + 2, 5) 인 경우 터미널에서 실행했을 때 아래와 같은 에러가 발생한다.

$ python -m unittest my_tests.py
F
======================================================================
FAIL: test_one_plus_two (my_tests.MyTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/dale/examples/python-unittest-testcase/my_tests.py", line 6, in test_one_plus_two
    self.assertEqual(1 + 2, 5)
AssertionError: 3 != 5

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (failures=1)

 

만약 assertEqual(1 + 2, 3) 과 같이 True 값을 입력한다면 잘 동작한다.

$ python -m unittest my_tests.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

 

단위 테스트는 직관적인 모듈의 input/output 형태를 알 수 있는 테스트로 다른 사람이 개발한 소스 코드를 확인할 때 유용하게 사용될 수 있는 기능이다.


 

마치며,,

필자는 unittest를 사용하는 가장 큰 장점은 직관적이고 효율적인 내부 공유라고 생각한다. 여러 사람이 협업하여 n개의 모듈을 만들 때 각자 개발한 소스 코드를 설명하는 데 유용하다. 또한 일부 모듈을 수정하고자 할 때 input/output 형태를 빠르게 파악할 수 있어 좋은 참고 자료가 될 것이다. 

효율적인 소스 코드 공유 시 unittest와 공동으로 사용하면 좋을 것 같다고 생각하는 자료는 UML diagram이다. 알고리즘을 개발하는 데이터 사이언티스트 입장에서는 Class diagram을 작성하여 전체 파이프라인을 모듈 별로 잘 정리하여 공유해주고 모듈 별 input/output 형태를 unittest를 활용하여 공유해준다면 소스 코드 파악에 큰 도움이 될 것이다. 때문에 unittest 외에 Class diagram도 함께 알아두길 바란다.

예상했을 수 있지만 본 포스팅 후속편은 Class diagram이다.

반응형

댓글