>백엔드 개발 >파이썬 튜토리얼 >테스트 기반 개발(TDD)을 사용하여 문자열 계산기 구축: 단계별 가이드

테스트 기반 개발(TDD)을 사용하여 문자열 계산기 구축: 단계별 가이드

Barbara Streisand
Barbara Streisand원래의
2025-01-15 18:09:48917검색

Building a String Calculator with Test-Driven Development (TDD): A Step-by-Step Guide

테스트 중심 개발(TDD) 접근 방식을 사용하여 Python으로 문자열 계산기를 구현하겠습니다. 이는 해당 기능을 구현하기 전에 각 기능에 대한 테스트를 작성한다는 의미입니다.

TDD 구현을 위한 체크포인트는 https://osherove.com/tdd-kata-1 링크를 참고하시면 됩니다. 링크는 따라갈 수 있는 단계별 지침을 제공합니다.

시작하기

프로젝트 폴더에 string_calculator.py와 테스트/test_string_calculator.py라는 두 개의 파일을 만듭니다. 기능을 단계별로 구현하겠습니다. 먼저 add 메소드를 사용하여 StringCalculator 클래스를 생성해야 합니다.

1단계: 빈 문자열은 "0"을 반환해야 합니다.

unittest 라이브러리를 사용하여 애플리케이션에 대한 첫 번째 테스트를 작성해 보겠습니다. 테스트/test_string_calculator.py 파일을 열고 다음 코드로 시작합니다.

import unittest
from string_calculator import StringCalculator

class TestStringCalculator(unittest.TestCase):
    """Test suite for the StringCalculator class."""

    def setUp(self):
        """
        Create a new instance of StringCalculator for each test.
        Can use static method to avoid creating a new instance.
        """
        self.calculator = StringCalculator()

    def test_empty_string_returns_zero(self):
        """
        Test case: Adding an empty string should return 0.
        Input: "" 
        Expected Output: 0
        """
        self.assertEqual(self.calculator.add(""), 0)

이제 string_calculator.py 파일에 StringCalculator 클래스를 구현해 보겠습니다.

class StringCalculator:
    def add(self, numbers:str):
        if not numbers:
            return 0

테스트를 실행하려면 다음 단계를 따르세요.

  1. string_calculator.py 및 테스트/test_string_calculator.py 파일이 있는 프로젝트 디렉터리에 있는지 확인하세요.

  2. 터미널이나 명령 프롬프트를 엽니다.

  3. 다음 명령을 실행하여 테스트를 실행하세요.

python -m unittest discover tests

이 명령은 테스트 폴더 내의 모든 테스트를 자동으로 검색하고 실행합니다.

예상 출력:

테스트에 통과하면 다음과 같은 내용이 표시됩니다.


----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

모든 것이 올바르게 설정되고 테스트 사례가 통과되면 빈 문자열 처리 구현이 예상대로 작동한다는 의미입니다.

2단계: 하나 또는 두 개의 숫자를 추가하면 해당 합계가 반환되어야 합니다.

입력 문자열에 숫자가 하나 또는 두 개만 있는 경우를 처리하려면 메소드를 업데이트해야 하며 해당 숫자의 합계를 반환해야 합니다. 빈 문자열의 경우 메서드는 0을 반환해야 합니다.

테스트 작성

tests/test_string_calculator.py 파일을 열고 모든 시나리오를 포괄하는 다음 테스트 사례를 추가합니다.

    def test_add_single_number(self):
        """
        Test case: Adding a single number should return the number itself.
        Input: "1"
        Expected Output: 1
        """
        self.assertEqual(self.calculator.add("1"), 1)

    def test_add_two_numbers(self):
        """
        Test case: Adding two numbers should return their sum.
        Input: "1,2"
        Expected Output: 3
        """
        self.assertEqual(self.calculator.add("1,2"),3)

코드 구현

이제 string_calculator.py 파일의 add 메소드를 업데이트하여 하나 또는 두 개의 숫자 추가를 처리하세요.

class StringCalculator:
    def add(self, numbers:str):
        if not numbers:
            return 0
        '''
        Split the string by commas, convert each value to an integer, 
        and sum them up
        '''
        numbers_list = map(int,numbers.split(',')) 
        return sum(numbers_list)

이전 단계에 따라 코드를 다시 테스트할 수 있습니다.

3단계: 여러 번호 처리

메서드가 쉼표로 구분된 여러 숫자를 처리할 수 있는지 확인하기 위해 테스트 사례를 작성하겠습니다.

테스트 작성

tests/test_string_calculator.py 파일을 열고 여러 숫자를 처리하는 테스트 사례를 추가합니다.

import unittest
from string_calculator import StringCalculator

