本文目錄一覽:
- 1、自動化測試-unittest框架,理論和實操雙管齊下
- 2、請教:python裝飾器如何不改變原函數名
- 3、python ddt 支持讀取json格式數據么
- 4、為什麼python 自動化測試 使用@ddt、@unpack後會都執行一次setUp函數?
- 5、xlrd實現從excel文件讀取數據
- 6、DDT與pytest.mark.parametrize參數化區別
自動化測試-unittest框架,理論和實操雙管齊下
unittest
1、什麼是Unittest框架?
python自帶一種單元測試框架
2、為什麼使用UnitTest框架?
批量執行用例
提供豐富的斷言知識
可以生成報告
3、核心要素:
1). TestCase(測試用例)
2). TestSuite(測試套件)
3). TestRunner(測試執行,執行TestUite測試套件的)
4). TestLoader(批量執行測試用例-搜索指定文件夾內指定字母開頭的模塊) 【推薦】
5). Fixture(固定裝置(兩個固定的函數,一個初始化時使用,一個結束時使用))
接下來會展開 核心要素來認識unittest框架:
首先介紹下unittest的用例規則:
1、測試文件必須導包:import unittest
2、測試類必須繼承 unittest.TestCase
3、測試方法必須以 test_開頭
一、TestCase(測試用例)
1、是一個代碼文件,在代碼文件中來書寫真正的用例代碼 (裡面的print均是模擬測試用例)
說明:def 定義的test_ 是測試用例,只有執行 if __name__ == ‘___mian___’ 的時候會執行測試用例,其他普通函數則不執行,通過 self 來調用執行。
二、TestSuite(測試套件)和TestRunner(測試執行)
1、TestSuite(測試套件):用來組裝,打包 ,管理多個TestCase(測試用例)文件的
2、TestRunner(測試執行):用來執行 TestSuite(測試套件的)
代碼:首先要準備多個測試用例的文件才可以實現TestSuite和TestRunner,以下代碼是已經準備了unittest_Demo2和unittest_Demo1兩個測試用例文件
三、TestLoader(測試加載)
說明:
2. 搜索指定目錄文件下指定字母開頭的模塊文件下test開始的方法,並將這些方法添加到測試套件中,最後返回測試套件
3. 與Testsuite功能一樣,對他功能的補充,用來組裝測試用例
一般測試用例是寫在Case這個文件夾裡面,當測試用例超多的時候就可以考慮 TestLoader
四、Fixture(測試夾具)
是一種代碼結構,在某些特定情況下,會自動執行。
4.1 方法級別
在每個測試方法(用例代碼)執行前後都會自動調用的結構
def setUp(),每個測試方法執行之前都會執行 (初始化)
def tearDown(),每個測試方法執行之後都會執行 (釋放)
特性:幾個測試函數,執行幾次。每個測試函數執行之前都會執行 setUp,執行之後都會執行tearDwon
4.2 類級別
在每個測試類中所有方法執行前後 都會自動調用的結構(在整個類中 執行之前執行之後各一次)
def setUpClass() ,類中所有方法之前
def tearDownClass(),類中所有方法之後
特性:測試類運行之前運行一次setUpClass ,類運行之後運行一次tearDownClass
注意:類方法必須使用 @classmethod修飾
案列模板:結合了類級別和方法級別實現的
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-GBxQV2uP-1647245316010)(C:/Users/15277/AppData/Roaming/Typora/typora-user-images/image-20220303153824329.png)]
五、斷言
1、什麼是斷言:
讓程序代替人工自動的判斷預期結果和實際結果是否相符
斷言的結果:
1)、True,用例通過
2)、False,代碼拋出異常,用例不通過
3)、在unittest中使用斷言,需要通過 self.斷言方法
2、為什麼要斷言:
自動化腳本執行時都是無人值守,需要通過斷言來判斷自動化腳本的執行是否通過
註:自動化腳本不寫斷言,相當於沒有執行測試一個效果。
3、常用的斷言:
對於一些未完成的或者不滿足測試條件的測試函數和測試類, 不想執行,可以使用跳過
結果
七、數據驅動(unittest ddt)
ddt:data-driver tests
數據驅動:是以數據來驅動整個測試用例的執行, 也就是測試數據決定測試結果
數據驅動解決的問題是:
1)、代碼和數據分離,避免代碼冗餘
2)、不寫重複的代碼邏輯;
在python解釋器中需要安裝 ddt 這個包才能用:
要檢查是否安裝上,在cmd當中 輸入 pip list命名,有ddt說明安裝成功
語法:
1、使用數據驅動,要在class前加上修飾器 @ddt
說明:方法裡面使用 print ,為了方便,模擬測試用例,主要是為了學習數據驅動,實際中方法裡面寫的是測試用例的代碼
1)、結合 selenium 使用 ddt
self:相當於java中的this,當前對象的引用,self.driver定義了driver這個變量。
2、在實際中不可能是單一參數進行傳參,將會使用多個參數進行傳參:
但是以上步驟都是數據在代碼當中的,假如要測試n個手機號這樣的數據,全部寫在 @data 裝飾器裡面就很麻煩,這就引出了數據驅動裡面的代碼和數據的分離。
3、將數據放入一個文本文件中,從文件讀取數據, 如JSON、 excel、 xml、 txt等格式文件 ,這裡演示的是json文件類型.
json文件處理, 這個鏈接介紹了json文件和Python文件基本操作
(1)、在json文件驅動
(2)、在測試代碼中讀取json文件
執行結果:
一行表示一組:
寫法一:
寫法二:推薦
對應的json文件
寫法:
注意:file_date 裝飾器,可以直接讀取yaml和json文件
建立excel表的時候需要退出pychram在根目錄下創建excel表保存,否則會報錯
用excel登錄csdn操作
用例不可能每一次運行都成功,肯定運行時候有不成功的時候。如果可以捕捉到錯誤,並且把錯誤截圖保存,這將
是一個非常棒的功能,也會給我們錯誤定位帶來方便
截圖方法: driver.get_screenshot_as_file
有兩種測試報告:
只有單獨運行 TestCase 的代碼,才會生成測試報告
這裡需要第三方的測試運行類模塊,然後放在代碼的目錄中
就像這兩個模塊一樣放進代碼目錄中
寫法一:
寫法二:
這裡面的當前路徑也可以用 ./ 來表示!!!
注意:
實例化 第三方的運行對象,HTMLTestRunner()的初始化有多種可以自定義設置
最後生成結果
unittest框架就本上就是這些知識了,裡面記得東西很多,多敲代碼,形成記憶…
請教:python裝飾器如何不改變原函數名
裝飾器是用在函數不修改添加新功能的情況下誕生的,一般在需要裝飾的函數上寫
@funcname
def funb(){
…..
}
然後再裝飾的函數裡面去調用原函數,以達到不修改添加功能的作用
python ddt 支持讀取json格式數據么
#讀file = ‘test.json’fp = open(file, ‘r’)dict = json.dump(fp.read())fp.close()#寫testDict = {‘a’:1,’b’:2}file = ‘my.json’fp = open(file,’w+’)fp.write(json.loads(testDict))fp.close()
為什麼python 自動化測試 使用@ddt、@unpack後會都執行一次setUp函數?
setUp和tearDown的執行跟ddt沒有關係,是測試框架如unittest裡邊的內容。
如果只想執行一次,可以改為:
@classmethod
def setUpClass(cls):
pass
xlrd實現從excel文件讀取數據
自動化測試時,經常會提到數據驅動的概念。數據驅動是以數據來驅動整個測試用例的執行,即測試數據決定測試結果。Python中ddt模塊可以實現。 python 操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。
如果測試數據寫入到excel文件中,該如何從中獲取數據呢?
● 假設測試登錄功能的用例:
● 正常賬號密碼登錄成功;
● 錯誤賬號登錄失敗;
● 錯誤密碼登錄失敗;
● ……
根據當前系統數據,準備好三組測試用例的數據,寫入到excel表格中:
讀取數據使用xlrd(支持xls格式)示例:
附Xlrd常用操作如下:
打開excel:
那麼這樣就可以讀取到數據了。
DDT與pytest.mark.parametrize參數化區別
一、DDT解析參數
ddt 是第三方模塊,需安裝, pip install ddt
DDT包含類的裝飾器ddt和兩個方法裝飾器data(直接輸入測試數據)
通常情況下,data中的數據按照一個參數傳遞給測試用例,如果data中含有多個數據,以元組,列表,字典等數據,需要自行在腳本中對數據進行分解或者使用unpack分解數據。
@data(a,b)
那麼a和b各運行一次用例
@data([a,d],[c,d])
如果沒有@unpack,那麼[a,b]當成一個參數傳入用例運行
如果有 @unpack ,那麼[a,b]被分解開,按照用例中的兩個參數傳遞
1、測試參數如下:
login_data=[{“para”:{“mobilephone”:”18777770000″,”pwd”:”123456″},”method”:”get”,”msg”:”登錄成功”},
{“para”: {“mobilephone”:”18777770000″,”pwd”:”000000″},”method”:”get”,”msg”:”用戶名或密碼錯誤”},
{“para”: {“mobilephone”:” “,”pwd”:”123456″},”method”:”get”,”msg”:”手機號不能為空”}]
2、測試用例使用DDT解析參數:
from ddt import ddt,data
#裝飾測試類
@ddt
class TestHttpRequest(unittest.TestCase):
#裝飾測試用例
@data(*login_data)
def test_login_1(self,data):
res=HttpRequest(data[‘url’],data[‘param’]).http_request(data[‘method’])
print(“測試結果:{0}”.format(res.json()))
執行3條用例
標記函數參數化(測試用例方法前加測試數據):@pytest.mark.parametrize(“a,b,expected”, testdata)
語法:
ep1 傳入單個參數
@pytest.mark.parametrize(‘參數名’,lists)
ep2 傳入兩個參數
(‘參數1′,’參數2’,[(參數1_data[0],參數2_data[0]),(參數1_data[1],參數2_data[1])]
傳三個或者更多也是這樣傳。list的每個元素都是一個元祖,元祖里的每個元素和按參數順序一一對應。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/151696.html