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

Python單元測(cè)試實(shí)例詳解

 更新時(shí)間:2018年05月25日 10:32:27   作者:止語(yǔ)---  
這篇文章主要介紹了Python單元測(cè)試,結(jié)合實(shí)例形式詳細(xì)分析了Python單元測(cè)試模塊的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Python單元測(cè)試。分享給大家供大家參考,具體如下:

在Python中進(jìn)行單元測(cè)試需要用到自動(dòng)單元測(cè)試框架PyUnit,Python2.1及其以后的版本都將PyUnit作為一個(gè)標(biāo)準(zhǔn)模塊(即python的unittest模塊),如果你很out,那么你需要從PyUnit網(wǎng)站下載源碼安裝后才能使用。

一、Python單元測(cè)試范例

測(cè)試最基本的原理是比較預(yù)期結(jié)果是否與實(shí)際執(zhí)行結(jié)果相同,如果相同則測(cè)試成功,否則測(cè)試失敗。為了更好地理解自動(dòng)測(cè)試框架PyUnit,下面會(huì)以對(duì)Widget類進(jìn)行測(cè)試為例說(shuō)明之:

#widget.py
#將要被測(cè)試的類Widget
class Widget:
  def __init__(self, size = (40, 40)):
    self._size = size
  def getSize(self):
    return self._size
  def resize(self, width, height):
    if width < 0 or height < 0:
      raise ValueError, "illegal size"
    self._size = (width, height)
  def dispose(self):
    pass

二、測(cè)試用例TestCase

軟件測(cè)試中最基本的組成單元式測(cè)試用例(test case),PyUnit使用TestCase類來(lái)表示測(cè)試用例,并要求所有用于執(zhí)行測(cè)試的類都必須從該類繼承。TestCase子類實(shí)現(xiàn)的測(cè)試代碼應(yīng)該是自包含的(self contained),即測(cè)試用例既可以單獨(dú)運(yùn)行,也可以和其它測(cè)試用例構(gòu)成集合共同運(yùn)行。TestCase類中常用的函數(shù)或方法有:

setUp:進(jìn)行測(cè)試前的初始化工作。
tearDown:執(zhí)行測(cè)試后的清除工作。
failedinfo:表示不成立打印信息faliedinfo,為可選參數(shù)。
self.assertEqual(value1, value2, failedinfo):會(huì)無(wú)條件的導(dǎo)致測(cè)試失敗,不推薦使用。
self.assertTrue(, failedinfo):斷言value1 == value2。
self.assertFalse(, failedinfo):斷言value為真。
self.assertRaises(ValueError, self.widget.resize, -1, -1):斷言肯定發(fā)生異常,如果沒(méi)發(fā)生異常,則為測(cè)試失敗。參數(shù)1為異常,參數(shù)2為拋出異常的調(diào)用對(duì)象,其余參數(shù)為傳遞給可調(diào)用對(duì)象的參數(shù)。
TestCase在PyUnit測(cè)試框架中被視為測(cè)試單元的運(yùn)行實(shí)體,Python程序員可以通過(guò)它派生自定義的測(cè)試過(guò)程與方法(測(cè)試單元),利用Command和Composite設(shè)計(jì)模式,多個(gè)TestCase還可以組合成測(cè)試用例集合。PyUnit測(cè)試框架在運(yùn)行一個(gè)測(cè)試用例時(shí),TestCase子類定義的setUp()、runTest()tearDown()方法被依次執(zhí)行,最簡(jiǎn)單的測(cè)試用例只需要覆蓋runTest()方法來(lái)執(zhí)行特定的測(cè)試代碼就可以了。

1、靜態(tài)方法

一個(gè)測(cè)試用例只對(duì)軟件模塊中一個(gè)方法進(jìn)行測(cè)試,采用覆蓋runTest()方法來(lái)構(gòu)造測(cè)試用例,這在PyUnit中稱之為靜態(tài)方法,舉例說(shuō)明如下:

#static.py
from widget import Widget
import unittest
#執(zhí)行測(cè)試的類
class WidgetTestCase(unittest.TestCase):
  def runTest(self):
    widget = Widget()
    self.assertEqual(widget.getSize(), (40, 40))
#測(cè)試
if __name__ == "__main__":
  testCase = WidgetTestCase()
  testCase.runTest()

