前言html
這個季度初的時候,咱們公司管理層提出了全面提高部門技術水準的要求,而做爲項目開發流程中最重要的一環——測試,咱們也是有本身的技術追求的,因此爲了,由原來的業務功能測試轉變成自動化測試。以前大多都是手工進行,利用postman和fiddler進行抓包和截取數據,後來,通過你們的討論,決定基於python學習,開始搞接口自動化,通過你們的努力,這套自動化框架目前已經基本完成了,因而進行一些總結,便於之後回顧溫習,有許多不完善的地方,你們能夠留言一塊兒討論研究,共同進步。python
首先,咱們能夠捋一捋思路,想想接口測試的流程json
其次,選擇合適的框架bash
流程清晰以後,咱們須要選擇一個合適的框架,因而選擇了Python3+requests+unittest框架網絡
Requests模塊發送http的網絡請求,請求類型主要包含了post,get, PUT,DELETE,HEAD架構
python+unittest單元測試框架構成,和測試報告生成(HTMLTestRunner)框架
框架詳解不在此贅述,requests可參考 點擊前往函數
unittest參考 點擊前往post
基於以上,咱們來一步步搭建咱們的框架。在這個過程當中,咱們須要作到業務和數據的分離,這樣才能靈活,達到咱們寫框架的目的。接下來,咱們來進行結構的劃分。單元測試
咱們的結構是這樣的
log:存放生成的日誌文件
base:存放公共的方法
report:存放生成的自動化測試報告
testcase:存放測試腳本
接下來,公共方法的開發
總體結構有了劃分,接下來就該一步步的填充整個框架了,咱們先來看看Base文件中的公共類或函數,這主要用於後續測試case的調用,全部公共的、一成不變的數據均可以放在這裏,維護也方便
配置文檔以下
[DATABASE]
data_address = ./data/
report_address = ./report/
[HTTP]
base_url = http://xxx.xx
複製代碼複製代碼
想知道怎樣從配置文檔中獲得或寫入相應的數據嗎?那繼續看吧
import os
import configparser
# 獲取當前py文件地址
proDir = os.path.split(os.path.realpath(__file__))[0]
# 組合config文件地址
configPath = os.path.join(proDir,"config.ini")
class ReadConfig:
def __init__(self):
#獲取當前路徑下的配置文件
self.cf = configparser.ConfigParser()
self.cf.read(configPath)
def get_config(self,field,key):
#獲取配置文件中的key值
result = self.cf.get(field,key)
return result
def set_config(self,field,key,value):
#向配置文件中寫入配置信息
fb = open(configPath,'w')
self.cf.set(field,key,value)
self.cf.write(fb)
複製代碼複製代碼
那問題又來了,咱們的測試數據放在哪裏?怎麼取值?怎麼寫入?怎麼保存?。。。
別急,接着往下看
測試數據優先考慮放在excel或database中,此處以excel爲例作個簡單介紹
這裏須要用到兩個操做表格的庫,xlrd數據驅動的讀取,做用於excel文檔,但xlrd不能寫入數據,因此引入xlutils數據驅動的讀取和寫入
安裝方法能夠用pip3 install xlrd和pip3 install xlutils 來安裝。
import xlrd
import xlutils.copy
from Base.readConfig import ReadConfig
import time
class ReadExcel:
def __init__(self,section,field,sheet):
# 打開工做表,並定位到sheet
data_address = ReadConfig().get_config(section,field)
workbook = xlrd.open_workbook(data_address)
self.table = workbook.sheets()[sheet]
def get_rows(self):
# 獲取excel行數
rows = self.table.nrows
return rows
def get_cell(self,row,col):
# 獲取單元格數據
cell_data = self.table.cell(row,col).value
return cell_data
def get_col(self,col):
# 獲取整列數據
col_data = self.table.col_value(col)
return col_data
class WriteExcel:
def __init__(self,section,field,sheet):
# 打開工做表
self.address = ReadConfig().get_config(section,field)
self.workbook = xlrd.open_workbook(self.address)
self.wf = xlutils.copy.copy(self.workbook)
self.ws = self.wf.get_sheet(sheet)
def set_cell(self,row,col,value):
#設置單元格數據
self.ws.write(row,col,value)
def save_excel(self,filename,format):
#獲取當前時間
self.time = time.strftime("%Y%m%d%H%M%S", time.localtime())
#生成文件的文件名及格式
self.report = filename + '_' +self.time + format
#保存文件
self.wf.save(self.report)
複製代碼複製代碼
而後,測試腳本的編輯
一切準備就緒,下面經過一個簡單的、完整的代碼進行演示公共函數的調用,框架的使用及報告的生成
import unittest
import requests
from Base.readConfig import ReadConfig
from Base.readExcel import ReadExcel
from Base.readExcel import WriteExcel
#實例化
readexcel = ReadExcel('DATABASE','data_address',0)
writeexcel = WriteExcel('DATABASE','data_address',0)
class testcase(unittest.TestCase):
#初始化
def setUp(self):
#獲取url
self.base_url = ReadConfig().get_config('HTTP', 'base_url')
self.url = self.base_url + readexcel.get_cell(1,1)
#獲取請求頭
self.headers = readexcel.get_cell(1,4)
def test_case(self):
nok = 0
ner = 0
# 循環讀取excel中的測試數據,進行結果驗證,並生成excel形式的測試報告
for i in range(3,readexcel.get_rows()):
#發送網絡請求,獲得響應值
response = requests.post(self.url, headers=self.headers, data=readexcel.get_cell(i,4).encode('utf-8'))
actualresult = response.json()
#獲取excel中的預期結果
expectresult = eval(readexcel.get_cell(i,6))
# 獲取需驗證的數據
key = eval(readexcel.get_cell(i, 5))
keylen = len(key)
j = 0
for k in range(keylen):
aresult = 'actualresult' + key[k]
eresult = 'expectresult' + key[k]
if eval(aresult) == eval(eresult):
#預期結果和實際結果一致
j = j + 1
if j == keylen:
#測試數據執行經過
nok = nok + 1
writeexcel.set_cell(i, 8, 'SUCCESS')
else:
# 測試數據執行失敗,並將實際結果寫入excel
ner = ner + 1
writeexcel.set_cell(i, 8, 'FAILURE')
writeexcel.set_cell(i, 7, str(actualresult))
print('第', i + 1, '行用例執行失敗:預期結果是', expectresult, '實際結果是', actualresult)
# 保存測試報告
writeexcel.save_excel('testreport', '.xls')
print('測試數據中總共', nok, '條用例執行經過', ner, '條用例執行失敗')
#釋放資源
def tearDown(self):
pass
if __name__ == '__main__':
#構造測試集合
suite = unittest.TestSuite()
suite.addTest(testcase('test_case'))
#建立html文件
filename = ReadConfig().get_config('DATABASE', 'report_address') + 'testreport.html'
fb = open(filename,"wb")
#執行測試並生成html測試報告
runner = HTMLTestRunner.HTMLTestRunner(stream = fb,description = '針對接口的描述信息',title = '某某的自動化測試報告')
runner.run(suite)
#關閉文件
fb.close()
複製代碼複製代碼
最後,生成的html報告
以上是最近總結的部分紅果,但願對你們有幫助,後續會陸續更新,也請你們多多留言,互相交流互相成長