欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Python中進(jìn)行自動(dòng)化單元測(cè)試的教程

 更新時(shí)間:2015年04月15日 09:49:57   投稿:goldensun  
這篇文章主要介紹了在Python中進(jìn)行自動(dòng)化單元測(cè)試的教程,本文來(lái)自于IBM官方文檔,需要的朋友可以參考下

一、軟件測(cè)試

大型軟件系統(tǒng)的開(kāi)發(fā)是一個(gè)很復(fù)雜的過(guò)程,其中因?yàn)槿说囊蛩囟a(chǎn)生的錯(cuò)誤非常多,因此軟件在開(kāi)發(fā)過(guò)程必須要有相應(yīng)的質(zhì)量保證活動(dòng),而軟件測(cè)試則是保證質(zhì)量的關(guān)鍵措施。正像軟件熵(software entropy)所描述的那樣:一個(gè)程序從設(shè)計(jì)很好的狀態(tài)開(kāi)始,隨著新的功能不斷地加入,程序逐漸地失去了原有的結(jié)構(gòu),最終變成了一團(tuán)亂麻(其實(shí)最初的"很好的狀態(tài)"得加個(gè)問(wèn)號(hào))。測(cè)試的目的說(shuō)起來(lái)其實(shí)很簡(jiǎn)單也極具吸引力,那就是寫(xiě)出高質(zhì)量的軟件并解決軟件熵這一問(wèn)題。

可惜的是,軟件開(kāi)發(fā)人員很少能在編碼的過(guò)程中就進(jìn)行軟件測(cè)試,大部分軟件項(xiàng)目都只在最終驗(yàn)收時(shí)才進(jìn)行測(cè)試,有些項(xiàng)目甚至根本沒(méi)有測(cè)試計(jì)劃!隨著軟件質(zhì)量意識(shí)的增強(qiáng),許多軟件開(kāi)發(fā)組織開(kāi)始轉(zhuǎn)向UML、CMM、RUP、XP等軟件工程方法,以期提高軟件質(zhì)量,并使軟件開(kāi)發(fā)過(guò)程更加可控,好在這些方法對(duì)測(cè)試都提出了很?chē)?yán)格的要求,從而使得測(cè)試在軟件開(kāi)發(fā)過(guò)程的作用開(kāi)始真正體現(xiàn)出來(lái)。

軟件測(cè)試作為一種系統(tǒng)工程,涉及到整個(gè)軟件開(kāi)發(fā)過(guò)程的各個(gè)方面,需要管理人員、設(shè)計(jì)人員、開(kāi)發(fā)人員和測(cè)試人員的共同努力。作為軟件開(kāi)發(fā)過(guò)程中的主要力量,現(xiàn)今的程序員除了要編寫(xiě)實(shí)現(xiàn)代碼外,還承擔(dān)著單元測(cè)試這一艱巨任務(wù),因此必須采用新的工作模式:

  •     編寫(xiě)和維護(hù)一套詳盡的單元測(cè)試用例;
  •     先構(gòu)造單元測(cè)試和驗(yàn)收測(cè)試用例,然后再編寫(xiě)代碼;
  •     根據(jù)構(gòu)造的測(cè)試用例來(lái)編寫(xiě)代碼。

單元測(cè)試負(fù)責(zé)對(duì)最小的軟件設(shè)計(jì)單元(模塊)進(jìn)行驗(yàn)證,它使用軟件設(shè)計(jì)文檔中對(duì)模塊的描述作為指南,對(duì)重要的程序分支進(jìn)行測(cè)試以發(fā)現(xiàn)模塊中的錯(cuò)誤。由于軟件模塊并不是一個(gè)單獨(dú)的程序,為了進(jìn)行單元測(cè)試還必須編寫(xiě)大量額外的代碼,從而無(wú)形中增加了開(kāi)發(fā)人員的工作量,目前解決這一問(wèn)題比較好的方法是使用測(cè)試框架。測(cè)試框架是在用XP方法進(jìn)行單元測(cè)試時(shí)的關(guān)鍵,尤其是在需要構(gòu)造大量測(cè)試用例時(shí)更是如此,因?yàn)槿绻耆揽渴止さ姆绞絹?lái)構(gòu)造和執(zhí)行這些測(cè)試,肯定會(huì)變成一個(gè)花費(fèi)大量時(shí)間并且單調(diào)無(wú)味的工作,而測(cè)試框架則可以很好地解決這些問(wèn)題。