如果采用靜態(tài)方法,Python程序員就不得不為每個(gè)要測(cè)試的方法編寫(xiě)一個(gè)測(cè)試類,該類通過(guò)覆蓋runTest()方法來(lái)執(zhí)行測(cè)試,并在每個(gè)測(cè)試類中生成一個(gè)待測(cè)試的對(duì)象,這樣會(huì)非常繁瑣與笨拙。

2、動(dòng)態(tài)方法

鑒于靜態(tài)方法的缺陷,PyUnit提供了另一種高帥富的解決方法,即動(dòng)態(tài)方法,只編寫(xiě)一個(gè)測(cè)試類來(lái)完成對(duì)整個(gè)軟件模塊的測(cè)試,這樣對(duì)象的初始化工作可以在setUp()方法中完成,而資源的釋放則可以在tearDown()方法中完成,舉例說(shuō)明如下:

#dynamic.py
from widget import Widget
import unittest
class WidgetTestCase(unittest.TestCase):
  def setUp(self):
    self.widget = Widget()
  def tearDown(self):
    self.widget.dispose()
    self.widget = None
  def testSize(self):
    self.assertEqual(self.widget.getSize(), (40, 40))
  def testResize(self):
    self.widget.resize(100, 100)
    self.assertEqual(self.widget.getSize(), (100, 100))

動(dòng)態(tài)方法不再覆蓋runTest()方法,而是為測(cè)試類編寫(xiě)多個(gè)測(cè)試方法,按照慣例這些方法通常以test開(kāi)頭但這不是必須的,在創(chuàng)建TestCase子類的實(shí)例時(shí)必須給出測(cè)試方法的名稱來(lái)為PyUnit測(cè)試框架指明運(yùn)行該測(cè)試用例時(shí)應(yīng)該調(diào)用測(cè)試類中的哪些方法,這通常會(huì)結(jié)合測(cè)試用例集TestSuite一起使用。

三、測(cè)試用例集TestSuite

完整的單元測(cè)試很少只執(zhí)行一個(gè)測(cè)試用例,開(kāi)發(fā)人員通常需要編寫(xiě)多個(gè)測(cè)試用例才能對(duì)某一軟件功能進(jìn)行比較完成的測(cè)試,這些相關(guān)的測(cè)試用例稱為一個(gè)測(cè)試用例集,在PyUnit中是用TestSuite類來(lái)表示的。PyUinit測(cè)試框架允許Python程序員在單元測(cè)試代碼中定義一個(gè)名為suite()的全局函數(shù),并將其作為整個(gè)單元測(cè)試的入口,PyUnit通過(guò)調(diào)用它來(lái)完成整個(gè)測(cè)試過(guò)程:

def suite():
  suite = unittest.TestSuite()
  suite.addTest(WidgetTestCase("testSize"))
  suite.addTest(WidgetTestCase("testResize"))
  return suite
    也可以直接定義一個(gè)TestSuite的子類,并在其初始化方法__init__中完成所有測(cè)試用例的添加:
class WidgetTestSuite(unittest.TestSuite)
  def __init__(self):
    unittest.TestSuite.__init__(self, map(WidgetTestCase, ("testSize", "testResize")))
    這樣只需要在suite()方法中返回該類的一個(gè)實(shí)例就可以了:
def suite():
  return WidgetTestSuite()

在PyUnit測(cè)試框架中,TestSuite類可以看成是TestCase類的一個(gè)容器,用來(lái)對(duì)多個(gè)測(cè)試用例進(jìn)行組織,這樣多個(gè)測(cè)試用例可以自動(dòng)在一次測(cè)試中全部完成。事實(shí)上,TestSuite除了可以包含TestCase外,也可以包含TestSuite,從而可以構(gòu)成一個(gè)更龐大的測(cè)試用例集:

suite1 = mysuite1.TheTestSuite()
suite2 = mysuite2.TheTestSuite()
alltests = unittest.TestSuite((suite1, suite2))

四、實(shí)施測(cè)試TestRunner

