python基礎教程總結14——測試

來源:互聯網
上載者:User

標籤:

1. 先測試,後編碼

  對程式的各個部分建立測試也是非常重要的(這也稱為單元測試)。測試驅動編程:Test-driven programming

1)精確的需求說明:

  程式設計的理念是以編寫測試程式開始,然後編寫可通過測試的程式。測試程式就是你的需求說明,它協助你在開發程式時不偏離需求
舉例:編寫一個模組,其中包括一個使用給定的寬和高計算長方形面積的函數。在開始編碼前,首先要編寫一個單元測試,其中包括帶有幾個答案已經清楚的例子:

 1 from area import rect_area 2  3 height = 3 4 width =4 5 correct_answer = 12 6 answer = rect_area(height, width) 7 if answer == correct_answer: 8     print ‘Test passed‘ 9 else:10     print ‘Test failed‘

 

2)為改變而計劃:

  自動化測試除了在編寫程式上給予巨大協助外,還可以避免在實施修改時增加錯誤

  代碼覆蓋度——coverage是測試知識中重要的部分。在運行測試的時候,有可能並沒有運行代碼的全部,即使在理想情況下也是這樣(理想的情況應該是運行程式的所有可能狀態,使用所有可能的輸入,但是這不太可能)。優秀的測試程式組的目標之一是擁有良好的覆蓋度,實現這個目標的方法之一是使用覆蓋度工具,它可以衡量在測試過程中實際啟動並執行代碼的百分比。目前還沒有可用的標準化覆蓋度工具,搜尋“Python測試覆蓋度”會找到一個些可用的工具。其中一個是trace.py程式

 

3)測試的4步:

  A:指出需要的新特性。可以先記錄下來,然後為其編寫一個測試
  B:編寫特性的概要代碼,這樣程式就可以運行而沒有任何文法等方面的錯誤,但是測試會失敗。看到測試失敗是很重要的,這樣就能確定測試可以失敗。如果測試代碼中出現    了錯誤,那麼就有可能不管出現任何情況,測試都會成功,這樣等於沒測試任何東西。再強調一遍:在試圖讓測試成功前,先要看到它失敗
  C:為特性的概要編寫虛設代碼(dummy code),能滿足測試要求就行。不用準確地實現功能,只要保證測試可以通過即可。這樣一來就可以保證在開發的時候總是通過測試了    (除了第一次運行測試的時候),甚至在最初實現功能時亦是如此
  D:現在重寫(或者重構,Refactor)代碼,這樣它就會做自己應該做的事,從而保證測試一直重構
  

2. 測試載入器

  標準庫中的模組可以協助我們自動完成測試過程:
     unitest:通用測試架構
     doctest:簡單一些的模組,是檢查文檔用的,但是對於編寫單元測試也很在行

1) doctest:互動式解譯器的會話可以是將文檔字串(docstring)寫入文檔的一種有用的形式。假如,假設我編寫了一個求數位平方的函數,並且在它的文檔字串中添加了一個例子:

 1 def square(x): 2     ‘‘‘ 3     Squares a number and returns the result. 4  5     >>> square(2) 6     4 7     >>> square(3) 8     9 9     ‘‘‘10     return x*x

文檔字串中也包括了一些文本。這和測試又有什麼關係?假設square函數定義在my_math模組(也就是叫做my_math.py的檔案)中。之後就可以在底部增加下面的代碼:

 1 def square(x): 2     ‘‘‘ 3     Squares a number and returns the result. 4  5     >>> square(2) 6     4 7     >>> square(3) 8     9 9     ‘‘‘10     return x*x11 12 if __name__ == ‘__main__‘:13     import doctest.my_math14     doctest.testmod(my_math)

  doctest.testmod函數從一個模組讀取所有文檔字串,找出所有看起來像是在互動式解譯器中輸入的例子的文本,之後檢查例子是否符合執行個體要求(如果想實踐“先測試,後編碼”的編程方式,unittest架構是更好的選擇)

  為了獲得更多輸入,可以為指令碼設定-v(意為verbose,即詳述)選項開關:$ python my_math.py -v

 

2)unittest:doctest簡單易用,unittest(基於Java的流行測試架構JUnit)則更靈活和強大。  

  假設要寫模組my_math,其中包括計算乘積的函數product。從哪開始呢?對於測試來說,當然(位於檔案test_my_math.py中)是使用unittest模組中的TestCase類

 

 1 #使用unittest架構的簡單測試 2 import unittest, my_math 3  4 class ProductTestCase(unittest.TestCase): 5  6     def testIntegers(self): 7         for x in range(-10,10): 8             for y in range(-10,10): 9                 p = my_math.product(x,y)10                 self.failUnless(p == x*y, ‘Tnteger multiplication failed‘)11 12 13     def testFloats(self):14         for x in range(-10,10):15             for y in range(-10,10):16                 x = x/10.017                 y = y/10.018                 p = my_math.product(x,y)19             self.failUnless(p == x*y, ‘Float multiplication failed‘)20 21 #unittest.main函數負責運行測試,它會執行個體化所有TestCase的子類,運行所有名字以test開頭的方法22 if __name__ == ‘__main__‘ : unitteset.main()

  如果定義了叫做startUp和tearDown的方法,它們就會在運行每個測試方法之前和之後執行,這樣就可以用這些方法為所有測試提供一般的初始化和清理代碼,這被稱為測試夾具(test fixture)

 

3:單元測試以外的東西:
  原始碼檢查和分析:原始碼檢查是一種尋找代碼中普通錯誤或者問題的方法(有點像編譯器處理靜態語言,但遠不如此)。分析則是查明程式到底跑多快的方法。之所以按照這個順序討論這章的主題,是因為黃金法則“使其工作、使其更好、使其更快”的緣故。單元測試可以讓程式可以工作,原始碼檢查可以讓程式更好,最後,分析會讓程式更快。

1)使用PyChecker和PyLint檢查原始碼

2)分析:試圖讓代碼提速前,有個非常重要的規則需要注意(以及KISS原則,Keep It Small and Simple,即讓它小且簡單,或者YAGNI原則,You Ain‘t Gonna Need It,即並不需要它)——不成熟的最佳化是萬惡之源
  拿Unix的發明人之一Ken Thompson的話說就是“拿不準的時候,就窮舉”。換句話說,如果不是特別需要的話,就不要在精巧的演算法或者漂亮的最佳化技巧上有過多的擔心。如果程式已經夠快了,那麼乾淨、簡單並且易懂的代碼的價值比稍微快一點的程式要高得多。

  如果必須進行最佳化的話,那麼絕對應該再做其他事情之前對其進行分析(profile)。這是因為很難估計到瓶頸在哪裡,除非你的程式非常簡單。標準庫中已經包含了一個叫做profile的分析模組(還有個更快的嵌入式C語言版本,叫hotshot)。流量分析程式非常簡單,是要使用字串參數調用它的run方法就行了

>>> import profile>>> from my_math import product>>> profile.run(‘product(1,2)‘)

  這樣做會列印出資訊,其中包括各個函數和方法調用的次數,以及每個函數所花費的時間。如果提供了檔案名稱,比如‘my_math.profile‘作為第二個參數來運行,那麼結果就會儲存到檔案中。可在之後使用pastats模組檢查分析結果:

>>> import pstats>>> p = pstats.Stats(‘my_math.profile‘)

標準庫中還包含一個名為timeit的模組,它是測試python小程式碼片段已耗用時間的簡單方法

python基礎教程總結14——測試

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.