簡陋版:基於python的自動化測試框架開發


項目背景:

  XXXX銀行項目采用的是B/S架構,主要是為了解決銀行業務中的櫃員、憑證、現金、賬務等來自存款、貸款、會計模塊的管理。

 

手工弊端:

1.項目業務復雜度高,回歸測試工作量大
2.單個接口功能比較簡單,容易實現自動化集成,且相對UI更穩定,更能達到監控項目質量的目的
3.從前后端分離的角度說,只依賴前端限制並不能滿足安全要求

 

優化方案及工具選擇:

Postman:

  功能強大Chrome插件,界面好看響應格式自主選擇,缺點支持的協議單一且不能數據分離,比較麻煩的還有不是所有的公司都能上谷歌
SoupUI:

  支持多協議(http\soup\rest等),能實現功能和性能測試的開源接口測試工具,靈活性高可在此基礎上開發腳本,缺點上手比較難
Jmeter:

  Java御用的接口壓力測試工具,做接口功能測試有點大材小用,缺點不能生成可視化的接口測試報告

綜上:手動開發比較合適

 

框架原理:

采用數據驅動模式,將數據和業務邏輯分離,完成測試用例編寫-》測試用例執行-》測試報告發送的目的

測試用例格式編寫如下:

 

代碼實現:

注:為了數據脫敏,以百度翻譯接口為例

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.定時執行測試用例

 詳見Jenkins安裝與使用

 

問題和挑戰:

1.接口文檔更新不及時,導致用例數據可能與實際需要的有所出入。推薦使用SwaggerUI工具管理接口測試文檔

2.大部分用例執行之前為了安全需要保證已登錄,簡單的將cookie加入請求頭不管用,用session

3.測試報告用的是通用版(一個腳本一條記錄),所有現狀將一個接口下所有用例都寫在一個腳本里只會有一條記錄

4.郵件中文附件名稱亂碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM