首先介紹一下python的requests模塊:
requests的使用介紹:requests快速入門
Python結合requests庫實現接口自動化測試
環境說明:
1.WIN 7, 64位
2.Python3.4.3 (pip-8.1.2)
3.Requests —>pip install requests
4.Unittest —>unittest 框架是python自帶的單元測試框架,python2.1及其以后的版本已將unittest作為一個標準塊放入python開發包中,所以unittest不用單獨安裝。
5.測試報告利用HTMLTestRunner生成。
測試思路:
1、先把每個http接口一個一個寫腳本測試。(提交的json串直接放在data字典中,這里沒有用到excel等寫測試用例,測試用例直接用腳本實現。)
2、寫完所有接口的測試腳本后,由于一個接口有好幾個測試用例,所有要把同一個接口的py腳本封裝成方法,每一個接口封裝成一個接口類。
3、用testsuite直接調用這些接口類,構造測試集;或利用unittest自動識別測試用例,TestLoader類中提供的discover()方法。
(命名規則:接口名稱要以test_XXX開頭)
就好把所有的接口測試用例連起來構建自動化測試了。
4、最后利用HTMLTestRunner生成測試報告。
PUT:上傳指定的URL,一般是修改,可以理解為數據庫中的update。
DELETE:刪除指定資源。
在接口測試中,一般來說,post創建數據,get獲取創建成功后的所有數據和指定的數據,put可以對創建成功后的數據 進行修改,delete是指定的資源。
目錄結構:
單個接口測試例子:
post(修改)
import requestsimport jsondef get_token():url1 = "https://**********/Token/get"content = {'appId':'***','appSecret':'******'}web = requests.get(url=url1,params=content)print(web.url)print(web.text)ty = web.texta = json.loads(ty)b = a.get('Data')apptoken = b.get('Token')return apptokenif __name__ == '__main__':get_token()復制代碼
get(查詢)
import requestsimport jsondef test_qualification_add():url = "http://xxx.xxx.xxx/audit/api/xxx/get" #測試的接口urlheaders = {"Content-Type":"application/json"}data = { #接口傳送的參數"token": "abcdefg","id": 1,"param": {"QuId":1}}r = requests.post(url = url,json = data,headers = headers) #發送請求#return r.jsonprint (r.text) #獲取響應報文print (r.status_code)if __name__=="__main__":test_qualification_add()復制代碼
其中requests.post和requests.request兩種寫法,都可以實現請求。
在進行接口測試的過程中對傳入的參數進行邊界值測試、錯誤推導測試、等價類測試等測試方法進行測試。那么一個接口就要設很多測試用例。
【點擊打開下方小卡片無償領取200G軟件測試全套資料】【軟件測試全套資料】包括:(軟件測試理論教程、App測試教程、接口測試教程、Linux教程、MySQL教程、Python編程基礎教程、APP自動化教程、項目實戰、Web自動化教程、接口自動化教程、測試框架技術教程、持續集成教程、自動化測試開發教程、測試用例、性能測試教程、安全測試教程、高頻面試題、簡歷模板合集)
?編輯【網盤資源】200G功能測試+自動化教程, 簡歷模版,高頻面試真題【無償分享】10 贊同 · 10 評論文章
下面是封裝為接口類的例子:
(一個接口地址一個類,每一個方法是一條測試用例)
(setUp()、tearDown()方法會分別作用于每個測試用例的開始和結束,如果每個類中的setUp()、tearDown(),所做的事情一樣,那么可以封裝一個自己的測試類,如代碼:)\
import requestsimport jsonimport unittestclass MyTest(unittest.TestCase): #封裝測試環境的初始化和還原的類def setUp(self): #放對數據可操作的代碼,如對mysql、momgodb的初始化等,這里不對數據庫進行操作!print("start test")passdef tearDown(self): #與setUp()相對print("end test")passclass test_xxx_get(MyTest): #把這個接口封裝一個類,下面的方法是具體的測試用例'''接口名稱:獲取資質''' #這個描述接口名稱def test_xxx_get(self):'''測試用例1:哈哈''' #這個描述接口用例名稱self.url = "http://xxx.xxx.xxx/audit/api/xxx/get" #請求urlself.headers = {"Content-Type":"application/json"}self.data = { #請求參數"token": "abcdefg","id": 1,"param": {"QuId": 14}} #self.用在方法屬性中,表示是該方法的屬性,不會影響其他方法的屬性。r = requests.post(url = self.url,json = self.data,headers = self.headers)#return r.json()print (self.r.text)print (self.r.status_code)self.assertIn("true",self.r.text) #斷言判斷接口返回是否符合要求,可以寫多個斷言!if __name__=="__main__":unittest.main()復制代碼
unittest提供了全局的main()方法,使用它可以方便的將一個單元測試木塊變成可以直接運行的測試腳本;
main()方法使用TestLoader類來搜索所有包含在該木塊中以“test”命名開頭的測試方法,并自動執行它;\
執行方法的默認順序是:根據ASCII碼的順序加載測試用例,數字與字母的順序為:0-9,A-Z,a-z。所以以A開頭的測試用例方法會優先執行,以a開頭會后執行。
所以每一個接口類、測試用例要以test*命名,如下圖:
(測試用例放在同一個文件夾:)
\
runtest.py寫法:
import unittestimport jsonimport requestsfrom HTMLTestRunner import HTMLTestRunnerimport time#加載測試文件 (有幾多個接口就加載幾多個,一個一個加進來)import test_creative_addimport test_creative_getimport test_qualification_addimport test_qualification_getimport test_qualification_reflesh#構造測試集suite = unittest.TestSuite() #實例化#TestSuite類的addTest()方法把不同測試類中的測試方法組裝到測試套件中。#增加測試用例==》接口文件名.接口類(方法也就是這個接口的其他用例),要把每一個測試用例都增加進來!!!suite.addTest(test_creative_add.test_creative_add("test_creative_add")) #增加創意suite.addTest(test_creative_get.test_creative_get("test_creative_get")) #獲取創意suite.addTest(test_qualification_add.test_qualification_add("test_qualification_add"))#增加資質suite.addTest(test_qualification_get.test_qualification_get("test_qualification_get"))#獲取資質suite.addTest(test_qualification_reflesh.test_qualification_reflesh("test_qualification_reflesh"))#更新資質if __name__=="__main__":testunit = unittest.TestSuite()testunit.addTest(suite)#按照一定的格式獲取當前的時間now = time.strftime("%Y-%m-%d %H_%M_%S")#定義報告存放路徑filename = './' + now + 'test_result.html'fp = open(filename,"wb")#定義測試報告runner = HTMLTestRunner(stream = fp,title = "xxx接口測試報告",description = "測試用例執行情況:")#運行測試runner.run(testunit)fp.close() #關閉文件對象把數據寫進磁盤復制代碼
如果有幾百條測試用例,在runtest腳本中一個個增加測試用例,那么就很麻煩啦,其實用discover()一步就搞掂了。
discover函數介紹:
discover(start_dir,pattern=’test*.py’,top_level_dir=None)
找到指定目錄下所有測試模塊,并可遞歸查到子目錄下的測試木塊,只有匹配到的文件名才會被加載。如果啟動的不是頂層目錄,那么頂層目錄必然單獨指定。
start_dir:要測試的木塊名或測試用例的目錄。
pattent=‘test?.py’:表示用例文件名的匹配原則。此處匹配文件名一test開頭的所有.py類型文件,?表示任意多個字符。
top_level_dir=None :測試木塊的頂層目錄,如果沒有頂層目錄,默認為None。
這里測試用例都放在同一個目錄,都以test*.py的形式!!(如上圖)\
runtest2.py寫法:
import unittestimport jsonimport requestsfrom HTMLTestRunner import HTMLTestRunnerimport time#定義測試用例的目錄為當前目錄test_dir = './'discover = unittest.defaultTestLoader.discover(test_dir,pattern = 'test*.py')if __name__=="__main__":#按照一定的格式獲取當前的時間now = time.strftime("%Y-%m-%d %H-%M-%S")#定義報告存放路徑filename = './' + now + 'test_result.html'fp = open(filename,"wb")#定義測試報告runner = HTMLTestRunner(stream = fp,title = "xxx接口測試報告",description = "測試用例執行情況:")#運行測試runner.run(discover)fp.close() #關閉報告文件復制代碼
整合自動化測試發送測試報告:
runtest_mail.py
import unittestimport requestsfrom HTMLTestRunner import HTMLTestRunnerimport timeimport osimport smtplibfrom email.mime.text import MIMETextfrom email.header import Header#======定義發送郵件========def send_mail(file_new):f = open(file_new,'rb')mail_body = f.read()f.close()msg = MIMEText(mail_body,'html','utf-8')msg['Subject'] = Header('xxx接口自動化測試報告','utf-8')smtp = smtplib.SMTP()smtp.connect('smtp.sina.com')smtp.login('xxx@sina.com','xxx336..')smtp.sendmail('xxx@sina.com','10xxx6@qq.com',msg.as_string())smtp.quit()print('郵件已發出!注意查收。')#======查找測試目錄,找到最新生成的測試報告======def new_report(test_report):lists = os.listdir(test_report)lists.sort(key=lambda fn:os.path.getmtime(test_report + '\' + fn))file_new = os.path.join(test_report,lists[-1])print(file_new)return file_newif __name__ == "__main__":test_dir = "D:\dsp_testpro\test_case"test_report = "D:\dsp_testpro\test_report"discover = unittest.defaultTestLoader.discover(test_dir,pattern = 'test*.py')#按照一定的格式獲取當前的時間now = time.strftime("%Y-%m-%d_%H-%M-%S-")#定義報告存放路徑filename = test_report + "\" + now + 'result.html'fp = open(filename,'wb')#定義測試報告runner = HTMLTestRunner(stream = fp,title = "xxx接口測試報告",description = "測試用例執行情況:")#運行測試runner.run(discover)fp.close() #關閉報告文件new_report = new_report(test_report)send_mail(new_report)復制代碼
綿薄之力
最后感謝每一個認真閱讀我文章的人,看著粉絲一路的上漲和關注,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走
軟件測試面試資料
被百萬人刷爆的軟件測試題庫!!!誰用誰知道!!!卷起來!
?
這些資料,對于想進階【自動化測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!凡事要趁早,特別是技術行業,一定要提升技術功底。希望對大家有所幫助…….