一直在努力作測試的小白白
我的以爲使用python標準庫中的Unittest搭建自動化測試框架很好用因此在這裏作個筆記。
其實想要清楚Unittest內部邏輯看懂這張類圖便可,夫圖之缺如,豈不若言之大D,很少BB。
複製代碼
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則是面對測試用例的環境搭建與銷燬java
一個類繼承了Unittest了之後即是一個測試用例,而class中的方法(以test名稱開頭的方法),會在TestLoaderd的時候被加載到TestCase中並生成對應實例,而後若是被加載在TestSuite中也是不變的實例python
Process梳理: 完成TestCase內容,由TestLoadFrom將其加載到TestSuite中,而後TestRunner測試輸出結果到TestResult面試
Unittest實例:api
直接測TestCase 這裏寫好待測方法 緩存
)而後把對這些方法使用Unittest進行測試session
PS: 補充一下unittest.main()就是把TestCase交給TestRunner,並打印結果到結果欄(也能夠寫入文件), 而且能夠在unittest.main()中加入verbosity=0/1/2(數字表示log詳細程度)框架
把TestCase打包到TestSuite中並測試less
使用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)
複製代碼
輸出爲
通常來講若是要使用某個類的方法,必須實例化該類的對象後再調用該類中的方法,self將該方法綁定在了對象身上,這個結果能看出一些問題,self你們應該不陌生是綁定在類實例化的對象的,而cls則是綁定在類A身上的。
那麼staticmethod和self綁定的類中用法又有什麼區別呢,二者均可以經過實例化對象.類方法()來調用類方法或者類屬性,可是self能夠在內部調用,而staticmethod只能依靠前面一種方法。
那麼classmethod和staticmethod又有什麼區別? 顯然你們應該有一些想法了,就是classmethod做爲一個裝飾器他能夠在類未被實例化前就能夠執行classmethod下面的語句,他是屬於類的可使用類名.類方法/類屬性來調用。
Well,in one word. 就是staticmethod是靜態的調用類或者對象屬性均可以,可是不能夠內部自身調用,class method修飾做用在於類能夠調用,而self最大特色是內部能夠進行調用。
那麼這(classmethod)又有什麼用呢?
有這種民工三連問題就對了,看下面例子。
用戶輸入的是2018 5 5 可是若是輸入format變爲2018.5.5,重構類的時候最好不要修改原有的構造函數,只須要添加classmethod和你額外的處理函數便可。 以下:
繞了一大圈,終於回來了,繼續說Unittest
若是執行到某個testcase你想跳過去呢?
skip裝飾器便可-->@unittest.skip
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(爆裂鼓手)