用Python實現數據驅動的接口自動化測試
在接口測試的過程中,很多時候會用到對CSV的讀取操作,本文主要說明Python3對CSV的寫入和讀取。
1. 需求
某API,GET方法,token,mobile,email三個參數
- token為必填項
- mobile,email 必填其中1項
- mobile為手機號,email為email格式
2. 方案
針對上面的API,在做接口測試時,需要的測試用例動輒會多達10+, 這個時候采用數據驅動的方式將共性的內容寫入配置文件或許會更合適。
這里考慮把API、參數、以及預期結果預行在格式化的CSV里保存,利用csv組件從CSV里讀取URL、參數以及預期結果,Requests組件發起請求,將響應結果與預期結果進行比對,***把比對結果寫到結果CSV。
流程如下圖
3. 實現
(1) 在上代碼之前,先安裝好如下幾個組件:
- csv 讀寫CSV文件
- json
- requests 發起請求,獲取響應結果
- unittest 測試用例調度
(2) data.csv(本示例選取部分用例)
(3) reader_CSV函數代碼示例
- import csv
- import json
- import requests
- import time
- import unittest
- def readCSV(self,filename):
- '''
- :param filename: 需要讀取的數據文件
- :return: [{data1},{data2}...]
- '''
- datas = []
- try:
- #以DictReader的方式讀取數據文件,方便與json互做轉換
- with open(filename,'r') as csvfile :
- #從文件里讀取到的數據轉換成字典列表的格式
- reader = csv.DictReader(csvfile)
- for row in reader:
- data = {}
- data['id'] = row['id']
- data['url'] = row['url']
- data['token'] = str(row['token'])
- data['mobile'] = row['mobile']
- data['email'] = row['email']
- data['expect'] = json.dumps(row['expect']) \
- if isinstance(row['expect'],dict) \
- else row['expect'] #如果expect讀取出來的不是json則取其原值,否則轉為json格式保存到result里
- datas.append(data)
- return datas
- #如果文件找不到,返回空的datas
- except FileNotFoundError:
- print("文件不存在",filename)
- return datas
(4) request_URL函數示例(包含GET請求和POST請求2個方法)
- def get_request(self,url,params):
- '''
- 通用的調用GET接口方法
- :param url:string 接口路徑
- :param params:{"":"","":""} 需要傳入的參數
- :return: response響應體
- '''
- print("調用API...")
- r = requests.get(url,paramsparams=params)
- print(r.text)
- return r
- def post_request(self,url,params):
- '''
- 通用的調用POST接口方法
- :param url: string 接口路徑
- :param params: {"":"","":""} 需要傳入的參數
- :return:response響應體
- '''
- print("調用API...")
- r = requests.post(url,params=json.dumps(params)) #post的方法必須用json.dumps()轉化成json格式
- print(r.text)
- return r
(5) assert_Result函數示例
- def assertResult(self,except_value,real_value):
- '''
- 校驗樣本字符串中是否包含指定字符串
- :param except_value: string 指定字符串
- :param real_value: string 樣本字符串
- :return: Boolean 樣本中包含指定字符串返回True,否則返回False
- '''
- ifsuccess = except_value in str(real_value)
- return ifsuccess
(6) write_CSV函數示例
- def writeCSV(self,filename,results):
- '''
- 寫入csv文件指定內容
- :param filename: string 需要寫入的文件名稱
- :param results: [{data1},{data2},...] 寫入的內容
- :return: 無
- '''
- print("寫文件:",filename)
- #以DictWriter的方式寫文件
- with open(filename,'w+') as csvfile:
- headers="id,url,token,mobile,email,expect,real_value,assert_value".split(",")
- writer = csv.DictWriter(csvfile,fieldnames=headers)
- #寫表頭
- writer.writeheader()
- #寫數據
- if results.__len__() > 0 :
- for result in results:
- writer.writerow(result)
- csvfile.close()
(7) test_interface1函數示例
- def test_interface1(self):
- #指定讀取的數據文件名稱
- data_file = "../data/data.csv"
- #指定最終結果生成的數據文件名稱
- result_file = "../data/result_{}.csv".format(str(time.time()).split(".")[0])
- #讀取指定文件的數據
- datas = self.readCSV(data_file)
- #數據文件有內容則調用接口,否則直接測試結束
- if datas.__len__() > 0:
- results =[]
- #獲取數據文件里的每一行
- for testcase in datas :
- result = {}
- result["id"] = testcase["id"]
- result["url"] = testcase["url"]
- result["token"] = testcase["token"]
- result["mobile"] = testcase["mobile"]
- result["email"] = testcase["email"]
- result["expect"] = testcase["expect"]
- #組裝參數
- params = {
- "token":result["token"],
- "mobile":result["mobile"],
- "email":result["email"]
- }
- #調用API接口,獲取響應結果
- real_value = self.get_request(result["url"],params)
- #調用assert方法,檢查預期結果是否在響應結果中存在
- assert_value = self.assertResult(result["expect"],real_value.text)
- result["real_value"] = real_value.text
- result["assert_value"] = assert_value
- #獲取每一行里的所有字段以及實際結果和驗證結果
- results.append(result)
- #執行完所有記錄后,將所有結果寫入result.csv
- self.writeCSV(result_file,results) #寫入csv文件
- print("測試結束")
8result_1523956055.csv(本示例中的測試結果請忽略)
4. 總結
python封裝了很多方法,對于測試來說開發速度相對較快,接口自動化測試如果采用CSV管理的數據驅動方式,使用csv+requests是測試開發不容錯過的利器之一。
【本文是51CTO專欄機構“豈安科技”的原創文章,轉載請通過微信公眾號(bigsec)聯系原作者】