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

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

新聞中心

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

當(dāng)我們?cè)趯懗绦虻臅r(shí)候,我們需要通過(guò)測(cè)試來(lái)驗(yàn)證程序是否出錯(cuò)或者存在問(wèn)題,但是,編寫大量的測(cè)試來(lái)確保程序的每個(gè)細(xì)節(jié)都沒(méi)問(wèn)題會(huì)顯得很繁瑣。在Python中,我們可以借助一些標(biāo)準(zhǔn)模塊來(lái)幫助我們自動(dòng)完成測(cè)試過(guò)程,比如:

  •  unittest: 一個(gè)通用的測(cè)試框架;
  •  doctest: 一個(gè)更簡(jiǎn)單的模塊,是為檢查文檔而設(shè)計(jì)的,但也非常適合用來(lái)編寫單元測(cè)試。

下面,筆者將會(huì)簡(jiǎn)單介紹這兩個(gè)模塊在測(cè)試中的應(yīng)用。

doctest

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

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

 
 
 
  1. # -*- coding: utf-8 -*- 
  2. def string_lower(string): 
  3.     ''' 
  4.     返回一個(gè)字符串的小寫 
  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)

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

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

 
 
 
  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.

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

 
 
 
  1. return string.upper()

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

 
 
 
  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.

這時(shí)候,程序測(cè)試失敗,它不僅捕捉到了bug,還清楚地指出錯(cuò)誤出在什么地方。我們不難把這個(gè)程序修改過(guò)來(lái)。

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

unittest

unittest類似于流行的Java測(cè)試框架JUnit,它比doctest更靈活,更強(qiáng)大,能夠幫助你以結(jié)構(gòu)化的方式來(lái)編寫龐大而詳盡的測(cè)試集。

我們以一個(gè)簡(jiǎn)單的示例入手,首先我們編寫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ù)實(shí)現(xiàn)的功能為:輸入兩個(gè)數(shù)x, y, 返回這兩個(gè)數(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負(fù)責(zé)替你運(yùn)行測(cè)試:在測(cè)試方法前執(zhí)行setUp方法,示例化所有的TestCase子類,并運(yùn)行所有名稱以test打頭的方法。assertEqual方法檢車指定的條件(這里是相等),以判斷指定的測(cè)試是成功了還是失敗了。

接著,我們運(yùn)行前面的測(cè)試,輸出的結(jié)果如下:

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

可以看到,該程序運(yùn)行了兩個(gè)測(cè)試,每個(gè)測(cè)試前都會(huì)輸出'begin test',.表示測(cè)試成功,若測(cè)試失敗,則返回的是F。

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

 
 
 
  1. return x + y

再運(yùn)行測(cè)試腳本,輸出的結(jié)果如下:

 
 
 
  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)

兩條測(cè)試都未通過(guò),返回的是F,并幫助你指出了錯(cuò)誤的地方,接下來(lái),你應(yīng)該能快速地修復(fù)這個(gè)bug。

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

總結(jié)

本文介紹了兩個(gè)Python中的測(cè)試工具:doctest和unittest,并配以簡(jiǎn)單的例子來(lái)說(shuō)明這兩個(gè)測(cè)試模塊的使用方法,希望能對(duì)讀者有所幫助~


文章標(biāo)題:Python中的兩個(gè)測(cè)試工具
當(dāng)前地址:http://m.5511xx.com/article/cooschg.html