使用Python語(yǔ)言的開(kāi)發(fā)人員可以使用Steve Purcell編寫(xiě)的PyUnit作為單元測(cè)試框架,通過(guò)將單元測(cè)試融合到PyUnit這一測(cè)試框架里,Python程序員可以更容易地增加、管理、執(zhí)行測(cè)試用例,并對(duì)測(cè)試結(jié)果進(jìn)行分析。此外,使用PyUnit還可以實(shí)現(xiàn)自動(dòng)單元測(cè)試(回歸測(cè)試)。

二、規(guī)范Python單元測(cè)試

測(cè)試是一個(gè)貫穿于整個(gè)開(kāi)發(fā)過(guò)程的連續(xù)過(guò)程,從某個(gè)意義上說(shuō),軟件開(kāi)發(fā)的過(guò)程實(shí)際上就是測(cè)試過(guò)程。正如Martin Fowler所說(shuō)的"在你不知道如何測(cè)試代碼之前,就不該編寫(xiě)程序。而一旦你完成了程序,測(cè)試代碼也應(yīng)該完成。除非測(cè)試成功,你不能認(rèn)為你編寫(xiě)出了可以工作的程序。"

測(cè)試最基本的原理就是比較預(yù)期結(jié)果是否與實(shí)際執(zhí)行結(jié)果相同,如果相同則測(cè)試成功,否則測(cè)試失敗。為了更好地理解PyUnit這一自動(dòng)測(cè)試框架的作用,先來(lái)看一個(gè)簡(jiǎn)單的例子,假設(shè)我們要對(duì)例1中的Widget類(lèi)進(jìn)行測(cè)試:

        例1. widget.py

# 將要被測(cè)試的類(lèi)
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

采用手工方式進(jìn)行單元測(cè)試的Python程序員很可能會(huì)寫(xiě)出類(lèi)似例2的測(cè)試代碼來(lái),

    例2. manual.py

from widget import Widget
# 執(zhí)行測(cè)試的類(lèi)
class TestWidget:
  def testSize(self):
    expectedSize = (40, 40);
    widget = Widget()
    if widget.getSize() == expectedSize:
      print "test [Widget]: getSize works perfected!"
    else:
      print "test [Widget]: getSize doesn't work!"
# 測(cè)試
if __name__ == '__main__':
  myTest = TestWidget()
  myTest.testSize()

稍一留心你不難發(fā)現(xiàn)這種手工測(cè)試方法存在許多問(wèn)題。首先,測(cè)試程序的寫(xiě)法沒(méi)有一定的規(guī)范可以遵循,十個(gè)程序員完全可能寫(xiě)出十種不同的測(cè)試程序來(lái),如果每個(gè)Python程序員都有自己不同的設(shè)計(jì)測(cè)試類(lèi)的方法,光維護(hù)被測(cè)試的類(lèi)就夠麻煩了,誰(shuí)還顧得上維護(hù)測(cè)試類(lèi)。其次,需要編寫(xiě)大量的輔助代碼才能進(jìn)行單元測(cè)試,例1中用于測(cè)試的代碼甚至比被測(cè)試的代碼還要多,而這毫無(wú)疑問(wèn)將增大Python程序員的工作量。

為了讓單元測(cè)試代碼能夠被測(cè)試和維護(hù)人員更容易地理解,最好的解決辦法是讓開(kāi)發(fā)人員遵循一定的規(guī)范來(lái)編寫(xiě)用于測(cè)試的代碼,具體到Python程序員來(lái)講,則是要采用PyUnit這一自動(dòng)測(cè)試框架來(lái)構(gòu)造單元測(cè)試用例。目前PyUnit已經(jīng)得到了大多數(shù)Python開(kāi)發(fā)人員的認(rèn)可,成了事實(shí)上的單元測(cè)試標(biāo)準(zhǔn)。如果采用PyUnit來(lái)進(jìn)行同樣的測(cè)試,則測(cè)試代碼將如例3所示:

    例3. auto.py

from widget import Widget
import unittest
# 執(zhí)行測(cè)試的類(lèi)
class WidgetTestCase(unittest.TestCase):
  def setUp(self):
    self.widget = Widget()
  def tearDown(self):
    self.widget = None
  def testSize(self):
    self.assertEqual(self.widget.getSize(), (40, 40))