class TestStringCalculator(unittest.TestCase):
    """Test suite for the StringCalculator class."""

    def setUp(self):
        """
        Create a new instance of StringCalculator for each test.
        Can use static method to avoid creating a new instance.
        """
        self.calculator = StringCalculator()

    def test_empty_string_returns_zero(self):
        """
        Test case: Adding an empty string should return 0.
        Input: "" 
        Expected Output: 0
        """
        self.assertEqual(self.calculator.add(""), 0)

기능이 이미 구현되었으므로 코드 테스트를 진행한 후 다음 단계로 넘어갈 수 있습니다.

4단계: 숫자 사이의 새 줄 처리

이제 새 줄(n)을 쉼표 외에 숫자 사이의 유효한 구분 기호로 처리하도록 add 메소드를 개선해야 합니다.

테스트 작성

tests/test_string_calculator.py 파일을 열고 테스트 사례를 추가하여 메서드가 새 줄을 구분 기호로 올바르게 처리하는지 확인하세요.

class StringCalculator:
    def add(self, numbers:str):
        if not numbers:
            return 0

코드 구현

다음으로, 새 줄(n)을 구분 기호로 처리하도록 string_calculator.py 파일의 add 메서드를 업데이트하세요. n을 쉼표로 바꾼 다음 문자열을 쉼표로 분할하도록 메서드를 수정할 수 있습니다.

추가 메소드에 대해 업데이트된 코드는 다음과 같습니다.

python -m unittest discover tests

1단계에 정의된 이전 단계에 따라 코드를 다시 테스트할 수 있습니다.

5단계: 사용자 정의 구분 기호 처리

이 단계에서는 사용자 정의 구분 기호를 허용하도록 기능을 더욱 강화할 것입니다. 예를 들어, 사용자는 문자열 시작 부분에 사용자 정의 구분 기호를 지정할 수 있어야 합니다. 예:

  • 입력 문자열은 //로 시작하고 그 뒤에 맞춤 구분 기호가 올 수 있습니다. 예를 들어 //;n1;2;3은 6을 반환해야 합니다.
  • //;n1;2;3과 같은 구분 기호를 지원합니다.

테스트 작성

tests/test_string_calculator.py 파일을 열고 사용자 정의 구분 기호 기능을 처리하는 테스트 사례를 추가합니다.


----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

코드 구현

사용자 정의 구분 기호를 처리하려면 입력 문자열에서 구분 기호를 찾도록 add 메소드를 업데이트하세요. // 뒤의 문자열 시작 부분에 구분 기호를 지정해야 합니다.

업데이트된 추가 방법은 다음과 같습니다.

    def test_add_single_number(self):
        """
        Test case: Adding a single number should return the number itself.
        Input: "1"
        Expected Output: 1
        """
        self.assertEqual(self.calculator.add("1"), 1)

    def test_add_two_numbers(self):
        """
        Test case: Adding two numbers should return their sum.
        Input: "1,2"
        Expected Output: 3
        """
        self.assertEqual(self.calculator.add("1,2"),3)

6단계: 음수 처리

이 단계에서는 음수를 처리하도록 add 메소드를 수정해야 합니다. 음수가 전달되면 "음수는 허용되지 않습니다"라는 메시지와 함께 예외를 발생시키고 전달된 음수를 포함해야 합니다.

테스트 작성

tests/test_string_calculator.py 파일을 열고 음수 예외를 처리하는 테스트 사례를 추가합니다.

class StringCalculator:
    def add(self, numbers:str):
        if not numbers:
            return 0
        '''
        Split the string by commas, convert each value to an integer, 
        and sum them up
        '''
        numbers_list = map(int,numbers.split(',')) 
        return sum(numbers_list)

코드 구현

이제 add 메소드를 수정하여 음수를 확인하고 적절한 메시지와 함께 ValueError를 발생시킵니다.

업데이트된 추가 방법은 다음과 같습니다.

def test_add_multiple_numbers(self):
    """
    Test case: Adding multiple numbers should return their sum.
    Input: "1,2,3,4,5"
    Expected Output: 15
    """
    self.assertEqual(self.calculator.add("1,2,3,4,5"), 15)

7단계: Add 메서드 호출 계산

이 단계에서는 add() 메서드가 호출된 횟수를 반환하는 GetCalledCount()라는 메서드를 StringCalculator 클래스에 추가합니다. 먼저 실패한 테스트를 작성한 후 기능을 구현하는 방식으로 TDD 프로세스를 따르겠습니다.

테스트 작성

GetCalledCount() 메서드에 대한 테스트 사례를 추가하는 것부터 시작하세요. 이 테스트에서는 메소드가 add()가 호출된 횟수를 올바르게 계산하는지 확인해야 합니다.