編寫(xiě)測(cè)試用例(TestCase)并將它們組織成測(cè)試用例集(TestSuite)的最終目的只有一個(gè):實(shí)施測(cè)試并獲得最終結(jié)果。PyUnit使用TestRunner類作為測(cè)試用例的基本執(zhí)行環(huán)境,來(lái)驅(qū)動(dòng)整個(gè)單元測(cè)試過(guò)程。但是Python開(kāi)發(fā)人員在進(jìn)行單元測(cè)試時(shí)一般不直接使用TestRunner類,而是使用其子類TextTestRunner來(lái)完成測(cè)試,并將測(cè)試結(jié)果以文本方式顯示出來(lái)。舉例說(shuō)明如下:

#text_runner.py
from widget import Widget
import unittest
#執(zhí)行測(cè)試的類
class WidgetTestCase(unittest.TestCase):
  def setUp(self):
    self.widget = Widget()
  def tearDown(self):
    self.widget.dispose()
    self.widget = None
  def testSize(self):
    self.assertEqual(self.widget.getSize(), (40, 40))
  def testResize(self):
    self.widget.resize(100, 100)
    self.assertEqual(self.widget.getSize(), (100, 100))
#測(cè)試
if __name__ == "__main__":
  #構(gòu)造測(cè)試集
  suite = unittest.TestSuite()
  suite.addTest(WidgetTestCase("testSize"))
  suite.addTest(WidgetTestCase("testResize"))
  #執(zhí)行測(cè)試
  runner = unittest.TextTestRunner()
  runner.run(suite)

使用如下命令執(zhí)行該單元測(cè)試:

$python text_runner.py

默認(rèn)情況下,TextTestRunner將結(jié)果輸出到sys.stdout/sys.stderr上,但是如果在創(chuàng)建TextTestRunner類實(shí)例時(shí)將一個(gè)文件對(duì)象傳遞給了構(gòu)造函數(shù),則輸出結(jié)果將被重定向到該文件中。

五、大道至簡(jiǎn)main()

PyUnit模塊中定義了一個(gè)名為main的全局方法,使用它可以很方便地將一個(gè)單元測(cè)試模塊變成可以直接運(yùn)行的測(cè)試腳本,main()方法使用TestLoader類來(lái)搜索所有包含在該模塊中的測(cè)試方法,并自動(dòng)執(zhí)行它們。如果Python程序員能夠按照約定(以test開(kāi)頭)來(lái)命令所有的測(cè)試方法,那么只需要在測(cè)試模塊的最后加入如下幾行代碼即可:

if __name__ == "__main__":
  unittest.main()

下面是利用main()方法來(lái)進(jìn)行測(cè)試的完整例子:

#main_runner.py
from widget import Widget
import unittest
#執(zhí)行測(cè)試的類
class WidgetTestCase(unittest.TestCase):
  def setUp(self):
    self.widget = Widget()
  def tearDown(self):
    self.widget.dispose()
    self.widget = None
  def testSize(self):
    self.assertEqual(self.widget.getSize(), (40, 40))
  def testResize(self):
    self.widget.resize(100, 100)
    self.assertEqual(self.widget.getSize(), (100, 100))
#測(cè)試
if __name__ == "__main__":
  unittest.main()

使用如下命令執(zhí)行上面的單元測(cè)試:

$python main_runner.py

如上這樣將執(zhí)行WidgetTestCase中的所有測(cè)試方法,但是如果只想執(zhí)行testSize()方法,則可以如下這般:

$python main_runner.py WidgetTestCase.testSize

如果在單元測(cè)試腳本中定義了TestSuite,還可以指定要運(yùn)行的測(cè)試集,使用-h參數(shù)可以查看運(yùn)行該腳本所有可能用到的參數(shù):

$python main_runner.py -h

需要注意的是:PyUnit的TestCase中如果有多個(gè)test_xxx,則默認(rèn)按照xxx的字母順序執(zhí)行測(cè)試用例函數(shù),如果test_xxx之間有依賴關(guān)系的話就會(huì)出錯(cuò),解決方法有二:1、解耦;2、編寫(xiě)xxx函數(shù)時(shí)人為地按字母順序。

當(dāng)然,如果你安裝了Python 2.7.2及以上版本,你還可以利用discover函數(shù)來(lái)自動(dòng)發(fā)現(xiàn)并執(zhí)行測(cè)試用例:

$python2.7 -m unittest discover

更多關(guān)于Python單元測(cè)試的資料可以參看這里,還有這里。

