<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### 4.3.5 自底向上實現與單元測試 自頂向下設計設計是創建層次化的模塊結構的過程,而從實現的角度看,我們又是采取了相反的過程,即自底向上的實現。從結構圖的底層開始實現每一個函數,然后上一層模塊 自然得到實現。就這樣自底向上,直至主程序得到完全的實現。 在模塊化編程中,測試程序最適合采用單元測試技術,即先分別測試每一個小模塊,然 后再逐步測試較大的模塊,直至最后測試完整程序。以 calendar 程序為例,當我們實現了 days(y,m)函數后,就應該來測試此函數是否能完成預定的功能——返回 y 年 m+1 月有多 少天。我們可以將 days(y,m)的定義存入一個模塊文件(假設文件名是 moduletest.py), 然后導入該文件并測試函數。下面是測試 days 函數的一個會話過程: ``` >>> from moduletest import days >>> days(1900,0) 31 >>> days(1900,1) 28 >>> days(1900,11) 31 >>> days(2000,1) 29 >>> days(2012,1) 29 >>> days(2012,10) 30 ``` 注意,測試時應當使測試數據盡量覆蓋所有關鍵情形。在我們的測試例子中,測試了合 法數據的邊界情形 1900 年 1 月,也測試了 1900 年 2 月(這個年份雖然能被 4 整除但卻不是閏年),還測試了 2000 年(能被 400 整除)是否閏年。所有測試結果都表明這個函數實現正 確。 單元測試技術獨立地測試每一個函數,這樣能更容易定位程序錯誤。如果較小模塊都正 確,那么由它們組成的較大模塊出現錯誤的可能性也就較小。最終測試完整程序時,就更有 希望通過測試。 最后,為了完整起見,我們將前面所有的代碼匯集起來列在下面。 【程序 4.8】calendar.py ``` # calendar.py def getYear(): print "This program prints the calendar of a given year." year = input("Please enter a year (after 1900): ") return year def firstDay(year): k = leapyears(year) n = (year - 1900) * 365 + k return (n + 1) % 7 def leapyears(year): count = 0 for y in range(1900,year): if y%4 == 0 and (y%100 != 0 or y%400 == 0): count = count + 1 return count def printCalendar(year,w): print print "=========== " + str(year) + " ==========" first = w for month in range(12): heading(month) first = oneMonth(year,month,first) def heading(m): months = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"] print " %s " % (months[m]) print "Mon Tue Wed Thu Fri Sat Sun" def oneMonth(year,month,first): d = days(year,month) frame = layout(first,d) printMonth(frame) return (first + d) % 7 def days(y,m): month_days = [31,28,31,30,31,30,31,31,30,31,30,31] d = month_days[m] if (m == 1) and (y%4 == 0 and (y%100 != 0 or y%400 == 0)): d = d + 1 return d def layout(first,d): frame = 42 * [""] if first == 0: first = 7 j = first - 1 for i in range(1,d+1): frame[j] = i j = j + 1 return frame def printMonth(frame): for i in range(42): print "%3s" % (frame[i]), if (i+1)%7 == 0: print def main(): year = getYear() w = firstDay(year) printCalendar(year,w) main() ``` 圖 4.11 顯示了本程序的一次運行結果,可見程序是正確的(注意 2012 是閏年)。當然, 輸出的日歷在格式上還可以美化,例如將兩三個月的日歷放在同一排上之類。讀者不妨自行 設計修改。 ![](https://box.kancloud.cn/2016-02-22_56cafcdfdec8f.png) 圖 4.11 calendar 程序的運行示例
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看