Programing Language/Python

unittest을 통해 테스트 코드 작성하기

jheaon 2023. 12. 12. 08:59

 

이번에는 unittest을 통해서 python 테스트 코드 작성 방법과 테스트 코드를 작성하는 이유에 대해서 조금 포괄적으로 다뤄보고자 한다. 

 


 

테스트코드 

테스트 코드를 작성하면 좋은 이점들을 아래와 같이 정리했다. 

 

  • 디버깅 비용(시간) 절감 : 코드를 작성하다 보면, 오류나 결함을 수정하는 데에 있어서 많은 소요비용을 지불한다. 테스트 코드는 개발자가 작성한 코드를 실행하여 예상된 결과가 나오는지 확인하는 데 사용된다. 
  • 코드 변경에 대한 불안감 해소 : 가끔 코드를 수정하다 보면 잘 되던 것들도 안 되는 경우가 생기는데 이러한 문제를 해결하게 도와준다. 
  • 더 나은 문서자료 : 개발자는 항상 좋은 코드를 작성하기 위해서 노력할 필요가 있다. 테스트 코드는 이런 부분에 있어서 일반적인 문서 자료보다 신빙성 있는 신뢰성을 제공한다. 
  • 좋은 코드는 테스트하기 쉽다 : 코드는 강결합보다는 느슨한 결합을 통해 유지되어야 할 필요가 있다. 테스트코드는 강결합된 코드보다 느슨한 결합이 되어있는 코드가 더 테스트하기 쉽기 때문에, 테스트코드를 작성하기 어렵다면, 좋은 코드가 아닐 가능성이 높다. 

 

TDD

TDD(Test Driven Development)는 테스트 코드를 먼저 작성 한 뒤에, 그 테스트 코드를 통과하는 실제 코드를 나중에 만드는 기법을 의미한다. 주로 아래의 흐름으로 진행된다. 

 

  1. 구현해야 할 내용을 정의한다. (Need)
  2. 실패하는 테스트를 작성한다. (Test)
  3. 테스트를 통과하는 코드를 작성한다. (Code)
  4. 코드를 리팩터링 한다. (Refactoring)
  5. 구현해야 할 내용을 모두 끝낼 때까지 위의 작업을 반복한다.

 

unittest

파이썬에서는 이런 테스트코드 개발을 위해서 unittest라는 라이브러리를 지원하고 있다. 공식문서는 아래의 페이지에서 참고하면 될 듯하다. 

 

공식문서 : https://docs.python.org/ko/3/library/unittest.html

 

unittest — Unit testing framework

Source code: Lib/unittest/__init__.py(If you are already familiar with the basic concepts of testing, you might want to skip to the list of assert methods.) The unittest unit testing framework was ...

docs.python.org

 

 

unittest의 기본 골격은 아래와 같다. 

 

- main.py

import unittest


# 실제코드
def leap_year(year):
    pass


# 테스트코드
class LeapYearTest(unittest.TestCase):
    def test_leap_year(self):
        pass


# 테스트를 진행
if __name__ == '__main__':
    unittest.main()

 

unittest을 통해서 테스트코드를 작성할 때 주의할 점이 있는데 이는 아래와 같다.

  • 테스트 코드는 이처럼 unittest의 TestCase라는 클래스를 상속하여 작성한다.
  • 이 샘플 코드의 test_leap_year() 메서드처럼 test~로 시작하는 메서드는 자동으로 실행된다.
  • unittest.TestCase에 있는 assertFalse(), assertTrue(), assertEquals()라는 세 개의 메서드를 이용하여 작성한다. 

각각의 메서드는 다음과 같은 기능을 지니고 있다. 

  • assertTrue(a): a가 참인지 조사한다.
  • assertFalse(a): a가 거짓인지를 조사한다.
  • assertEqual(a, b): a와 b가 같은지를 조사한다.

 

다음은 윤년을 체크 테스트 코드를 작성한 예이다. 

 

- main.py

import unittest


def leap_year(year):
    def leap_year(year):
    if year == 0:
        return True


class LeapYearTest(unittest.TestCase):
    def test_leap_year(self):
        self.assertTrue(leap_year(0))


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

 

test_leap_year() 함수에 self.assertTrue(leap_year(0))라는 문장을 추가했다. 이 테스트 코드는 0년은 윤년이어야 한다는 뜻인데 해당 코드를 돌려 보면 다음과 같은 결과가 나온다. 

 

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

OK

 

성공적으로 테스트를 통과했음을 확인할 수 있다. 


https://tech.inflab.com/20230404-test-code/

 

테스트 코드를 왜 그리고 어떻게 작성해야 할까?

테스트 코드가 필요한 이유와 잘 작성하는 방법에 대해 공유합니다.

tech.inflab.com

https://wikidocs.net/132725

 

107 작성한 코드를 테스트하려면? ― unittest

unittest는 작성한 코드를 단위 테스트할 때 사용하는 모듈이다. ## 문제 연도를 입력으로 받아 윤년인지 아닌지를 확인하는 leap_year() 함수를 만들되 unitt…

wikidocs.net