首頁 >後端開發 >Python教學 >使用測試驅動開發 (TDD) 建立字串計算器:逐步指南

使用測試驅動開發 (TDD) 建立字串計算器:逐步指南

Barbara Streisand
Barbara Streisand原創
2025-01-15 18:09:48923瀏覽

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

我們將使用測試驅動開發 (TDD) 方法在 Python 中實作字串計算器。這意味著我們將在實現相應功能之前為每個功能編寫測試。

您可以參考連結 https://osherove.com/tdd-kata-1 作為實作 TDD 的檢查點。該連結提供了您可以遵循的分步說明。

入門

在專案資料夾中,建立兩個檔案:string_calculator.py 和tests/test_string_calculator.py。我們將逐步實現這些功能。首先,我們需要建立一個帶有 add 方法的 StringCalculator 類別。

第 1 步:空字串應傳回“0”

讓我們使用單元測試庫為我們的應用程式編寫第一個測試。開啟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)

現在,讓我們在 string_calculator.py 檔案中實作 StringCalculator 類別:

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

要執行測試,請依照下列步驟操作:

  1. 確保您位於 string_calculator.py 和tests/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:處理數字之間的換行符

現在,我們需要增強 add 方法來處理除逗號之外的新行 (n) 作為數字之間的有效分隔符號。

編寫測試

開啟tests/test_string_calculator.py 檔案並新增一個測試案例來檢查該方法是否正確處理新行作為分隔符號:

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

實施準則

接下來,更新 string_calculator.py 檔案中的 add 方法以將新行 (n) 作為分隔符號處理。我們可以修改方法,將n替換為逗號,然後用逗號分割字串。

這是 add 方法的更新程式碼:

python -m unittest discover tests

您可以按照step1.

中定義的先前步驟再次測試程式碼

第 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 方法呼叫次數

在此步驟中,我們將在 StringCalculator 類別中新增名為 GetCalledCount() 的方法,該方法將傳回 add() 方法被呼叫的次數。我們將遵循 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 的數字和處理任意長度的自訂分隔符號新增以下測試。開啟tests/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.

的多個分隔符的情況

編寫測試

先加入一個測試案例來檢查多個分隔符號。開啟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)

實施準則

現在,修改 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