# 構(gòu)造測(cè)試集
def suite():
  suite = unittest.TestSuite()
  suite.addTest(WidgetTestCase("testSize"))
  return suite
# 測(cè)試
if __name__ == "__main__":
  unittest.main(defaultTest = 'suite')

在采用PyUnit這一單元測(cè)試框架后,用于測(cè)試的代碼做了相應(yīng)的改動(dòng):

  •     用import語(yǔ)句引入unittest模塊。
  •     讓所有執(zhí)行測(cè)試的類(lèi)都繼承于TestCase類(lèi),可以將TestCase看成是對(duì)特定類(lèi)進(jìn)行測(cè)試的方法的集合。
  •     在setUp()方法中進(jìn)行測(cè)試前的初始化工作,并在tearDown()方法中執(zhí)行測(cè)試后的清除工作,setUp()和tearDown()都是TestCase類(lèi)中定義的方法。
  •     在testSize()中調(diào)用assertEqual()方法,對(duì)Widget類(lèi)中g(shù)etSize()方法的返回值和預(yù)期值進(jìn)行比較,確保兩者是相等的,assertEqual()也是TestCase類(lèi)中定義的方法。
  •     提供名為suite()的全局方法,PyUnit在執(zhí)行測(cè)試的過(guò)程調(diào)用suit()方法來(lái)確定有多少個(gè)測(cè)試用例需要被執(zhí)行,可以將TestSuite看成是包含所有測(cè)試用例的一個(gè)容器。

雖然看起來(lái)有點(diǎn)復(fù)雜,但PyUnit使得所有的Python程序員都可以使用同樣的單元測(cè)試方法,測(cè)試過(guò)程不再是雜亂無(wú)章的了,而是在同一規(guī)范指導(dǎo)下進(jìn)行的有序行為,這就是使用PyUnit這一自動(dòng)單元測(cè)試框架所帶來(lái)的最大好處。

三、自動(dòng)測(cè)試框架PyUnit

在對(duì)軟件測(cè)試?yán)碚摵蚉yUnit有了一個(gè)大致了解之后,下面輔以具體的實(shí)例介紹Python程序員如何借助PyUnit來(lái)進(jìn)行單元測(cè)試。所有的代碼均在Python 2.2.2下調(diào)試通過(guò),操作系統(tǒng)使用的是Red Hat Linux 9。

3.1 安裝

