Programing/TDD

파이썬으로 TDD 진행해보기(feat. unittest 예제)

뇌님 2022. 11. 24. 01:11
반응형

스터디 도서의 내용을 실습하기 이전에,

파이썬으로 TDD를 진행할 수 있는지 자체를 먼저 확인해 봐야겠습니다.

 

엄밀히 따지면, 이 글의 제목은 잘못되었습니다.

"TDD 진행해보기"가 아니라, "코드 테스트하기"가 더 정확할 겁니다.

그치만 전 TDD를 공부하기 위해서 unittest를 사용하는거니까요...

 

import unittest

파이썬에서는 기본 라이브러리인 unittest를 이용해서 TTD를 진행할 수 있습니다.

 

unittest는 코드를 테스트할 수 있도록 도와주는 라이브러리입니다.

unittest를 활용하면 코드 테스트도 할 수 있고, 테스트가 가능하니 TDD도 진행할 수 있습니다.

 

아래는 덧셈,뺄셈,곱셈,나눗셈을 할 수 있는 calculator.py,

이 calculator.py가 돌아갈 때 문제가 없는지 테스트하는 test_calculator.py의 모습입니다.

그럼 이제 위의 화면과 같이 unittest를 활용해 코드를 테스트 해봅시다.

 

 

1. test_calculator.py 만들기

테스트 하고자 하는 코드(calculator.py)는 이미 있다고 가정하겠습니다.

def add(x, y):
    return x + y

def sub(x, y):
    return x - y

def multiply(x, y):
    return x * y

def divide(x, y):
    return x / y

calculator.py가 있는 디렉토리 안에 테스트코드(test_calculator.py)를 만들어주세요

  • 꼭 같은 디렉토리가 아니여도 괜찮습니다. 여기서는 calculator.py를 쉽게 import하기 위함입니다.
  • test코드의 이름은 "test_*", "*_test"과 같이 구분 가능한 것이 좋습니다. 아래처럼 테스트 코드를 전부 탐색해서 자동으로 돌려버리는게 가능하기 때문입니다. (이 글에서는 이 내용을 다루지 않습니다.)
python -m unittest discover project_directory "*_test.py"

 

 

2. unittest 클래스 상속하고 테스트용 메소드 만들기

import unittest
import calculator


class TestCalculator(unittest.TestCase):

    def test_add(self):
  • 클래스명(unittetst.TestCase) : 테스트를 돌리기 위해 unittest를 상속받았습니다.
  • 모든 메소드는 "test_" : unittest가 자동으로 테스트를 돌려주기 위해서는 이름을 특별하게 지정해주어야 합니다.
    unittest는 이름이 "test_"으로 시작하는 메소드만 테스트용으로 취급하기 때문입니다.

 

 

3. 메소드 안에 테스트할 내용 넣기

calculator.py의 add함수만 테스트 해보려고 합니다.

import unittest
import calculator


class TestCalculator(unittest.TestCase):

    def test_add(self):
        result = calculator.add(1, 2)
        self.assertEqual(result, 3)  # (result == 3)인지 확인
  • unittest.TestCase를 상속받았으므로, 메소드들을 사용할 수 있습니다.
  • 여기서는 assertEqual 메소드를 사용했습니다. 둘이 같은 값인지 확인합니다.
    같은 값이라면 테스트 성공, 다른 값이라면 테스트 실패입니다.
  • assertEqual 말고도 다양한 종류가 있습니다.

https://docs.python.org/ko/3/library/unittest.html#unittest.TestCase.debug

 

 

4. 테스트 돌리기

방법1 : CMD에서 테스트하기 (보편적인 방법)

>python -m unittest test_calculator.py

 

방법2 : PyCharm에서 테스트하기 (매우 쉬움)

 

방법3 : if __name__ == '__main__' 추가하기 (나중에 편함)

test_calculator.py가 위의 코드 상태 그대로일 때,

 

cmd에서 test_calculator.py를 바로 돌리면 아무런 반응이 없습니다. 그냥 클래스 하나 덜렁 있는 코드일 뿐인거죠.

아무런 반응 없음

그런데 아래와 같이 설정을 추가해주면

import unittest
import calculator


class TestCalculator(unittest.TestCase):

    def test_add(self):
        result = calculator.add(1, 2)
        self.assertEqual(result, 3)


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

cmd에서 unittest 모듈을 불러오지 않아도 바로 테스트 코드를  돌릴 수 있습니다.

이제 바로 실행시켜도 잘 돌아갑니다.

 

5. 다른 함수들에 대한 테스트도 추가해주기

import unittest
import calculator


class TestCalculator(unittest.TestCase):

    def test_add(self):
        self.assertEqual(calculator.add(1, 2), 3)

    def test_sub(self):
        self.assertEqual(calculator.sub(1, 2), -1)

    def test_multiply(self):
        self.assertEqual(calculator.multiply(1, 2), 2)

    def test_divide(self):
        self.assertEqual(calculator.divide(1, 2), 0.5)


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

4개의 테스트를 진행했고, 4개의 테스트 모두 이상이 없습니다.

 

반응형