引入unittest測(cè)試框架,構(gòu)造測(cè)試集批量測(cè)試



Hello,World!
Python單元測(cè)試實(shí)例介紹


unittest框架又叫PyUnit框架,是Python的單元測(cè)試框架。
先介紹一個(gè)普通的單元測(cè)試(不用unittest框架)的實(shí)例:
首先構(gòu)造一個(gè)方法:count.py
#coding=utf-8def add(a,b):return a+b;def minus(a,b):return a-b
然后構(gòu)建一個(gè)單元測(cè)試的方法:testCount.py,(也可以創(chuàng)建一個(gè)類,類里面有多個(gè)測(cè)試方法)
#coding=utf-8import count#整數(shù)相加def test_add():try:sum=count.add(5,4)assert(sum==9),"Integer addition result error!"except AssertionError,msg:print msgelse:print "test pass!"if __name__=="__main__":print count.add(2,3)print count.minus(12,1)test_add()
運(yùn)行結(jié)果如下:
>>>511test pass!>>>?
知識(shí)點(diǎn)一.? ? ?__name__=="__main__"
.py有兩種使用方式,一種是作為模塊被調(diào)用,另外一種是直接運(yùn)行。那么如何判斷呢?
.py文件會(huì)根據(jù)自身的使用方式,它的__name__的屬性會(huì)不同。
(1)如果它的屬性是“__main__”,那么腳本就知道自己是被直接執(zhí)行的。
(2)如果是被別的文件import的來用,__name__的屬性就會(huì)是腳本自己的文件名,從而防止錯(cuò)誤的執(zhí)行。
引入的if語句的作用就是? 通過檢查該模塊的__name__屬性來實(shí)現(xiàn)判斷.py文件被使用的方式。從而方便我們代碼復(fù)用,也可以測(cè)試模塊。
其實(shí)就一句話,即例如:test.py
如果是自身運(yùn)行,則__name__=="__main__",如果 test.py被其他腳本引用,則? __name__=="__test__",
使用下面這個(gè)判斷的作用就是使程序只有在自身被運(yùn)行的情況下才執(zhí)行,如果只是被調(diào)用,那么就不運(yùn)行了。
?
知識(shí)點(diǎn)二. import 的腳本生成 .pyc文件
testCount.py ?import了 count.py 這個(gè)模組,用import引入模塊時(shí),會(huì)將引入的模塊文件中的代碼執(zhí)行一次。但是注意,只在第一次引入時(shí)才會(huì)執(zhí)行模塊文件中的代碼,因?yàn)橹辉诘谝淮我霑r(shí)進(jìn)行加載,之后不會(huì)再加載,而導(dǎo)入的這些文件進(jìn)行字節(jié)編譯后以.pyc作為擴(kuò)展名,只有被 import的包才會(huì)執(zhí)行編譯生成此文件,所以會(huì)生成 count.pyc文件。
02
引用unnittest單元測(cè)試框架


先上代碼:unittest.py
#coding=utf-8import countimport unittest#當(dāng)pyc文件仍存在時(shí),刪除即可class Mytest(unittest.TestCase):def setUp(self):passdef test_add(self):self.assertEqual(count.add(3,4),7)def test_minus(self):self.assertEqual(count.minus(10,4),6)def tearDown(self):pass#構(gòu)造測(cè)試集,注意suite不和上面的方法是一模塊#報(bào)錯(cuò):AttributeError: 'module' object has no attribute 'suite'def suite():suite=unittest.TestSuite()suite.addTest(Mytest("test_add"))suite.addTest(Mytest("test_minus"))return suite#注意是雙下劃線,則報(bào)錯(cuò)#報(bào)錯(cuò):NameError: name '_name_' is not definedif __name__ =="__main__":unittest.main(defaultTest='suite')
代碼編寫中出現(xiàn)的問題:
1.報(bào)錯(cuò):Python腳本正常的,但執(zhí)行報(bào)錯(cuò)"AttributeError: 'module'object has no attribute 'unittest'",其實(shí)是.pyc文件存在問題。
問題定位:查看import庫的源文件,發(fā)現(xiàn)源文件存在且沒有錯(cuò)誤,同時(shí)存在源文件的.pyc文件
問題解決方法:刪除該庫的.pyc文件,重新運(yùn)行代碼;或者找一個(gè)可以運(yùn)行代碼的環(huán)境,拷貝替換當(dāng)前機(jī)器的.pyc文件即可
2.報(bào)錯(cuò):AttributeError: 'module' object has no attribute 'suite'
問題定位:def suite():方法縮進(jìn)錯(cuò)誤,它屬于全局方法,縮進(jìn)和類保持一致,而不是和方法保持一致,相當(dāng)于testng類和testng.xml文件,屬于同級(jí)設(shè)置
3.報(bào)錯(cuò):NameError: name '_name_' is not defined
問題定位:name左右是雙下劃線,少個(gè)下劃線。
框架介紹:
1.想使用unittest框架,首先要引入unittest?包
import??unittest??2.Mytest類繼承unittest.TestCase?類,所有測(cè)試執(zhí)行的類都繼承?TestCase類,可以看成是對(duì)特定類進(jìn)行測(cè)試的方法的集合?
class?Mytest(unittest.TestCase):3. 其中setUp(), tearDown() 和 aseertEqual() 都是TestCase類下的方法。
setUp 用于設(shè)置初始化的部分,在測(cè)試用例執(zhí)行前,這個(gè)方法中的函數(shù)將先被調(diào)用。一般將瀏覽器的調(diào)用和URL的訪問放到初始化部分。
tearDown 方法在每個(gè)測(cè)試方法執(zhí)行后調(diào)用,這個(gè)地方做所有清理工作,如退出瀏覽器等。
測(cè)試的方法通常以test開頭
unitest.main()函數(shù)用來測(cè)試 類中以test開頭的測(cè)試用例。
4.suite()為全局方法,是unittest的TestSuite(),通過 addTest(類名("方法名"))來添加測(cè)試用例,例如一個(gè)類中可以寫多個(gè)用例,通過suite()使之形成多個(gè)測(cè)試用例被執(zhí)行。
運(yùn)行的測(cè)試結(jié)果如下:
>..----------------------------------------------------------------------Ran 2 tests in 0.005sOK>
03
測(cè)試集的運(yùn)用(如何組織測(cè)試用例)


1.直接在suite()中添加測(cè)試用例
def suite():suite=unittest.TestSuite()suite.addTest(Mytest("test_add"))suite.addTest(Mytest("test_minus"))if __name__ =="__main__": unittest.main(defaultTest='suite')
2.若測(cè)試用例都是以 test開頭,則用 makeSuite()方法一次性運(yùn)行
def suite():return unittest.makeSuite(Mytest,"test")if __name__ =="__main__":????unittest.main(defaultTest='suite')
3.可以使用TestRunner的子類 TextTestRunner來執(zhí)行
if __name__ =="__main__":suite=unittest.TestSuite()suite.addTest(Mytest("test_add"))suite.addTest(Mytest("test_minus"))return suiterunner=unittest.TextTestRunner()runner.run(suite)
4.若所有的方法都嚴(yán)格按照test開頭,則直接用 unittest.main()即可
if __name__ =="__main__":????unittest.main()
?? - end -??
覺得內(nèi)容還不錯(cuò)的話,給我點(diǎn)個(gè)“在看”唄


