項目背景:html
XXXX銀行項目採用的是B/S架構,主要是爲了解決銀行業務中的櫃員、憑證、現金、帳務等來自存款、貸款、會計模塊的管理。前端
手工弊端:web
1.項目業務複雜度高,迴歸測試工做量大
2.單個接口功能比較簡單,容易實現自動化集成,且相對UI更穩定,更能達到監控項目質量的目的
3.從先後端分離的角度說,只依賴前端限制並不能知足安全要求json
優化方案及工具選擇:後端
Postman:api
功能強大Chrome插件,界面好看響應格式自主選擇,缺點支持的協議單一且不能數據分離,比較麻煩的還有不是全部的公司都能上谷歌
SoupUI:安全
支持多協議(http\soup\rest等),能實現功能和性能測試的開源接口測試工具,靈活性高可在此基礎上開發腳本,缺點上手比較難
Jmeter:服務器
Java御用的接口壓力測試工具,作接口功能測試有點大材小用,缺點不能生成可視化的接口測試報告cookie
綜上:手動開發比較合適session
框架原理:
採用數據驅動模式,將數據和業務邏輯分離,完成測試用例編寫-》測試用例執行-》測試報告發送的目的
測試用例格式編寫以下:
代碼實現:
注:爲了數據脫敏,以百度翻譯接口爲例
1.讀取測試用例數據data.py
# coding=utf-8 import json import xlrd import sys reload(sys) sys.setdefaultencoding('utf-8') def tableToJson(): source = xlrd.open_workbook(r"C:\Users\HP\Desktop\0608\InterfaceData.xlsx") table = source.sheet_by_index(0) list = [] # 字典列表 totalList = [] # json列表 for i in xrange(1,2): #獲取第i個表第2行起的值做爲用例的參數 keys = table.col_values(1) # 獲取第i個表第2列的值 keys.pop(0) for j in xrange(3, table.ncols): test_value = table.col_values(j) # 獲取第i個表第4列起的值做爲用例的參數值 test_value.pop(0) for k in range(len(test_value)): s = test_value[k] # print s data = dict(zip(keys, test_value)) # 等長兩列表轉爲字典 list.append(data) data = {} data[table.name] = list list = [] data_to_json = json.dumps(data, ensure_ascii=False, encoding="gb2312") # 將列表中的unicode轉中文 print u"用例數據:", data_to_json totalList.append(data_to_json) return totalList if __name__ == '__main__': jsonData = tableToJson() # 寫入文件 f = open(r"F:\TestData0618.json", 'w+') for i in jsonData: f.write(i) f.write('\n') f.close()
運行結果:
2.執行測試用例test.py
#coding=utf-8 import requests import unittest import json class MyTest(unittest.TestCase): # 封裝測試環境的初始化和還原的類 def setUp(self): print("start test") def tearDown(self): print("end test") class Test_transapi(MyTest): # 一個接口封裝一個類 @staticmethod def getParams(): Data = open(r"F:\TestData0618.json").read() temp = eval(Data) #type(Data)爲str,type(temp)爲dict data = temp['2100'] return data def test_transapi(self): self.url = "http://fanyi.baidu.com/v2transapi" self.headers = { 'Host': 'fanyi.baidu.com', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, sdch, br', 'Accept-Language': 'zh-CN,zh;q=0.8', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive'} data = self.getParams() for i in data: print i self.params = i #print u'參數:',self.params r = requests.get(url=self.url, params=self.params,headers=self.headers) #print (r.text) print (r.status_code) self.assertEqual(200,r.status_code) if __name__=="__main__": unittest.main()
運行結果:
3.構建測試報告run.py
#coding=utf-8 from HTMLTestRunner import HTMLTestRunner import time import unittest #定義測試用例的目錄爲當前目錄 test_dir = r'C:\Users\HP\Desktop\0608' discover = unittest.defaultTestLoader.discover(test_dir,pattern = 'test*.py') if __name__=="__main__": #按照必定的格式獲取當前的時間 now = time.strftime("%Y-%m-%d %H-%M-%S") #定義報告存放路徑 filename =test_dir + '/' + now + 'test_result.html' fp = open(filename,"wb") #定義測試報告 runner = HTMLTestRunner(stream = fp, title = u"2100接口測試報告", description = u"測試用例執行狀況:") #運行測試 runner.run(discover) fp.close() #關閉報告文件
運行結果:
4.發送測試報告send.py
#coding=utf-8 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart def SendMail(subject,msg,to_addrs,from_addr,smtp_addr,password): ''' @subject:郵件主題 @msg:郵件內容 @to_addrs:收信人的郵箱地址 @from_addr:發信人的郵箱地址 @smtp_addr:smtp服務地址,能夠在郵箱看,好比163郵箱爲smtp.163.com @password:發信人的郵箱密碼 ''' mail_msg = MIMEMultipart() #建立一個帶附件實例 #構造附件test.docx att1 = MIMEText(open(r'C:\Users\HP\Desktop\0608\2017-06-18 22-33-24test_result.html','rb').read(), 'base64', 'gb2312') att1["Content-Type"] = 'application/octet-stream' att1.add_header('Content-Disposition', 'attachment', filename=u'測試報告.html'.encode('gbk')) mail_msg.attach(att1) #構建MIMEText純文本內容 txt = MIMEText(msg,'plain', 'utf-8') mail_msg.attach(txt) mail_msg['Subject'] = subject mail_msg['From'] =from_addr mail_msg['To'] = ','.join(to_addrs) try: s = smtplib.SMTP() s.connect(smtp_addr) #鏈接smtp服務器 s.login(from_addr,password) #登陸郵箱 s.sendmail(from_addr, to_addrs, mail_msg.as_string()) #發送郵件 s.quit() print "success" except Exception,e: print str(e) if __name__ == '__main__': from_addr = "XXX" smtp_addr = "XXX" to_addrs = ["XXX"] subject = "send test" password = "XXX" msg = "hello,this is just a send test" SendMail(subject,msg,to_addrs,from_addr,smtp_addr,password)
運行結果:
5.定時執行測試用例
問題和挑戰:
1.接口文檔更新不及時,致使用例數據可能與實際須要的有所出入。推薦使用SwaggerUI工具管理接口測試文檔
2.大部分用例執行以前爲了安全須要保證已登陸,簡單的將cookie加入請求頭無論用,用session
3.測試報告用的是通用版(一個腳本一條記錄),全部現狀將一個接口下全部用例都寫在一個腳本里只會有一條記錄
4.郵件中文附件名稱亂碼