更多Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python入門(mén)與進(jìn)階經(jīng)典教程》、《Python字符串操作技巧匯總》、《Python列表(list)操作技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》及《Python文件與目錄操作技巧匯總

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

相關(guān)文章

  • 如何在Python函數(shù)執(zhí)行前后增加額外的行為

    如何在Python函數(shù)執(zhí)行前后增加額外的行為

    有的時(shí)候會(huì)需要在函數(shù)前后添點(diǎn)額外的功能(比如過(guò)濾、計(jì)時(shí)等)時(shí),以前總是首先想到裝飾器。最近學(xué)習(xí)了Python的上下文管理器,所以本文就給大家介紹了如何在Python函數(shù)執(zhí)行前后增加額外的行為,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-10-10
  • Python Web框架之Django框架文件上傳功能詳解

    Python Web框架之Django框架文件上傳功能詳解

    這篇文章主要介紹了Python Web框架之Django框架文件上傳功能,結(jié)合實(shí)例形式詳細(xì)分析了Django框架form表單基于ajax的文件上傳功能詳細(xì)操作技巧,需要的朋友可以參考下
    2019-08-08
  • 十道Python面試最常問(wèn)到的問(wèn)題

    十道Python面試最常問(wèn)到的問(wèn)題

    這篇文章主要介紹了十道Python面試最常問(wèn)到的問(wèn)題,都是基礎(chǔ)的面試題,包括函數(shù),修飾器,數(shù)據(jù)結(jié)構(gòu)等,需要的朋友可以參考下
    2023-04-04
  • 基于Python爬取51cto博客頁(yè)面信息過(guò)程解析

    基于Python爬取51cto博客頁(yè)面信息過(guò)程解析

    這篇文章主要介紹了基于Python爬取51cto博客頁(yè)面信息過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • python tkinter 設(shè)置窗口大小不可縮放實(shí)例

    python tkinter 設(shè)置窗口大小不可縮放實(shí)例

    這篇文章主要介紹了python tkinter 設(shè)置窗口大小不可縮放實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • DataFrame:通過(guò)SparkSql將scala類轉(zhuǎn)為DataFrame的方法

    DataFrame:通過(guò)SparkSql將scala類轉(zhuǎn)為DataFrame的方法

    今天小編就為大家分享一篇DataFrame:通過(guò)SparkSql將scala類轉(zhuǎn)為DataFrame的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • 分享四個(gè)python接口常用封裝函數(shù)

    分享四個(gè)python接口常用封裝函數(shù)

    這篇文章主要給大家分享的是分享四個(gè)python接口常用封裝函數(shù),文章基于python的相關(guān)資料展開(kāi)詳細(xì)的內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-04-04
  • Python語(yǔ)法分析之字符串格式化

    Python語(yǔ)法分析之字符串格式化

    這篇文章主要給大家介紹了關(guān)于Python語(yǔ)法分析之字符串格式化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Pytorch訓(xùn)練網(wǎng)絡(luò)過(guò)程中l(wèi)oss突然變?yōu)?的解決方案

    Pytorch訓(xùn)練網(wǎng)絡(luò)過(guò)程中l(wèi)oss突然變?yōu)?的解決方案

    這篇文章主要介紹了Pytorch訓(xùn)練網(wǎng)絡(luò)過(guò)程中l(wèi)oss突然變?yōu)?的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python通過(guò)Tesseract庫(kù)實(shí)現(xiàn)文字識(shí)別

    Python通過(guò)Tesseract庫(kù)實(shí)現(xiàn)文字識(shí)別

    這篇文章主要介紹了Python通過(guò)Tesseract庫(kù)實(shí)現(xiàn)文字識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論

迁安市| 元朗区| 兴宁市| 蕲春县| 崇义县| 金湖县| 绥棱县| 沁水县| 大田县| 开化县| 连城县| 共和县| 泸州市| 扶绥县| 福建省| 阿城市| 论坛| 读书| 遂平县| 安徽省| 饶平县| 扶余县| 多伦县| 丰都县| 宁蒗| 长兴县| 东莞市| 岳阳市| 台东县| 平乡县| 晋城| 济南市| 上杭县| 高清| 克东县| 福安市| 礼泉县| 贡觉县| 开封县| 阜新| 谢通门县|