最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python單元測試unittest實例詳解

 更新時間:2015年05月11日 11:13:17   作者:像風(fēng)一樣的自由  
這篇文章主要介紹了python單元測試unittest用法,以實例形式詳細(xì)分析了Python中單元測試的概念、用法與相關(guān)使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例講述了python單元測試unittest用法。分享給大家供大家參考。具體分析如下:

單元測試作為任何語言的開發(fā)者都應(yīng)該是必要的,因為時隔數(shù)月后再回來調(diào)試自己的復(fù)雜程序時,其實也是很崩潰的事情。雖然會很快熟悉內(nèi)容,但是修改和調(diào)試將是一件痛苦的事情,如果你在修改了代碼后出現(xiàn)問題的話,而單元測試可以幫助我們很快準(zhǔn)確的定位到問題的位置,出現(xiàn)問題的模塊和單元。所以這是一件很愉快的事情,因為我們知道其它修改或沒有修改的地方仍然是正常工作的,而我們目前的唯一問題就是搞定眼前這個有點問題的“家伙”。所以工作會在輕松中開始,并且很快將會結(jié)束,因為你已經(jīng)知道很多信息了。
 
單元測試自然是對程序中最小的可測試模塊--函數(shù)來進(jìn)行測試;因為單元測試的對象是函數(shù),也就是說你得被測試對象一定要有輸出結(jié)果,哪怕就是異常輸出,也得有輸出,以便單元測試模塊能夠捕獲返回值,并且與預(yù)期值進(jìn)行比較,從而得出測試通過與否。
 
單元測試的加載方式有2種:一種是通過unittest.main()來啟動單元測試的測試模塊;一種是添加到testsuite集合中再加載所有的被測試對象,而testsuit里存放的就是單元測試的用例,下面分別列出了2種方法的使用。

1.1 測試模塊中的函數(shù):

被測模塊:

#!/usr/bin/env python 
#encoding: utf-8 
def sum( x, y): 
    return x+y 
def sub( x, y): 
    return x-y

單元測試模塊:

#!/usr/bin/env python 
#encoding: utf-8 
import unittest 
import myclass 
class mytest(unittest.TestCase): 
  ##初始化工作 
  def setUp(self): 
    pass 
  #退出清理工作 
  def tearDown(self): 
    pass 
  #具體的測試用例,一定要以test開頭 
  def testsum(self): 
    self.assertEqual(myclass.sum(1, 2), 2, 'test sum fail') 
  def testsub(self): 
    self.assertEqual(myclass.sub(2, 1), 1, 'test sub fail')   
if __name__ =='__main__': 
  unittest.main()

測試結(jié)果:【F表示一個fail, F前的點表示一個通過,有E的話表示程序自身異?!?/p>

.F
======================================================================
FAIL: testsum (__main__.mytest)
----------------------------------------------------------------------
Traceback (most recent call last):
 File "C:\Users\xiaowu\workspace\mypython\unitTest.py", line 19, in testsum
  self.assertEqual(myclass.sum(1, 2), 2, 'test sum fail')
AssertionError: test sum fail
----------------------------------------------------------------------
Ran 2 tests in 0.001s 
FAILED (failures=1)

1.2 測試模塊類中的函數(shù):

被測模塊:

#!/usr/bin/env python
#encoding: utf-8
class myclass:
  def __init__(self):
    pass
  def sum(self, x, y):
    return x+y
  def sub(self, x, y):
    return x-y

單元測試模塊:

#!/usr/bin/env python 
#encoding: utf-8 
import unittest 
import myclass 
class mytest(unittest.TestCase): 
  ##初始化工作 
  def setUp(self): 
    self.tclass = myclass.myclass()
    ##實例化了被測試模塊中的類 
  #退出清理工作 
  def tearDown(self): 
    pass 
  #具體的測試用例,一定要以test開頭 
  def testsum(self): 
    self.assertEqual(self.tclass.sum(1, 2), 3) 
if __name__ =='__main__': 
  unittest.main()

運行結(jié)果:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK

這種方式執(zhí)行單個測試文件時使用-v參數(shù)可以獲得更多的測試結(jié)果信息。如:mytest.py -v 
 
2 加載測試套件

好吧,在運用測試套件進(jìn)行單元測試之前,我想還是稍微研究一下unittest模塊的內(nèi)容有哪些,其大概的運行方式是什么樣的。而后在給出根據(jù)各種情況如何制定單元測試套件。

首先,自然是查看unittest模塊有哪些成員啦!

