简陋版:基于python的自动化测试框架开发
項目背景:
XXXX銀行項目采用的是B/S架構(gòu),主要是為了解決銀行業(yè)務(wù)中的柜員、憑證、現(xiàn)金、賬務(wù)等來自存款、貸款、會計模塊的管理。
?
手工弊端:
1.項目業(yè)務(wù)復(fù)雜度高,回歸測試工作量大
2.單個接口功能比較簡單,容易實現(xiàn)自動化集成,且相對UI更穩(wěn)定,更能達到監(jiān)控項目質(zhì)量的目的
3.從前后端分離的角度說,只依賴前端限制并不能滿足安全要求
?
優(yōu)化方案及工具選擇:
Postman:
功能強大Chrome插件,界面好看響應(yīng)格式自主選擇,缺點支持的協(xié)議單一且不能數(shù)據(jù)分離,比較麻煩的還有不是所有的公司都能上谷歌
SoupUI:
支持多協(xié)議(http\soup\rest等),能實現(xiàn)功能和性能測試的開源接口測試工具,靈活性高可在此基礎(chǔ)上開發(fā)腳本,缺點上手比較難
Jmeter:
Java御用的接口壓力測試工具,做接口功能測試有點大材小用,缺點不能生成可視化的接口測試報告
綜上:手動開發(fā)比較合適
?
框架原理:
采用數(shù)據(jù)驅(qū)動模式,將數(shù)據(jù)和業(yè)務(wù)邏輯分離,完成測試用例編寫-》測試用例執(zhí)行-》測試報告發(fā)送的目的
測試用例格式編寫如下:
?
代碼實現(xiàn):
注:為了數(shù)據(jù)脫敏,以百度翻譯接口為例
1.讀取測試用例數(shù)據(jù)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行起的值作為用例的參數(shù)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列起的值作為用例的參數(shù)值 test_value.pop(0)for k in range(len(test_value)):s = test_value[k]# print sdata = dict(zip(keys, test_value)) # 等長兩列表轉(zhuǎn)為字典 list.append(data)data = {}data[table.name] = listlist = []data_to_json = json.dumps(data, ensure_ascii=False, encoding="gb2312") # 將列表中的unicode轉(zhuǎn)中文print u"用例數(shù)據(jù):", data_to_jsontotalList.append(data_to_json)return totalListif __name__ == '__main__':jsonData = tableToJson()# 寫入文件f = open(r"F:\TestData0618.json", 'w+')for i in jsonData:f.write(i)f.write('\n')f.close()運行結(jié)果:
?
2.執(zhí)行測試用例test.py
#coding=utf-8 import requests import unittest import jsonclass MyTest(unittest.TestCase): # 封裝測試環(huán)境的初始化和還原的類def setUp(self):print("start test")def tearDown(self):print("end test")class Test_transapi(MyTest): # 一個接口封裝一個類 @staticmethoddef getParams():Data = open(r"F:\TestData0618.json").read()temp = eval(Data) #type(Data)為str,type(temp)為dictdata = temp['2100']return datadef 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 iself.params = i#print u'參數(shù):',self.paramsr = 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()運行結(jié)果:
?
3.構(gòu)建測試報告run.py
#coding=utf-8 from HTMLTestRunner import HTMLTestRunner import time import unittest#定義測試用例的目錄為當(dāng)前目錄 test_dir = r'C:\Users\HP\Desktop\0608' discover = unittest.defaultTestLoader.discover(test_dir,pattern = 'test*.py') if __name__=="__main__": #按照一定的格式獲取當(dāng)前的時間 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"測試用例執(zhí)行情況:") #運行測試 runner.run(discover) fp.close() #關(guān)閉報告文件運行結(jié)果:
4.發(fā)送測試報告send.py
#coding=utf-8import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipartdef SendMail(subject,msg,to_addrs,from_addr,smtp_addr,password):'''@subject:郵件主題@msg:郵件內(nèi)容@to_addrs:收信人的郵箱地址@from_addr:發(fā)信人的郵箱地址@smtp_addr:smtp服務(wù)地址,可以在郵箱看,比如163郵箱為smtp.163.com@password:發(fā)信人的郵箱密碼'''mail_msg = MIMEMultipart() #創(chuàng)建一個帶附件實例#構(gòu)造附件test.docxatt1 = 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)#構(gòu)建MIMEText純文本內(nèi)容txt = MIMEText(msg,'plain', 'utf-8')mail_msg.attach(txt)mail_msg['Subject'] = subjectmail_msg['From'] =from_addrmail_msg['To'] = ','.join(to_addrs)try:s = smtplib.SMTP()s.connect(smtp_addr) #連接smtp服務(wù)器s.login(from_addr,password) #登錄郵箱s.sendmail(from_addr, to_addrs, mail_msg.as_string()) #發(fā)送郵件 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)運行結(jié)果:
?
5.定時執(zhí)行測試用例
?詳見Jenkins安裝與使用
?
問題和挑戰(zhàn):
1.接口文檔更新不及時,導(dǎo)致用例數(shù)據(jù)可能與實際需要的有所出入。推薦使用SwaggerUI工具管理接口測試文檔
2.大部分用例執(zhí)行之前為了安全需要保證已登錄,簡單的將cookie加入請求頭不管用,用session
3.測試報告用的是通用版(一個腳本一條記錄),所有現(xiàn)狀將一個接口下所有用例都寫在一個腳本里只會有一條記錄
4.郵件中文附件名稱亂碼
?
轉(zhuǎn)載于:https://www.cnblogs.com/Ryana/p/7027489.html
總結(jié)
以上是生活随笔為你收集整理的简陋版:基于python的自动化测试框架开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kafka Java consumer动
- 下一篇: python 正则表达式学习笔记