<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 3750字,需瀏覽 8分鐘

           ·

          2020-07-28 12:57

          點(diǎn)擊藍(lán)字關(guān)注我們

          Hello,World!



          01


          Python單元測(cè)試實(shí)例介紹



          unittest框架又叫PyUnit框架,是Python的單元測(cè)試框架。

          先介紹一個(gè)普通的單元測(cè)試(不用unittest框架)的實(shí)例:

          首先構(gòu)造一個(gè)方法:count.py

          #coding=utf-8
          def 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-8
          import count
          #整數(shù)相加def test_add(): try: sum=count.add(5,4) assert(sum==9),"Integer addition result error!" except AssertionError,msg: print msg else: 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): pass
          def 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.005s
          OK>>>




          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 suite
          runner=unittest.TextTestRunner() runner.run(suite)


          4.若所有的方法都嚴(yán)格按照test開頭,則直接用 unittest.main()即可

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



          ?? - end -??


          微信號(hào) : coding_club

          ●?掃碼關(guān)注我們

          覺得內(nèi)容還不錯(cuò)的話,給我點(diǎn)個(gè)“在看”唄




          瀏覽 72
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一级片网址 | 狠狠躁日日躁夜夜躁A片无码视频 | 99精品久久久久久中文字幕 | 蜜桃av色偷偷av老熟女 | 国产CD系列TS人妖视频 |