在Python中進(jìn)行單元測(cè)試時(shí)需要用到PyUnit模塊,Python 2.1及其以后的版本都將PyUnit作為一個(gè)標(biāo)準(zhǔn)模塊,但如果你使用的是較老版本的Python,那就要自已動(dòng)手安裝了。在PyUnit的網(wǎng)站(http://sourceforge.net/projects/pyunit)上可以下載到PyUnit最新的源碼包,此處使用的是pyunit-1.4.1.tar.gz。

在下載好PyUnit軟件包后,執(zhí)行下面的命令對(duì)其進(jìn)行解壓縮:

[root@gary source]# tar xzvf pyunit-1.4.1.tar.gz

要在Python程序中使用PyUnit模塊,最簡(jiǎn)單的辦法是確保PyUni軟件包中的文件unittest.py和unittestgui.py都包含在Python的搜索路徑中,這既可以通過(guò)直接設(shè)置PYTHONPATH環(huán)境變量來(lái)實(shí)現(xiàn),也可以執(zhí)行以下的命令來(lái)將它們復(fù)制到Python的當(dāng)前搜索路徑中:

[root@gary source]# cd pyunit-1.4.1
[root@gary pyunit-1.4.1]# python setup.py install

3.2 測(cè)試用例TestCase

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

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子類(lèi)定義的setUp()、runTest()和tearDown()方法被依次執(zhí)行,最簡(jiǎn)單的測(cè)試用例只需覆蓋runTest()方法來(lái)執(zhí)行特定的測(cè)試代碼就可以了,如例4所示:

        例4. static_single.py

import unittest
# 執(zhí)行測(cè)試的類(lèi)
class WidgetTestCase(unittest.TestCase):
  def runTest(self):
    widget = Widget()
    self.assertEqual(widget.getSize(), (40, 40))

而要在PyUnit測(cè)試框架中構(gòu)造上述WidgetTestCase類(lèi)的一個(gè)實(shí)例,應(yīng)該不帶任何參數(shù)調(diào)用其構(gòu)造函數(shù):

testCase = WidgetTestCase()

一個(gè)測(cè)試用例通常只對(duì)軟件模塊中的一個(gè)方法進(jìn)行測(cè)試,采用覆蓋runTest()方法來(lái)構(gòu)造測(cè)試用例在PyUnit中稱(chēng)為靜態(tài)方法,如果要對(duì)同一個(gè)軟件模塊中的多個(gè)方法進(jìn)行測(cè)試,通常需要構(gòu)造多個(gè)執(zhí)行測(cè)試的類(lèi),如例5所示:

        例5. static_multi.py

import unittest
# 測(cè)試getSize()方法的測(cè)試用例
class WidgetSizeTestCase(unittest.TestCase):
  def runTest(self):
    widget = Widget()
    self.assertEqual(widget.getSize(), (40, 40))
# 測(cè)試resize()方法的測(cè)試用例
class WidgetResizeTestCase(unittest.TestCase):
  def runTest(self):
    widget = Widget()
    widget.resize(100, 100)
    self.assertEqual(widget.getSize(), (100, 100))

采用靜態(tài)方法,Python程序員不得不為每個(gè)要測(cè)試的方法編寫(xiě)一個(gè)測(cè)試類(lèi)(該類(lèi)通過(guò)覆蓋runTest()方法來(lái)執(zhí)行測(cè)試),并在每一個(gè)測(cè)試類(lèi)中生成一個(gè)待測(cè)試的對(duì)象。在為同一個(gè)軟件模塊編寫(xiě)測(cè)試用例時(shí),很多時(shí)候待測(cè)對(duì)象有著相同的初始狀態(tài),因此采用上述方法的Python程序員不得不在每個(gè)測(cè)試類(lèi)中為待測(cè)對(duì)象進(jìn)行同樣的初始化工作,而這往往是一項(xiàng)費(fèi)時(shí)且枯燥的工作。

一種更好的解決辦法是采用PyUnit提供的動(dòng)態(tài)方法,只編寫(xiě)一個(gè)測(cè)試類(lèi)來(lái)完成對(duì)整個(gè)軟件模塊的測(cè)試,這樣對(duì)象的初始化工作可以在setUp()方法中完成,而資源的釋放則可以在tearDown()方法中完成,如例6所示:

        例6. dynamic.py

import unittest
# 執(zhí)行測(cè)試的類(lèi)
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)方法最大的好處是測(cè)試類(lèi)的結(jié)構(gòu)非常好,用于測(cè)試一個(gè)軟件模塊的所有代碼都可以在同一個(gè)類(lèi)中實(shí)現(xiàn)。動(dòng)態(tài)方法不再覆蓋runTest()方法,而是為測(cè)試類(lèi)編寫(xiě)多個(gè)測(cè)試方法(按習(xí)慣這些方法通常以test開(kāi)頭),在創(chuàng)建TestCase子類(lèi)的實(shí)例時(shí)必須給出測(cè)試方法的名稱(chēng),來(lái)為PyUnit測(cè)試框架指明運(yùn)行該測(cè)試用例時(shí)究竟應(yīng)該調(diào)用測(cè)試類(lèi)中的哪個(gè)方法:

sizeTestCase = WidgetTestCase("testSize")
resizeTestCase = WidgetTestCase("testResize")

3.3 測(cè)試用例集TestSuite

完整的單元測(cè)試很少只執(zhí)行一個(gè)測(cè)試用例,開(kāi)發(fā)人員通常都需要編寫(xiě)多個(gè)測(cè)試用例才能對(duì)某一軟件功能進(jìn)行比較完整的測(cè)試,這些相關(guān)的測(cè)試用例稱(chēng)為一個(gè)測(cè)試用例集,在PyUnit中是用TestSuite類(lèi)來(lái)表示的。

