테스트 중심 개발(TDD) 접근 방식을 사용하여 Python으로 문자열 계산기를 구현하겠습니다. 이는 해당 기능을 구현하기 전에 각 기능에 대한 테스트를 작성한다는 의미입니다.
TDD 구현을 위한 체크포인트는 https://osherove.com/tdd-kata-1 링크를 참고하시면 됩니다. 링크는 따라갈 수 있는 단계별 지침을 제공합니다.
프로젝트 폴더에 string_calculator.py와 테스트/test_string_calculator.py라는 두 개의 파일을 만듭니다. 기능을 단계별로 구현하겠습니다. 먼저 add 메소드를 사용하여 StringCalculator 클래스를 생성해야 합니다.
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
테스트를 실행하려면 다음 단계를 따르세요.
string_calculator.py 및 테스트/test_string_calculator.py 파일이 있는 프로젝트 디렉터리에 있는지 확인하세요.
터미널이나 명령 프롬프트를 엽니다.
다음 명령을 실행하여 테스트를 실행하세요.
python -m unittest discover tests
이 명령은 테스트 폴더 내의 모든 테스트를 자동으로 검색하고 실행합니다.
테스트에 통과하면 다음과 같은 내용이 표시됩니다.
---------------------------------------------------------------------- Ran 1 test in 0.001s OK
모든 것이 올바르게 설정되고 테스트 사례가 통과되면 빈 문자열 처리 구현이 예상대로 작동한다는 의미입니다.
입력 문자열에 숫자가 하나 또는 두 개만 있는 경우를 처리하려면 메소드를 업데이트해야 하며 해당 숫자의 합계를 반환해야 합니다. 빈 문자열의 경우 메서드는 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)
이전 단계에 따라 코드를 다시 테스트할 수 있습니다.
메서드가 쉼표로 구분된 여러 숫자를 처리할 수 있는지 확인하기 위해 테스트 사례를 작성하겠습니다.
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)
기능이 이미 구현되었으므로 코드 테스트를 진행한 후 다음 단계로 넘어갈 수 있습니다.
이제 새 줄(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단계에 정의된 이전 단계에 따라 코드를 다시 테스트할 수 있습니다.
이 단계에서는 사용자 정의 구분 기호를 허용하도록 기능을 더욱 강화할 것입니다. 예를 들어, 사용자는 문자열 시작 부분에 사용자 정의 구분 기호를 지정할 수 있어야 합니다. 예:
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)
이 단계에서는 음수를 처리하도록 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)
이 단계에서는 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
이 단계에서는 두 가지 요구 사항을 구현합니다.
먼저 이 두 가지 요구 사항에 대한 테스트를 작성한 다음 StringCalculator 클래스에 기능을 구현합니다.
1000보다 큰 숫자 무시 및 모든 길이의 사용자 정의 구분 기호 처리에 대해 다음 테스트를 추가합니다. 테스트/test_string_calculator.py 파일을 열고 다음을 추가합니다.
python -m unittest discover tests
이제 StringCalculator 클래스에 기능을 구현해 보겠습니다. 여기에는 다음이 포함됩니다.
업데이트된 StringCalculator 클래스는 다음과 같습니다.
---------------------------------------------------------------------- Ran 1 test in 0.001s OK
이 단계에서는 모든 길이의 여러 구분 기호를 지원하도록 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!