[파이썬] 테스트 주도 개발과 예외 처리

테스트 주도 개발은 일반적으로 세 단계로 이루어집니다: “Red” 단계, “Green” 단계, “Refactor” 단계입니다. 먼저, 테스트를 작성하여 실패하는 결과를 만듭니다. 이후, 테스트를 통과시킬 만한 코드를 작성하여 테스트를 통과시킵니다. 마지막으로, 코드를 정리하고 개선하여 더 나은 형태로 리팩토링합니다.

파이썬에서는 테스트 주도 개발을 위해 다양한 도구들을 사용할 수 있습니다. 그 중에서도 가장 많이 사용되는 프레임워크는 unittestpytest입니다. unittest는 파이썬 표준 라이브러리에 포함되어 있으며, pytest는 더 유연하고 간결한 테스트 구문을 제공합니다.

예를 들어, 아래는 unittest를 사용하여 간단한 계산기 클래스의 테스트를 작성하는 코드입니다:

import unittest

class Calculator:
    def add(self, a, b):
        return a + b

class TestCalculator(unittest.TestCase):
    def setUp(self):
        self.calculator = Calculator()

    def test_add(self):
        result = self.calculator.add(3, 5)
        self.assertEqual(result, 8)

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

위 코드에서는 Calculator 클래스의 add 메서드를 테스트하는 TestCalculator 클래스를 작성했습니다. setUp 메서드에서는 테스트를 위해 필요한 객체를 초기화하고, test_add 메서드에서는 add 메서드가 예상대로 동작하는지 검증합니다. assertEqual 메서드를 사용하여 결과값이 예상한 값과 일치하는지 확인합니다.

테스트 주도 개발에서는 모든 경우를 고려하여 예외 상황에 대한 테스트도 작성해야 합니다. 파이썬에서는 unittestassertRaises 메서드를 사용하여 예외 처리 테스트를 작성할 수 있습니다.

아래는 나눗셈 기능을 추가한 Calculator 클래스에 대한 예외 처리 테스트를 작성한 코드입니다:

class Calculator:
    def divide(self, a, b):
        if b == 0:
            raise ZeroDivisionError("Cannot divide by zero")
        return a / b

class TestCalculator(unittest.TestCase):
    def setUp(self):
        self.calculator = Calculator()

    def test_divide_by_zero(self):
        with self.assertRaises(ZeroDivisionError):
            self.calculator.divide(5, 0)

위 코드에서는 divide 메서드에서 두번째 인자로 0이 입력되었을 때 ZeroDivisionError 예외를 발생시키는 것을 확인합니다. test_divide_by_zero 메서드에서는 assertRaises 메서드를 사용하여 해당 예외가 발생하는지 테스트합니다.

테스트 주도 개발은 코드의 안정성과 품질을 향상시키기 위한 중요한 방법론입니다. 예외 처리를 포함한 모든 가능한 예외 상황에 대한 테스트를 작성하여 소프트웨어의 견고성을 높이는 데에 활용할 수 있습니다.