日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Python中的兩個測試工具

當我們在寫程序的時候,我們需要通過測試來驗證程序是否出錯或者存在問題,但是,編寫大量的測試來確保程序的每個細節(jié)都沒問題會顯得很繁瑣。在Python中,我們可以借助一些標準模塊來幫助我們自動完成測試過程,比如:

  •  unittest: 一個通用的測試框架;
  •  doctest: 一個更簡單的模塊,是為檢查文檔而設計的,但也非常適合用來編寫單元測試。

下面,筆者將會簡單介紹這兩個模塊在測試中的應用。

doctest

doctest模塊會搜索那些看起來像是python交互式會話中的代碼片段,然后嘗試執(zhí)行并驗證結果。下面我們以doctest.testmod為例,函數(shù)doctest.testmod會讀取模塊中的所有文檔字符串,查找看起來像是從交互式解釋器中摘取的示例,再檢查這些示例是否反映了實際情況。

我們先創(chuàng)建示例代碼文件test_string_lower.py,完整代碼如下:

 
 
 
  1. # -*- coding: utf-8 -*- 
  2. def string_lower(string): 
  3.     ''' 
  4.     返回一個字符串的小寫 
  5.     :param string: type: str 
  6.     :return: the lower of input string 
  7.     >>> string_lower('AbC') 
  8.     'abc' 
  9.     >>> string_lower('ABC') 
  10.     'abc' 
  11.     >>> string_lower('abc') 
  12.     'abc' 
  13.     ''' 
  14.     return string.lower() 
  15. if __name__ == '__main__': 
  16.     import doctest, test_string_lower 
  17.     doctest.testmod(test_string_lower)

首先先對程序進行說明,函數(shù)string_lower用于返回輸入字符串的小寫,函數(shù)中的注釋中,一共包含了3個測試實例,期望盡可能地包含各種測試情況,接著在主函數(shù)中導入doctest, test_string_lower,再運行doctest中的testmod函數(shù)即可進行測試。

接著,我們開始測試。首先,在命令行中輸入python test_string_lower.py,運行后會發(fā)現(xiàn)什么都沒有輸出,但這其實是件好事,它表明程序中的所有測試都通過了!那么,如果我們想要獲得更多的輸出呢?可在運行腳本的時候增加參數(shù)-v,這時候命令變成python test_string_lower.py -v,輸出的結果如下:

 
 
 
  1. Trying: 
  2.     string_lower('AbC') 
  3. Expecting: 
  4.     'abc' 
  5. ok 
  6. Trying: 
  7.     string_lower('ABC') 
  8. Expecting: 
  9.     'abc' 
  10. ok 
  11. Trying: 
  12.     string_lower('abc') 
  13. Expecting: 
  14.     'abc' 
  15. ok 
  16. 1 items had no tests: 
  17.     test_string_lower 
  18. 1 items passed all tests: 
  19.    3 tests in test_string_lower.string_lower 
  20. 3 tests in 2 items. 
  21. 3 passed and 0 failed. 
  22. Test passed.

可以看到,程序測試的背后還是發(fā)生了很多事。接著,我們嘗試著程序出錯的情況,比如我們不小心把函數(shù)的返回寫成了:

 
 
 
  1. return string.upper()

這其實是返回輸入字符串的大寫了,而我們測試的實例卻返回了輸入字符串的小寫,再運行該腳本(加上參數(shù)-v),輸出的結果如下:

 
 
 
  1. Failed example: 
  2.     string_lower('abc') 
  3. Expected: 
  4.     'abc' 
  5. Got: 
  6.     'ABC' 
  7. 1 items had no tests: 
  8.     test_string_lower 
  9. ********************************************************************** 
  10. 1 items had failures: 
  11.    3 of   3 in test_string_lower.string_lower 
  12. 3 tests in 2 items. 
  13. 0 passed and 3 failed. 
  14. ***Test Failed*** 3 failures.

這時候,程序測試失敗,它不僅捕捉到了bug,還清楚地指出錯誤出在什么地方。我們不難把這個程序修改過來。

