?基本概念
UnitTest單元測試框架是受到JUnit的啟發,與其他語言中的主流單元測試框架有著相似的風格。其支持測試自動化,配置共享和關機代碼測試。支持將測試樣例聚合到測試集中,并將測試與報告框架獨立。
它分為四個部分test fixture、TestCase、test suite、test runner,分別是:
測試腳手架:為了開展項測試所需要進行的準備工作,以及所有相關的清理操作;
測試用例:一個測試用例是一個獨立的測試單元。它檢查輸入特定的數據時的響應;
測試套件:它用于歸檔需要一起執行的測試用例;
測試運行器:是一個用于執行和輸出測試結果的組件。
TestCase詳解
類TestCase為測試用例提供了支持。通過繼承TestCase來設置一個新的測試類,和設置測試方法,每個測試方法通過實際響應結果與預期結果對比來實現單元測試。
測試用例包括的方法:setUp()、tearDown()、setUpClass()、tearDownClass()。注意類名要以Test開頭,測試用例的名稱要以test開頭
下面一個示例來展示:
import unittest
class Test_unittest(unittest.TestCase):def setUp(self) -> None:print('setup')def test(self):print('test')def tearDown(self) -> None:print('teardown')
if __name__ == '__main__':unittest.main()
可以看到運行結果打印了三條測試用例里的內容,setup和teatdown方法,在每次執行測試用例前后都會執行,如果再增加一條測試用例,setup和teardown也會再執行一次,如下圖所示:
所以如果想初始化和結束方法只想執行一次的話,可以使用setUpClass()、tearDownClass(),但是注意得在方法前面添加注解@classmethod,看下面示例和結果:
import unittest
class Test_unittest(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:print('setup')def testcase1(self):print('testcase1')def testcase2(self):print('testcase2')def tearDown(self) -> None:print('teardown')
if __name__ == '__main__':unittest.main()
可以看到,使用了setUpClass()方法就只初始化了一次,teardown沒使用就每條用例都會執行一次。
常用方法
斷言
測試用例中還有常用的斷言和skip跳過測試用例。在UniTtest框架中也提供了一個自帶的斷言方式,主要有以下幾種:
skip跳過
在實際測試中,如有功能缺陷的功能點對應的自動化測試用例執行不了,或者不執行的用例,可以用skip()方法來操作,使用方法為:
1.unittest.skip(‘輸入理由’)——無條件執行跳過操作
2.unittest.skipif(2>1,’理由’)——判斷條件為true的時候執行
3.unittest.skipUnless(1>2’理由’)—判斷條件為false的時候執行
4.unittest.expectedFailure—執行錯誤不計入不通過用例中
下面查看示例,testcase1方法被跳過,testcase2方法使用了斷言,但是斷言結果不對,于是有報錯信息:
import unittest
class Test_unittest(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:print('setup')@unittest.skipdef testcase1(self):print('testcase1')def testcase2(self):a = 1self.assertEqual(a,2,msg='error')print('testcase2')def tearDown(self) -> None:print('teardown')
if __name__ == '__main__':unittest.main()
測試套件
當一個類里有多個測試用例又不會同時運行的時候,可以選擇把測試用例添加到suite中,中suite運行(pycharm中直接在文件中寫不行,要重新新建一個py文件)。
1.直接一個一個添加到suite中:
解釋:導入該文件中的類,定義一個套件名稱,使用testsuite方法,對該套件添加測試用例,定義一個運行名稱,使用運行方法,添加測試套件,即可運行(得一個個的添加測試用例)。
2.定義一個列表【】把用例都存進去,然后運行:
3.直接讀取類名的形式來運行(最簡單,最方便,不能使用‘’):
4.也是讀取名字,不過容易找不到類,需要在前面加一個文件名。
TestRunner
1.編寫完腳本之后重新新建一個文件然后添加用例到suite,即可全部執行。
2.在網上下載htmlTestrunner源碼,復制到python/lib目錄即可import導入:
Python之request
主要方法解析
requests是Python實現的最簡單易用的HTTP庫,requests庫7個主要方法:
舉例:普通接口測試的接口之間沒有關聯性,所以直接定義變量去發起get、post請求即可。?
其中post的請求常用的分為json和formdata,兩種方式請求的參數方式如截圖所示。需要鑒權的,需要導入auth包,然后跟在請求方法后面。
requests方法詳解
具體方法查看可以直接按住ctrl+左鍵點擊requests方法查看源碼。
1.url: 請求地址
2.data:字典,字節序列或文件對象,作為Request的內容
3.json: JSON格式的數據,作為Request的內容
4.headers: 字典, HTTP定制頭
5.cookie: 字典或CooKiJar, Request中的cookie
6.auth: 元祖,支持HTTP認證功能
7.files: 字典類型,傳輸文件
8.timeout: 設定超時時間,秒為單位
9.proxies: 字典類型,設定訪問代理服務器,可以增加登錄認證
10.allow_redirects: True/False,默認為True,重定向開關
11.stream: True/False,默認為True,獲取內容立即下載開關
12.verity: True/False默認Ture,認證ssl證書開關
13.cert: 本地ssl證書路徑
Response返回方法詳解
1.response.status_code #返回的http響應狀態碼
2.response.content #返回的是bytes型也就是二進制的數據
3.response.headers # 返回的http請求頭
4.response.json() # 返回響應中的Json數據
5.response.url # 返回url
6.response.encoding # 返回響應的編碼格式
7.response.cookies # 返回響應中的cookie
8.response.text #返回的是Unicode型的數據。—文本
Session詳解
對于需要前后接口依賴的接口測試,比如從上一個請求中獲取token用作下一個接口請求的參數去提交的話,用上面一種方法明顯不合適,按照上面的方法需要定義很多變量,然后根據依賴去添加到對應的請求參數里。
下面這種方法,使用session會話的方式,貫穿前后,只要添加了一次,所有請求都能用到。
解釋:
1.這個是cynthia缺陷管理系統,登錄的時候需要拿到響應里的cookie作為下一個請求的cookie,不然登錄不上。
2.所以在UniTtest結構中,可以把登錄操作放到setup里面,類似UI自動化一樣,登錄放在初始化中。
3.在setup中把響應的cookie值,加入到請求的里面去了,同時添加了瀏覽器UA。
4.參數可以復用,從頭到尾請求的變量都是rsp,body里的參數都是dict,編寫簡單方便。
定義一個變量s等于requests的session會話,后面都用這個s的會話去發起請求。
定義一個變量等于rsp等于s去發起請求的結果。
s會話請求的頭文件中cookie需要添加tokenid,不然登錄不上,這個id在rsp響應信息里。
因為響應信息是json字典格式,所以要添加到請求頭里需要按照截圖格式。
如果需要在字典中添加字段或者內容,按照截圖的格式s.headers[‘xxx’]=“xxx”,如果字典中有這個key:value,那么value值會直接更新,沒有這個key那么則會添加這個key:value到字典。
接口實戰
添加token到頭文件中
在公司實際項目中,調接口首先需要獲取token,要先調用獲取token的請求,然后拿到token值之后,在后面接口中添加到頭文件中。
self.session.headers.update({“token”:rsp.json()[‘data’][‘token’]})
(左右滑動查看完整代碼)
通過在setup初始化方法中調用獲取token,來拿到token的值,然后添加到整個session的head中去,后續請求中都不需要額外添加head了。
使用ddt做參數化
ddt數據驅動測試,首先pip list ddt,安裝第三方庫,在代碼最上方導入庫中的data
from ddt import ddt,data,在測試類前面聲明ddt,用@ddt:
1、在測試用例前聲明使用data,用@data:
@data('test1','test2')
def test_ddt1(self,value):print(value)`在這里插入代碼片`
(左右滑動查看完整代碼)
運行結果中該用例執行了兩次,分別輸出的test1和test2。
2、data用法讀取文件
此方法需要解包,故需要用到unpack方法,在測試用例前聲明@unpack即可。
def readline(self):date = []file = open('D:\\base64\\keyid.txt','r',encoding='utf-8')for line in file:date.append(line.split())return date
@data(*readline(""))
@unpack
def test_ddt2(self,vars):print(vars)
對運行結果解釋:定義一個讀取文件的方法,定義一個list數組,使用file函數的open方法,讀取文件名為“txt1”的文件,以read的形式,編碼格式為utf-8,以for循環的方式一直循環讀取每一行,以\n換行符為一行結尾,以逗號分隔每一個參數,最后返回data值以便下方直接調用。
上面寫了讀取方法之后,在測試用例前,直接使用該方法即可,@data(*readfile())這種形式,接著使用@unpack解包的方法即可。
生成測試報告
按照上述的方法編寫好測試用例后,結合UniTtest框架生成報告的HTMLTestRunner來生成接口測試報告。
從網上找的HTMLTestRunner庫文件,下載后放到Python安裝目錄的lib文件夾中就行,后續就可以直接調用了https://github.com/GoverSky/HTMLTestRunner_cn/issues