前言
大家在接口測試的過程中,很多時候會用到對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,params=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("測試結束")
~~~
8、result_1523956055.csv(本示例中的測試結果請忽略)

總結
python封裝了很多方法,對于測試來說開發速度相對較快,接口自動化測試如果采用CSV管理的數據驅動方式,使用csv+requests是測試開發不容錯過的利器之一。
- 序言
- python 實現登錄網頁的操作方法
- Python爬蟲信息輸入及頁面的切換方法
- 利用Python如何實現數據驅動的接口自動化測試
- python 重定向獲取真實url的方法
- 解決Python網頁爬蟲之中文亂碼問題
- 利用Python yagmail三行代碼實現發送郵件
- Python實現查看系統啟動項功能示例
- Python利用splinter實現瀏覽器自動化操作方法
- 解決python3 json數據包含中文的讀寫問題
- python 識別圖片中的文字信息方法
- python實現對文件中圖片生成帶標簽的txt文件方法
- Python之批量創建文件的實例講解
- Python 使用PIL numpy 實現拼接圖片的示例
- 用python處理圖片之打開\顯示\保存圖像的方法
- 對python append 與淺拷貝的實例講解
- Python3讀取Excel數據存入MySQL的方法
- 詳解Django之admin組件的使用和源碼剖析
- admin組件使用
- admin源碼解析
- Python中pillow知識點學習
- Python裝飾器原理與用法分析
- Python實現的根據文件名查找數據文件功能示例
- Python開發的10個小貼士