<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            13.4. 正面測試 (Testing for success)

            單元測試的基礎是構建獨立的測試用例 (test case)。一個測試用例只回答一個關于被測試代碼的問題。

            一個測試用例應該做到:

            基于如上原則,讓我們構建第一個測試用例。應符合如下要求

            1. toRoman 應該為所有 13999 的整數返回羅馬數字表示。

            例 13.2. testToRomanKnownValues

            
            class KnownValues(unittest.TestCase):                           1
                knownValues = ( (1, 'I'),
                                (2, 'II'),
                                (3, 'III'),
                                (4, 'IV'),
                                (5, 'V'),
                                (6, 'VI'),
                                (7, 'VII'),
                                (8, 'VIII'),
                                (9, 'IX'),
                                (10, 'X'),
                                (50, 'L'),
                                (100, 'C'),
                                (500, 'D'),
                                (1000, 'M'),
                                (31, 'XXXI'),
                                (148, 'CXLVIII'),
                                (294, 'CCXCIV'),
                                (312, 'CCCXII'),
                                (421, 'CDXXI'),
                                (528, 'DXXVIII'),
                                (621, 'DCXXI'),
                                (782, 'DCCLXXXII'),
                                (870, 'DCCCLXX'),
                                (941, 'CMXLI'),
                                (1043, 'MXLIII'),
                                (1110, 'MCX'),
                                (1226, 'MCCXXVI'),
                                (1301, 'MCCCI'),
                                (1485, 'MCDLXXXV'),
                                (1509, 'MDIX'),
                                (1607, 'MDCVII'),
                                (1754, 'MDCCLIV'),
                                (1832, 'MDCCCXXXII'),
                                (1993, 'MCMXCIII'),
                                (2074, 'MMLXXIV'),
                                (2152, 'MMCLII'),
                                (2212, 'MMCCXII'),
                                (2343, 'MMCCCXLIII'),
                                (2499, 'MMCDXCIX'),
                                (2574, 'MMDLXXIV'),
                                (2646, 'MMDCXLVI'),
                                (2723, 'MMDCCXXIII'),
                                (2892, 'MMDCCCXCII'),
                                (2975, 'MMCMLXXV'),
                                (3051, 'MMMLI'),
                                (3185, 'MMMCLXXXV'),
                                (3250, 'MMMCCL'),
                                (3313, 'MMMCCCXIII'),
                                (3408, 'MMMCDVIII'),
                                (3501, 'MMMDI'),
                                (3610, 'MMMDCX'),
                                (3743, 'MMMDCCXLIII'),
                                (3844, 'MMMDCCCXLIV'),
                                (3888, 'MMMDCCCLXXXVIII'),
                                (3940, 'MMMCMXL'),
                                (3999, 'MMMCMXCIX'))                        2
            
                def testToRomanKnownValues(self):                           3
                    """toRoman should give known result with known input"""
                    for integer, numeral in self.knownValues:              
                        result = roman.toRoman(integer)                     4 5
                        self.assertEqual(numeral, result)                   6
            1 編寫測試用例的第一步就是繼承 unittest 模塊中的 TestCase 類,它提供了很多可以用在你的測試用例中來測試特定情況的有用方法。
            2 這是我手工轉換的一個 integer/numeral 對列表。它包含了最小的十個數、最大的數、每個單字符羅馬數字對應的數,以及其他隨機挑選的有效數樣本。單元測試的關鍵不在于所有可能的輸入,而是一個有代表性的樣本。
            3 每個獨立測試本身都是一個方法,既不需要參數也不返回任何值。如果該方法正常退出沒有引發異常,測試被認為通過;如果測試引發異常,測試被認為失敗。
            4 這里你真正調用了 toRoman 函數。(當然,函數還沒有編寫,但一旦被編寫,這里便是調用之處。) 注意你在這里為 toRoman 函數定義了 API :它必須接受整數 (待轉換的數) 并返回一個字符串 (對應的羅馬數字表示),如果 API 不是這樣,測試將失敗。
            5 同樣值得注意,你在調用 toRoman 時沒有試圖捕捉任何可能發生的異常。這正是我們所希望的。以有效輸入調用 toRoman 不會引發任何異常,而你看到的這些輸入都是有效的。如果 toRoman 引發了異常,則測試失敗。
            6 假設 toRoman 函數被正確編寫,正確調用,運行成功并返回一個值,最后一步便是檢查這個返回值正確 與否。這是一個常見的問題,TestCase 類提供了一個方法:assertEqual,來測試兩個值是否相等。如果 toRoman 返回的結果 (value) 不等于我們預期的值 (numeral),assertEqual 將會引發一個異常,測試也就此失敗。如果兩個值相等,assertEqual 什么也不做。如果每個從 toRoman 返回的值都等于預期值,assertEqual 便不會引發異常,于是 testToRomanKnownValues 最終正常退出,這意味著 toRoman 通過了該測試。
            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线