>>import unittest 
>>dir(unittest) 
['FunctionTestCase', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult', 'Tes 
tSuite', 'TextTestRunner', '_CmpToKey', '_TextTestResult', '_WritelnDecorator', 
'__all__', '__author__', '__builtins__', '__doc__', '__email__', '__file__', '__ 
metaclass__', '__name__', '__package__', '__unittest', '__version__', '_makeLoad 
er', '_strclass', 'defaultTestLoader', 'findTestCases', 'getTestCaseNames', 'mai 
n', 'makeSuite', 'os', 'sys', 'time', 'traceback', 'types']

可以看到其自身的成員也不是很多,大概包括有:

['FunctionTestCase', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult',
 'TestSuite','TextTestRunner', '_CmpToKey', '_TextTestResult', '_WritelnDecorator',
 'defaultTestLoader','findTestCases', 'getTestCaseNames', 'main', 'makeSuite']

好吧,我們大概看看具體都是干什么的

>>memblist = ['FunctionTestCase', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult',\ 
'TestSuite','TextTestRunner', 'defaultTestLoader','findTestCases', 'getTestCaseNames', \ 
'main', 'makeSuite'] 
>>for memb in memblist: 
.. cur = getattr(unittest, memb) 
.. print help(cur)

'FunctionTestCase':函數(shù)測試用例,即給一個函數(shù)作為參數(shù),返回一個testcase實例,可選參數(shù)有set-up,tear-down方法
'TestCase':所有測試用例的基本類,給一個測試方法的名字,返回一個測試用例實例
'TestLoader':測試用例加載器,其包括多個加載測試用例的方法。返回一個測試套件
loadTestsFromModule(self, module)--根據(jù)給定的模塊實例來獲取測試用例套件
loadTestsFromName(self, name, module=None)
--根據(jù)給定的字符串來獲取測試用例套件,字符串可以是模塊名,測試類名,測試類中的測試方法名,或者一個可調(diào)用的是實例對象
這個實例對象返回一個測試用例或一個測試套件
loadTestsFromNames(self, names, module=None) --和上面功能相同,只不過接受的是字符串列表
loadTestsFromTestCase(self, testCaseClass)--根據(jù)給定的測試類,獲取其中的所有測試方法,并返回一個測試套件
'TestProgram':命令行進(jìn)行單元測試的調(diào)用方法,作用是執(zhí)行一個測試用例。其實unittest.main()方法執(zhí)行的就是這個命令,
而這個類實例時默認(rèn)加載當(dāng)前執(zhí)行的作為測試對象,
原型為 __init__(self, module='__main__', defaultTest=None, argv=None, testRunner=xx, testLoader=xx)
其中module='__main__'就是默認(rèn)加載自身
'TestResult':測試用例的結(jié)果保存實例,通常有測試框架調(diào)用
'TestSuite':組織測試用例的實例,支持測試用例的添加和刪除,最終將傳遞給testRunner進(jìn)行測試執(zhí)行
'TextTestRunner':進(jìn)行測試用例執(zhí)行的實例,其中Text的意思是以文本形式顯示測試結(jié)果。顯示測試名稱,即完成的測試結(jié)果,其過同執(zhí)行單元測試腳本時添加-v參數(shù)
'defaultTestLoader':其實就是TestLoader
'findTestCases', 'getTestCaseNames':這個2個就不用解釋了
'main': 其實就是TestProgram
'makeSuite':通常是由單元測試框架調(diào)用的,用于生產(chǎn)testsuite對象的實例
 
至此,我們知道了。其實整個單元測試框架的邏輯出來了。分三步走:第一步testloader根據(jù)傳入的參數(shù)獲得相應(yīng)的測試用例,即對應(yīng)具體的測試方法,
然后makesuite在把所有的測試用例組裝成testsuite,最后把testsiute傳給testrunner進(jìn)行執(zhí)行。
而我們通常執(zhí)行的unittest.main(),其實就是unittest.testprom方法,其執(zhí)行的功能就是上面分析的三步,在第一步中其傳入的參數(shù)是自身的模塊__main__;
在第二步中把自身模塊中的所有測試類中中的測試方法提取出來,并生成測試套件;最后再把測試套件傳遞給testrunner進(jìn)行具體的測試。

最后給出一個完整的單元測試組織代碼,把該代碼放到單元測試用例文件的同一個目錄后執(zhí)行該腳本,即可執(zhí)行所有的測試用例文件。

【測試用例文件必須為test開頭,如:testxxx.py, 當(dāng)然這個文件本身是一個單元測試的文件】

#!/usr/bin/env python
#encoding: utf-8
#該代碼源自深入python
import unittest
import myclass
import re
import os
import sys
def testAllinCurrent():
  path = os.path.abspath(os.path.dirname(sys.argv[0]))
  files = os.listdir(path)
  test = re.compile("test\.py{1}quot;, re.IGNORECASE)
  files = filter(test.search, files)
  filenameToModuleName = lambda f: os.path.splitext(f)[0]
  moduleNames = map(filenameToModuleName, files)
  modules = map(__import__, moduleNames)
  load = unittest.defaultTestLoader.loadTestsFromModule
  return unittest.TestSuite(map(load, modules))
if __name__ == "__main__":
  unittest.main(defaultTest="regressionTest")

希望本文所述對大家的Python程序設(shè)計有所幫助。

相關(guān)文章

  • Python+OpenCv制作證件圖片生成器的操作方法

    Python+OpenCv制作證件圖片生成器的操作方法

    這篇文章主要介紹了Python+OpenCv制作證件圖片生成器的操作方法,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • 計算Python Numpy向量之間的歐氏距離實例

    計算Python Numpy向量之間的歐氏距離實例

    這篇文章主要介紹了計算Python Numpy向量之間的歐氏距離實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python 串口讀寫的實現(xiàn)方法

    Python 串口讀寫的實現(xiàn)方法

    今天小編就為大家分享一篇Python 串口讀寫的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 關(guān)于adfuller函數(shù)返回值的參數(shù)說明與記錄

    關(guān)于adfuller函數(shù)返回值的參數(shù)說明與記錄

    這篇文章主要介紹了關(guān)于adfuller函數(shù)返回值的參數(shù)說明與記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python迭代器協(xié)議及for循環(huán)工作機制詳解

    Python迭代器協(xié)議及for循環(huán)工作機制詳解

    這篇文章主要介紹了Python迭代器協(xié)議及for循環(huán)工作機制詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • python os模塊和fnmatch模塊的使用介紹

    python os模塊和fnmatch模塊的使用介紹

    這篇文章主要介紹了python os模塊和fnmatch模塊的使用介紹,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Python實現(xiàn)base64編碼的圖片保存到本地功能示例

    Python實現(xiàn)base64編碼的圖片保存到本地功能示例

    這篇文章主要介紹了Python實現(xiàn)base64編碼的圖片保存到本地功能,涉及Python針對base64編碼解碼與圖形文件輸出保存相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • Python學(xué)習(xí)筆記之if語句的使用示例

    Python學(xué)習(xí)筆記之if語句的使用示例

    python的if語句和其他語言有些不同,它沒有用括號來表示代碼塊,而是使用縮進(jìn),現(xiàn)在乍聽一下你可能不太明白,所以下面這篇文章主要給大家介紹了關(guān)于Python學(xué)習(xí)筆記之if語句使用的相關(guān)資料,需要的朋友可以參考下。
    2017-10-10
  • Python切換pip安裝源的方法詳解

    Python切換pip安裝源的方法詳解

    眾所周知pip是Python中非常方便易用的安裝包管理器,但是在實際安裝中,卻是非常的慢,該如何解決呢?那么下面這篇文章就給大家介紹了Python切換pip安裝源的方法,文中介紹的很詳細(xì),對大家學(xué)習(xí)或者理解具有一定的參考借鑒價值,有需要的朋友們下面來一起看看吧。
    2016-11-11
  • 用Python編寫生成樹狀結(jié)構(gòu)的文件目錄的腳本的教程

    用Python編寫生成樹狀結(jié)構(gòu)的文件目錄的腳本的教程

    這篇文章主要介紹了用Python編寫生成樹狀結(jié)構(gòu)的文件目錄的腳本的教程,是一個利用os模塊下各函數(shù)的簡單實現(xiàn),需要的朋友可以參考下
    2015-05-05

最新評論

灌云县| 乐平市| 沾益县| 鄄城县| 汶上县| 衡东县| 玉树县| 井陉县| 耿马| 黄山市| 丽水市| 仙居县| 泌阳县| 长春市| 拜城县| 黄龙县| 黄骅市| 香格里拉县| 蒙城县| 黄石市| 石首市| 徐水县| 庆安县| 肥西县| 兴国县| 巴南区| 扬中市| 辰溪县| 闽清县| 青阳县| 淮滨县| 长丰县| 邵阳县| 区。| 黄浦区| 义乌市| 乐清市| 龙游县| 博客| 浦江县| 泸定县|