在創(chuàng)建了一些TestCase子類(lèi)的實(shí)例作為測(cè)試用例之后,下一步要做的工作就是用TestSuit類(lèi)來(lái)組織它們。PyUnit測(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的子類(lèi),并在其初始化方法(__init__)中完成所有測(cè)試用例的添加:

                        class WidgetTestSuite(unittest.TestSuite):
  def __init__(self):
    unittest.TestSuite.__init__(self, map(WidgetTestCase,
                       ("testSize",
                        "testResize")))

這樣只需要在suite()方法中返回該類(lèi)的一個(gè)實(shí)例就可以了:

  def suite():
  return WidgetTestSuite()

如果用于測(cè)試的類(lèi)中所有的測(cè)試方法都以test開(kāi),Python程序員甚至可以用PyUnit模塊提供的makeSuite()方法來(lái)構(gòu)造一個(gè)TestSuite:

  def suite():
  return unittest.makeSuite(WidgetTestCase, "test")

在PyUnit測(cè)試框架中,TestSuite類(lèi)可以看成是TestCase類(lèi)的一個(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))

3.4 實(shí)施測(cè)試

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

runner = unittest.TextTestRunner()
runner.run(suite)

使用TestRunner來(lái)實(shí)施測(cè)試的例子如例7所示,

    例7. text_runner.py

from widget import Widget
import unittest
# 執(zhí)行測(cè)試的類(lèi)
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è)試,可以使用如下命令:

[xiaowp@gary code]$ python text_runner.py

運(yùn)行結(jié)果應(yīng)該如下所示,表明執(zhí)行了2個(gè)測(cè)試用例,并且兩者都通過(guò)了測(cè)試:

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK

如果對(duì)數(shù)據(jù)進(jìn)行修改,模擬出錯(cuò)的情形,將會(huì)得到如下結(jié)果:

.F
==========================================
FAIL: testResize (__main__.WidgetTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
 File "text_runner.py", line 15, in testResize
  self.assertEqual(self.widget.getSize(), (200, 100))
 File "/usr/lib/python2.2/unittest.py", line 286, in failUnlessEqual
  raise self.failureException, \
AssertionError: (100, 100) != (200, 100)
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1)

默認(rèn)情況下,TextTestRunner將結(jié)果輸出到sys.stderr上,但如果在創(chuàng)建TextTestRunner類(lèi)實(shí)例時(shí)將一個(gè)文件對(duì)象傳遞給了構(gòu)造函數(shù),則輸出結(jié)果將被重定向到該文件中。在Python的交互環(huán)境中驅(qū)動(dòng)單元測(cè)試時(shí),使用TextTestRunner類(lèi)是一個(gè)不錯(cuò)的選擇。

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

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

使用main()方法來(lái)實(shí)施測(cè)試的例子如例8所示,

    例8. main_runner.py

from widget import Widget
import unittest
# 執(zhí)行測(cè)試的類(lèi)
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è)試,可以使用如下命令:

[xiaowp@gary code]$ python main_runner.py

測(cè)試類(lèi)WidgetTestCase中的所有測(cè)試方法都將被自動(dòng)執(zhí)行,但如果只想執(zhí)行testSize()方法,可以使用如下命令:

[xiaowp@gary code]$ python main_runner.py WidgetTestCase.testSize

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

[xiaowp@gary code]$ python main_runner.py -h

為了使單元測(cè)試更具親合力,PyUnit軟件包中還提供了一個(gè)圖形界面測(cè)試腳本unittestgui.py,將其復(fù)制到當(dāng)前目錄后,可以執(zhí)行下面的命令來(lái)啟動(dòng)該測(cè)試工具,對(duì)main_runner.py腳本中的所有測(cè)試用例進(jìn)行測(cè)試:

[xiaowp@gary code]$ python unittestgui.py main_runner

該測(cè)試工具動(dòng)行時(shí)的界面如圖1所示:

201541593504100.png (375×342)

圖1. 圖形測(cè)試工具

單擊Start按鈕可以開(kāi)始執(zhí)行所有測(cè)試用例,測(cè)試結(jié)果將如圖2所示:

201541593730394.png (375×342)

圖2 測(cè)試結(jié)果

使用圖形界面可以更好地進(jìn)行單元測(cè)試,查詢(xún)測(cè)試結(jié)果也更加方便。PyUnit對(duì)于沒(méi)有通過(guò)的測(cè)試會(huì)進(jìn)行區(qū)分,指明它是失?。╢ailure)還是錯(cuò)誤(error),失敗是被assert類(lèi)方法(如assertEqual)檢查到的預(yù)期結(jié)果,而錯(cuò)誤則是由意外情況所引起的。

四、小結(jié)

