一、unittst框架的作用
當我們寫的用例越來越多時,我們就需要考慮用例編寫的規範與組織,以便於後期的維護,而unittest正是這樣一款工具
二、unittest是python自帶的標準庫中的模組,其中包括:
1、testcase類
2、testsuite類
3、testloader類
4、texttestrunner類
5、texttestresult類
6、testfixture類
解釋下:
testcase:
乙個testcase的例項就是乙個測試用例,測試用例就是乙個完整的測試流程,包括初始化setup、執行run、測試後的還原teardown
testsuite:
對乙個功能的測試往往需要多測試用例的,可以把多的測試用例集合在一起執行,這就是testsuite的概念。常用addtest()方法將乙個測試用例新增到測試套件中
texttestrunner:
是用來執行測試用例的,其中的run(test)用來執行testsuite/testcase。測試的結果會儲存在texttestresult例項中
testfixture:
測試準備前要做的工作和測試執行完後要做的工作.包括setup()和teardown()。通過覆蓋testcase的setup和teardown來實現。
testloader:
是用來搜尋所有以test開頭的測試用例,然後將其加入到testsuite中
圖形化解釋:
三、框架的組成
在寫測試類以及測試用例時要規定乙個命名習慣,一般測試類可以以test開頭,也可以以test結尾。測試用例一般是以test開頭。
eg:結構如下:
import unittest #匯入unittest包
#建立測試類:從unittest.testcase繼承
classromannumeralconvertertest(unittest.testcase):
def setup(self): #初始化測試環境
def teardown(self): #還原測試環境
def test_case(self):測試用例
class x(unittest.testcase):
#setup:用於設定初始化環境的,該類中的方法執行時都會先執行setup中
#**如:開啟瀏覽器、變數賦值、連線資料庫等工作
def setup(self):
self.dr=webdriver.chrome()
self.dr.maximize_window()
self.dr.implicitly_wait(20)#智慧型等待,sleep機械等待
self.dr.get('')
#編寫實際用例的地方
#搜尋多測師
def test_casea(self):
self.dr.find_element_by_id('kw').send_keys(u'多測師')
sleep(3)
#搜尋達內
def test_case3(self):
self.dr.find_element_by_id('kw').send_keys(u'達內')
sleep(3)
#搜尋北大青鳥
def test_case2(self):
self.dr.find_element_by_id('kw').send_keys(u'北大青鳥')
sleep(3)
#用例執行完,還有測試環境如:退出登入、斷開資料庫、關閉瀏覽器
def teardown(self):
self.dr.quit()#關閉所有視窗
if __name__ == '__main__':
unittest.main()#
#unittest.main():使用它可以將乙個單元測試模組變為可直接執行的測試指令碼,main()方法使用testloader類來搜尋所有包含在該模組中以「test」命名開頭的測試方法,並自動執行
注意:pycharm工具預設執行方式為unittests方式
五、組織用例集
這裡我們假設,指令碼當中有多個testcase如test_case1,test_case2…,那我們應該怎樣去控制它們的執行順序
#執行方案一:
if __name__ == '__main__':
unittest.main()#
注:這裡它搜尋所有以test開頭的測試用例方法,根據ascii碼的順序載入測試用例, 數字與字母的順序為:0-9,a-z,a-z
#執行方案二:
if __name__ == '__main__':
suite=unittest.testsuite()#構造測試容器(先例項化測試套件)
suite.addtest(baidu('test'))#新增用例
run=unittest.texttestrunner()#獲取執行方法
run.run(suite)
注:執行的順序是用例的載入順序,比如這裡是先執行2後執行1。
#執行方案三:執行順序和方案一相同(路徑不要太深,複雜)
在方案2中,如果我們有成百上千個用例的話,乙個乙個add進去,是不太現實的,那麼我們可以用defaulttestloader來載入,該新增方法不過當前py檔案下有多少個用例有多少個類,都可以執行
if __name__ == '__main__':
test_dir = './'
discover=unittest.defaulttestloader.discover(test_dir,pattern='*d3.py')
runner = unittest.texttestrunner()
runner.run(discover)
自動化用例編寫注意點:
1、乙個自動化指令碼就是乙個完整的場景:從開始---執行過程---結束(退出)
2、乙個自動化指令碼只驗證乙個功能點,不要試圖把所有功能都寫在乙個用例中
3、編寫自動化用例盡量是正常場景,避免異常場景(用名不填驗證登入)
4、自動動化用例直接盡量保證獨立性,不要造成乙個用例與多個用例產出資料上或
業務上的關聯,這會給後期帶來用例維護上的不便
5、自動化用例的斷言,只針對需要斷言的地方進行斷言(重要環節),沒必要在每個
個環境進行斷言驗證
解釋:1、'./':表示當前路徑
2、'd3.py':就是你新建的工程檔案名字
3.discover方法裡面有三個引數:
-case_dir:這個是待執行用例的目錄。
-pattern:這個是匹配指令碼名稱的規則,test*.py意思是匹配test開 頭的所有指令碼。
-top_level_dir:這個是頂層目錄的名稱,一般預設等於none就行了。
4.discover載入到的用例是乙個list集合,需要重新寫入到乙個list物件testcase裡,這樣就可以用unittest裡面的texttestrunner這裡類的run方法去執行。
多測師 MySQL 儲存過程
1 儲存過程 使用儲存過程的優點 建立儲存過程 建立儲存過程 delimiter create procedure 儲存過程名稱 in out inout 引數名,資料型別 begin 儲存過程體 end delimiter call 儲存過程名稱 引數 呼叫儲存過程 begin.end 代表儲存過...
多測師 介面結構內容
1 介面結構 包含了哪些內容 1 request url 請求位址 2 request method 請求方式 常見的 get 常用於向伺服器獲取資料 put 常用於審核操作介面 delete 常用於刪除類介面 3 http 狀態碼 分類 分類描述 1 資訊,伺服器收到請求,需要請求者繼續執行操作 ...
多測師 Python(內建函式)
一.python內建函式 1.id 返回物件的記憶體位址 a 1 print id a print id 1 2.int 用於將資料型別轉換為整型 a 1 b 2 print int a b 3.str 用於將資料型別轉換為字串 age 18 name zhengying print name ag...