Python 自動化測試 必會模組 Unittest

暴躁的熱心網友皮皮文發表於2018-05-05
一直在努力做測試的小白白

個人覺得使用python標準庫中的Unittest搭建自動化測試框架很好用所以在這裡做個筆記。

其實想要清楚Unittest內部邏輯看懂這張類圖即可,夫圖之缺如,豈不若言之大D,不多BB。
複製程式碼

Python 自動化測試 必會模組 Unittest

Unittest模組核心概念非為四層先後順序可以為TestFixture->TestCase->TestSuite->TestRunner

Surprise MotherF*cker 跟這個圖有什麼關係呢?別急慢慢聽我說。
複製程式碼

圖由下到上details ·TestCase簡單說就是測試樣例,就是有一個完善的測試流程。 Setup(準備測試環境)-> Run(執行測試)-> Teardown(測試結束,環境恢復) Unittest 本質也在這裡,單元即在不可分,一個單元即一個完整的測試單元。 ·TestSuite是可以打包testcase的巢狀工具,將每個型別的單元測試歸類等,PS:TestSuite可以巢狀TestSuite。 ·TestLoader中的loadTestsFrom方法搜尋TestCase並載入到TestSuite中 ·TestRunner跑TestSuite中的TestCase並生成result ·TestFixture則是面對測試用例的環境搭建與銷燬

一個類繼承了Unittest了以後便是一個測試用例,而class中的方法(以test名稱開頭的方法),會在TestLoaderd的時候被載入到TestCase中並生成對應例項,然後如果被載入在TestSuite中也是不變的例項

Process梳理: 完成TestCase內容,由TestLoadFrom將其載入到TestSuite中,然後TestRunner測試輸出結果到TestResult

Unittest例項:

直接測TestCase 這裡寫好待測方法

Python 自動化測試 必會模組 Unittest
)

然後把對這些方法使用Unittest進行測試

Python 自動化測試 必會模組 Unittest

PS: 補充一下unittest.main()就是把TestCase交給TestRunner,並列印結果到結果欄(也可以寫入檔案), 並且可以在unittest.main()中加入verbosity=0/1/2(數字表示log詳細程度)

把TestCase打包到TestSuite中並測試

Python 自動化測試 必會模組 Unittest
使用addTest()一個一個或者將testcase寫進列表不實用 個人覺得這樣手動新增testcase實在!!!麻煩,遂使用load功能把testcase中開頭帶test字樣的全部載入進來

suite.addTests(unittest.TestLoader().loadTestsFromName('test_mathfunc.TestMathFunc'))
複製程式碼

這樣可以載入test_mathfunc模組中TestMathFunc例項中所有的testcase,載入TestCase的順序是無序的,可以核對一下列印結果和TestCase例項中的待測def

將日誌列印成文件 python中使用with open 開啟檔案做檔案流處理很方便,不需要手動close不需要擔心記憶體洩漏,一切垃圾回收機制搞定。(面試的時候有可能會問python中的垃圾回收機制,建議好好看一下。因為樓主Java很久不用了堆垃圾回收機制概念清楚但是深層原理不記得了,這時面試官問,我就會說我目前清楚python的,java很久不用了XXXXXXX) 加上如下coding

with open('UnittestTextReport.txt', 'a') as f:
        runner = unittest.TextTestRunner(stream=f, verbosity=2)
        runner.run(suite)
複製程式碼

環境準備與恢復TestFixture 如果我們有這樣兩個testcase,1.登陸一個網站(正確的account&pwd)2.登陸一個網站(非法使用者名稱&pwd).第一個測試樣例進行完必須要退出,清理快取這樣最好,然後進行第二個測試樣例的測試。 這時候TestFixture的setup()和TearDown()就有作用了。

def setUp(self):
        print "do something before test.Prepare environment."

def tearDown(self):
        print "do something after test.Clean up."
複製程式碼

將其新增到testcase中,類似於魔法方法,每有一個測試樣例開始走unittest的框架流程時,就會在開始處呼叫setup()搭建初始化環境,結束時恢復至剛開始測試的環境。

如果想要在所有case執行之前準備一次環境,並在所有case執行結束之後再清理環境,我們可以用 setUpClass() 與 tearDownClass():

class TestMathFunc(unittest.TestCase):
    """Test mathfuc.py"""

     @classmethod
    def setUpClass(cls):
        print "This setUpClass() method only called once."

    @classmethod
    def tearDownClass(cls):
        print "This tearDownClass() method only called once too."