測(cè)試是保證軟件質(zhì)量的關(guān)鍵,新的軟件開(kāi)發(fā)方法要求程序員在編寫(xiě)代碼前先編寫(xiě)測(cè)試用例,并在軟件開(kāi)發(fā)過(guò)程中不斷地進(jìn)行單元測(cè)試,從而最大限度地減少缺陷(Bug)的產(chǎn)生。軟件單元測(cè)試是XP方法的基石,測(cè)試框架為程序員進(jìn)行單元測(cè)試提供了統(tǒng)一的規(guī)范,Python程序員可以使用PyUnit作為軟件開(kāi)發(fā)過(guò)程中的自動(dòng)單元測(cè)試框架。

相關(guān)文章

  • PyTorch一小時(shí)掌握之神經(jīng)網(wǎng)絡(luò)分類(lèi)篇

    PyTorch一小時(shí)掌握之神經(jīng)網(wǎng)絡(luò)分類(lèi)篇

    這篇文章主要介紹了PyTorch一小時(shí)掌握之神經(jīng)網(wǎng)絡(luò)分類(lèi)篇,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Python的消息隊(duì)列包SnakeMQ使用初探

    Python的消息隊(duì)列包SnakeMQ使用初探

    使用消息隊(duì)列在數(shù)據(jù)的通信中擁有很多優(yōu)點(diǎn),SnakeMQ是一個(gè)開(kāi)源的用Python實(shí)現(xiàn)的跨平臺(tái)MQ庫(kù),well,Python的消息隊(duì)列包SnakeMQ使用初探,here we go:
    2016-06-06
  • Tensorflow中k.gradients()和tf.stop_gradient()用法說(shuō)明

    Tensorflow中k.gradients()和tf.stop_gradient()用法說(shuō)明

    這篇文章主要介紹了Tensorflow中k.gradients()和tf.stop_gradient()用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • python爬蟲(chóng)搭配起B(yǎng)ilibili唧唧的流程分析

    python爬蟲(chóng)搭配起B(yǎng)ilibili唧唧的流程分析

    這篇文章主要介紹了python爬蟲(chóng)搭配起B(yǎng)ilibili唧唧的流程分析,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Python 音頻生成器的實(shí)現(xiàn)示例

    Python 音頻生成器的實(shí)現(xiàn)示例

    這篇文章主要介紹了Python 音頻生成器的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Numpy的簡(jiǎn)單用法小結(jié)

    Numpy的簡(jiǎn)單用法小結(jié)

    這篇文章主要介紹了Numpy的簡(jiǎn)單用法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 關(guān)于Python數(shù)據(jù)處理中的None、NULL和NaN的理解與應(yīng)用

    關(guān)于Python數(shù)據(jù)處理中的None、NULL和NaN的理解與應(yīng)用

    這篇文章主要介紹了關(guān)于Python數(shù)據(jù)處理中的None、NULL和NaN的理解與應(yīng)用,None表示空值,一個(gè)特殊Python對(duì)象,None的類(lèi)型是NoneType,需要的朋友可以參考下
    2023-08-08
  • 使用selenium模擬動(dòng)態(tài)登錄百度頁(yè)面的實(shí)現(xiàn)

    使用selenium模擬動(dòng)態(tài)登錄百度頁(yè)面的實(shí)現(xiàn)

    本文主要介紹了使用selenium模擬動(dòng)態(tài)登錄百度頁(yè)面,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Python使用import導(dǎo)入本地腳本及導(dǎo)入模塊的技巧總結(jié)

    Python使用import導(dǎo)入本地腳本及導(dǎo)入模塊的技巧總結(jié)

    這篇文章主要介紹了Python使用import導(dǎo)入本地腳本及導(dǎo)入模塊的技巧,結(jié)合實(shí)例形式總結(jié)分析了Python使用import導(dǎo)入本地腳本及導(dǎo)入模塊的使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • PyTorch實(shí)現(xiàn)MNIST數(shù)據(jù)集手寫(xiě)數(shù)字識(shí)別詳情

    PyTorch實(shí)現(xiàn)MNIST數(shù)據(jù)集手寫(xiě)數(shù)字識(shí)別詳情

    這篇文章主要介紹了PyTorch實(shí)現(xiàn)MNIST數(shù)據(jù)集手寫(xiě)數(shù)字識(shí)別詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-09-09

最新評(píng)論