tests/test_string_calculator.py 파일을 열고 다음 테스트를 추가하세요.

import unittest
from string_calculator import StringCalculator

class TestStringCalculator(unittest.TestCase):
    """Test suite for the StringCalculator class."""

    def setUp(self):
        """
        Create a new instance of StringCalculator for each test.
        Can use static method to avoid creating a new instance.
        """
        self.calculator = StringCalculator()

    def test_empty_string_returns_zero(self):
        """
        Test case: Adding an empty string should return 0.
        Input: "" 
        Expected Output: 0
        """
        self.assertEqual(self.calculator.add(""), 0)

코드 구현

이제 StringCalculator 클래스에 GetCalledCount() 메서드를 구현합니다. 이 메소드는 add()가 호출된 횟수를 추적해야 합니다.

업데이트된 StringCalculator 클래스는 다음과 같습니다.

class StringCalculator:
    def add(self, numbers:str):
        if not numbers:
            return 0

8단계 및 9단계: 1000보다 큰 숫자를 무시하고 모든 길이의 사용자 정의 구분 기호 처리

이 단계에서는 두 가지 요구 사항을 구현합니다.

  1. 합계에서 1000보다 큰 숫자는 무시되어야 합니다.
  2. 사용자 정의 구분 기호는 //[delimiter]n 형식을 사용하여 길이에 제한이 없으며 메서드가 이를 처리해야 합니다.

먼저 이 두 가지 요구 사항에 대한 테스트를 작성한 다음 StringCalculator 클래스에 기능을 구현합니다.

테스트 작성

1000보다 큰 숫자 무시 및 모든 길이의 사용자 정의 구분 기호 처리에 대해 다음 테스트를 추가합니다. 테스트/test_string_calculator.py 파일을 열고 다음을 추가합니다.

python -m unittest discover tests

코드 구현

이제 StringCalculator 클래스에 기능을 구현해 보겠습니다. 여기에는 다음이 포함됩니다.

  1. 1000보다 큰 숫자는 무시합니다.
  2. 모든 길이의 사용자 정의 구분 기호를 처리합니다.

업데이트된 StringCalculator 클래스는 다음과 같습니다.


----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

10단계: 여러 구분 기호 지원

이 단계에서는 모든 길이의 여러 구분 기호를 지원하도록 add() 메서드를 수정합니다. 이를 통해 //[delimiter1][delimiter2]n 형식의 구분 기호가 여러 개 있는 경우를 처리할 수 있습니다.

테스트 작성

여러 구분 기호를 확인하는 테스트 사례를 추가하는 것부터 시작하세요. 테스트/test_string_calculator.py 파일을 열고 다음 테스트를 추가하세요.

    def test_add_single_number(self):
        """
        Test case: Adding a single number should return the number itself.
        Input: "1"
        Expected Output: 1
        """
        self.assertEqual(self.calculator.add("1"), 1)

    def test_add_two_numbers(self):
        """
        Test case: Adding two numbers should return their sum.
        Input: "1,2"
        Expected Output: 3
        """
        self.assertEqual(self.calculator.add("1,2"),3)

코드 구현

이제 여러 구분 기호를 처리하도록 add() 메서드를 수정하세요. 구분 기호는 [] 내부에 전달되며 //[delimiter1][delimiter2]n 형식의 여러 구분 기호 처리를 지원해야 합니다.

이를 지원하기 위해 업데이트된 StringCalculator 클래스는 다음과 같습니다.

class StringCalculator:
    def add(self, numbers:str):
        if not numbers:
            return 0
        '''
        Split the string by commas, convert each value to an integer, 
        and sum them up
        '''
        numbers_list = map(int,numbers.split(',')) 
        return sum(numbers_list)

테스트하기

테스트를 다시 실행하여 이전 형식과의 하위 호환성 및 새로운 다중 구분 기호 형식 지원을 포함하여 모든 것이 작동하는지 확인하세요.

def test_add_multiple_numbers(self):
    """
    Test case: Adding multiple numbers should return their sum.
    Input: "1,2,3,4,5"
    Expected Output: 15
    """
    self.assertEqual(self.calculator.add("1,2,3,4,5"), 15)

예상 출력

이전 형식과 새 형식 모두 테스트를 통과해야 합니다.

def test_add_numbers_with_newlines(self):
    """
    Test case: Adding numbers separated by newlines should return their sum.
    Input: "1\n2\n3"
    Expected Output: 6
    """
    self.assertEqual(self.calculator.add("1\n2\n3"), 6)

이 TDD 시리즈를 팔로우해주셔서 감사합니다! 도움이 되셨기를 바랍니다.

위 내용은 테스트 기반 개발(TDD)을 사용하여 문자열 계산기 구축: 단계별 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.