關于doctest模塊的更詳細的使用說明,可以參考網(wǎng)址:https://docs.python.org/2/library/doctest.html 。

unittest

unittest類似于流行的Java測試框架JUnit,它比doctest更靈活,更強大,能夠幫助你以結構化的方式來編寫龐大而詳盡的測試集。

我們以一個簡單的示例入手,首先我們編寫my_math.py腳本,代碼如下:

 
 
 
  1. # -*- coding: utf-8 -*- 
  2. def product(x, y): 
  3.     ''' 
  4.     :param x: int, float 
  5.     :param y: int, float 
  6.     :return:  x * y 
  7.     ''' 
  8.     return x * y

該函數(shù)實現(xiàn)的功能為:輸入兩個數(shù)x, y, 返回這兩個數(shù)的乘積。接著是test_my_math.py腳本,完整的代碼如下:

 
 
 
  1. import unittest, my_math 
  2. class ProductTestcase(unittest.TestCase): 
  3.     def setUp(self): 
  4.         print('begin test') 
  5.     def test_integers(self): 
  6.         for x in range(-10, 10): 
  7.             for y in range(-10, 10): 
  8.                 p = my_math.product(x, y) 
  9.                 self.assertEqual(p, x*y, 'integer multiplication failed') 
  10.     def test_floats(self): 
  11.         for x in range(-10, 10): 
  12.             for y in range(-10, 10): 
  13.                 xx = x/10 
  14.                 yy = y/10 
  15.                 p = my_math.product(x, y) 
  16.                 self.assertEqual(p, x * y, 'integer multiplication failed') 
  17. if __name__ == '__main__': 
  18.     unittest.main()

函數(shù)unittest.main負責替你運行測試:在測試方法前執(zhí)行setUp方法,示例化所有的TestCase子類,并運行所有名稱以test打頭的方法。assertEqual方法檢車指定的條件(這里是相等),以判斷指定的測試是成功了還是失敗了。

接著,我們運行前面的測試,輸出的結果如下:

 
 
 
  1. begin test 
  2. .begin test 
  3. ---------------------------------------------------------------------- 
  4. Ran 2 tests in 0.001s 
  5. OK

可以看到,該程序運行了兩個測試,每個測試前都會輸出'begin test',.表示測試成功,若測試失敗,則返回的是F。

接著模擬測試出錯的情形,將my_math函數(shù)中的product方法改成返回:

 
 
 
  1. return x + y

再運行測試腳本,輸出的結果如下:

 
 
 
  1. begin test 
  2. Fbegin test 
  3. F
  4.  ====================================================================== 
  5. FAIL: test_floats (__main__.ProductTestcase) 
  6. ---------------------------------------------------------------------- 
  7. Traceback (most recent call last): 
  8.   File "test_my_math.py", line 20, in test_floats 
  9.     self.assertEqual(p, x * y, 'integer multiplication failed') 
  10. AssertionError: -2.0 != 1.0 : integer multiplication failed 
  11. ====================================================================== 
  12. FAIL: test_integers (__main__.ProductTestcase) 
  13. ---------------------------------------------------------------------- 
  14. Traceback (most recent call last): 
  15.   File "test_my_math.py", line 12, in test_integers 
  16.     self.assertEqual(p, x*y, 'integer multiplication failed') 
  17. AssertionError: -20 != 100 : integer multiplication failed 
  18. ---------------------------------------------------------------------- 
  19. Ran 2 tests in 0.001s 
  20. FAILED (failures=2)

兩條測試都未通過,返回的是F,并幫助你指出了錯誤的地方,接下來,你應該能快速地修復這個bug。

關于unittest模塊的更加詳細的說明,可以參考網(wǎng)址:https://docs.python.org/3/library/unittest.html 。

總結

本文介紹了兩個Python中的測試工具:doctest和unittest,并配以簡單的例子來說明這兩個測試模塊的使用方法,希望能對讀者有所幫助~


本文名稱:Python中的兩個測試工具
本文地址:http://www.5511xx.com/article/cooschg.html