...
複製程式碼

有些人可能對@classmethod感到陌生或者不熟悉,好吧既然說到這裡了,就插播一個python知識點。

python中的classmethod與staticmethod

@classmethod是類方法 @staticmethod是靜態方法

那麼有什麼區別呢? 來寫一個簡單的類觀察下

class A(object):
    def m1(self,n):
        print("self:",self)

    @classmethod
    def m2(cls,n):
        print ("cls:",cls)

    @staticmethod
    def m3(n):
        print ("n",n)
a = A()
a.m1(1)
A.m2(1)
a.m3(1)
複製程式碼

輸出為

Python 自動化測試 必會模組 Unittest

一般來說如果要使用某個類的方法,必須例項化該類的物件後再呼叫該類中的方法,self將該方法繫結在了物件身上,這個結果能看出一些問題,self大家應該不陌生是繫結在類例項化的物件的,而cls則是繫結在類A身上的。

那麼staticmethod和self繫結的類中用法又有什麼區別呢,兩者都可以通過例項化物件.類方法()來呼叫類方法或者類屬性,但是self可以在內部呼叫,而staticmethod只能依靠前面一種方法。

那麼classmethod和staticmethod又有什麼區別? 顯然大家應該有一些想法了,就是classmethod作為一個裝飾器他可以在類未被例項化前就可以執行classmethod下面的語句,他是屬於類的可以使用類名.類方法/類屬性來呼叫。

Well,in one word. 就是staticmethod是靜態的呼叫類或者物件屬性都可以,但是不可以內部自身呼叫,class method修飾作用在於類可以呼叫,而self最大特點是內部可以進行呼叫。

那麼這(classmethod)又有什麼用呢?

有這種民工三連問題就對了,看下面例子。

Python 自動化測試 必會模組 Unittest

使用者輸入的是2018 5 5 但是如果輸入format變為2018.5.5,重構類的時候最好不要修改原有的建構函式,只需要新增classmethod和你額外的處理函式即可。 如下:

Python 自動化測試 必會模組 Unittest

繞了一大圈,終於回來了,繼續說Unittest

如果執行到某個testcase你想跳過去呢?

skip裝飾器即可-->@unittest.skip

Python 自動化測試 必會模組 Unittest

Just like this ,這樣就可以在列印臺上或者文件中看到記錄該testcase已經被跳過 skip裝飾器一共有三個 unittest.skip(reason) unittest.skipIf(condition, reason) unittest.skipUnless(condition,reason) skip無條件跳過,skipIf當condition為True時跳過,skipUnless當condition為False時跳過。 根據自己情況去pick。

總結一下: unittest是Python自帶的單元測試框架,我們可以用其來作為我們自動化測試框架的用例組織執行框架。 unittest的流程:寫好TestCase,然後由TestLoader載入TestCase到TestSuite,然後由TextTestRunner來執行TestSuite,執行的結果儲存在TextTestResult中,我們通過命令列或者unittest.main()執行時,main會呼叫TextTestRunner中的run來執行,或者我們可以直接通過TextTestRunner來執行用例。 一個class繼承unittest.TestCase即是一個TestCase,其中以 test 開頭的方法在load時被載入為一個真正的TestCase。 verbosity引數可以控制執行結果的輸出,0 是簡單報告、1 是一般報告、2 是詳細報告。 可以通過addTest和addTests向suite中新增case或suite,可以用TestLoader的loadTestsFrom__()方法。 用 setUp()、tearDown()、setUpClass()以及 tearDownClass()可以在用例執行前佈置環境,以及在用例執行後清理環境 我們可以通過skip,skipIf,skipUnless裝飾器跳過某個case,或者用TestCase.skipTest方法。 引數中加stream,可以將報告輸出到檔案:可以用TextTestRunner輸出txt報告。

由於樓主研究生跨專業到計算機,所以很多東西還很欠缺,打算自學,方便自己複習記錄自己的學習歷程,打算總結整理一些東西,這樣更有儀式感,交流學習勘誤

Memo: -Exactly.Parker was a young kid. Pretty good on the sax. Gets up to play in the cutting session. And he fucks it up. And Jones nearly decapitates him for it. And he's laughed off-stage crie himself to sleep that night, but the next morning, what does he do? He practices. Never to be laughed at again. And he practices and he practices, with one goal in mind. And a year later he goes back to the Reno. And he steps up on that stage and he plays the best motherfucking solo the world has ever heard. --Whiplash(爆裂鼓手)

相關文章