大家在接口測試的過程中,很多時候會用到對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 csvimport jsonimport requestsimport timeimport unittestdef 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#如果文件找不到,返回空的datasexcept 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 rdef 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.textresult["assert_value"] = assert_value#獲取每一行里的所有字段以及實際結果和驗證結果results.append(result)#執行完所有記錄后,將所有結果寫入result.csvself.writeCSV(result_file,results) #寫入csv文件print("測試結束")
8、result_1523956055.csv(本示例中的測試結果請忽略)
總結
python封裝了很多方法,對于測試來說開發速度相對較快,接口自動化測試如果采用CSV管理的數據驅動方式,使用csv+requests是測試開發不容錯過的利器之一。
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
????????????? 【下面是我整理的2023年最全的軟件測試工程師學習知識架構體系圖】
一、Python編程入門到精通
二、接口自動化項目實戰?
三、Web自動化項目實戰

四、App自動化項目實戰?
五、一線大廠簡歷

六、測試開發DevOps體系?
七、常用自動化測試工具
八、JMeter性能測試?
九、總結(尾部小驚喜)
生命不息,奮斗不止。每一份努力都不會被辜負,只要堅持不懈,終究會有回報。珍惜時間,追求夢想。不忘初心,砥礪前行。你的未來,由你掌握!
生命短暫,時間寶貴,我們無法預知未來會發生什么,但我們可以掌握當下。珍惜每一天,努力奮斗,讓自己變得更加強大和優秀。堅定信念,執著追求,成功終將屬于你!
只有不斷地挑戰自己,才能不斷地超越自己。堅持追求夢想,勇敢前行,你就會發現奮斗的過程是如此美好而值得。相信自己,你一定可以做到!?
最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
這些資料,對于【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴上萬個測試工程師們走過最艱難的路程,希望也能幫助到你!?