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 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性能測試?

九、總結(尾部小驚喜)

生命不息,奮斗不止。每一份努力都不會被辜負,只要堅持不懈,終究會有回報。珍惜時間,追求夢想。不忘初心,砥礪前行。你的未來,由你掌握!

生命短暫,時間寶貴,我們無法預知未來會發生什么,但我們可以掌握當下。珍惜每一天,努力奮斗,讓自己變得更加強大和優秀。堅定信念,執著追求,成功終將屬于你!

只有不斷地挑戰自己,才能不斷地超越自己。堅持追求夢想,勇敢前行,你就會發現奮斗的過程是如此美好而值得。相信自己,你一定可以做到!?

最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:

這些資料,對于【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴上萬個測試工程師們走過最艱難的路程,希望也能幫助到你!?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210796.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210796.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210796.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python在線讀取傳奇列表,并解析為需要的JSON格式

python在線讀取傳奇列表,并解析為需要的JSON格式,以下為傳奇中使用的TXT列表格式, [Server] ; 使用“/”字符分開顏色,也可以不使用顏色,支持以前的舊格式,只有標題和服務器標題支持顏色 ; 標題/顏色代碼(0-255)|服務器標題/顏色代碼(0-255)|服務器名稱|服務器IP|服務器端…

探索人工智能領域——每日20個名詞詳解【day13】

目錄 前言 正文 總結 🌈嗨!我是Filotimo__🌈。很高興與大家相識,希望我的博客能對你有所幫助。 💡本文由Filotimo__??原創,首發于CSDN📚。 📣如需轉載,請事先與我聯系以…

Axure網頁端高交互組件庫, 下拉菜單文件上傳穿梭框日期城市選擇器

作品說明 組件數量:共 11 套 兼容軟件:Axure RP 9/10,不支持低版本 應用領域:web端原型設計、桌面端原型設計 作品特色 本作品為「web端組件庫」,高保真高交互 (帶仿真功能效果);運用了動態面板、中繼…

UniGui使用CSSUniTreeMenu滾動條

有些人反應UniTreeMenu當菜單項目比較多的時候會超出但是沒有出滾動條,只需要添加如下CSS 老規矩,unitreemeu的layout的componentcls里添加bbtreemenu,然后在css里添加 .bbtreemenu .x-box-item{ overflow-y: auto; } 然后當內容超出后就會…

【數據結構第 6 章 ②】- 用 C 語言實現鄰接矩陣

目錄 一、鄰接矩陣表示法 二、AMGraph.h 三、AMGraph.c 四、Test.c 【數據結構第 6 章 ① 】- 圖的定義和基本術語-CSDN博客 由于圖的結構比較復雜,任意兩個頂點之間都可能存在聯系,因此無法以數據元素在存儲區中的物理位置來表示元素之間的關系&…

SpringCloud網關介紹

一、Gateway簡介 1、官網 上一代zuul 1.X:https://github.com/Netflix/zuul/wiki 當前gateway:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/ 2、是什么 SpringCloud Gateway是SpringCloud的一個全…

.NET Core 依賴注入 Microsoft.Extensions.DependencyInjection

文章目錄 前言什么是依賴注入C# 使用依賴注入框架介紹 Microsoft.Extensions.DependencyInjectionNuget安裝簡單單例使用打印結果 自動裝配舉例自動裝配測試用例打印結果自動裝配執行順序測試用例有歧義構造函數漸進式構造函數循環依賴 自動裝配結論 手動裝配手動注入別名注入 …

Git:版本控制的藝術與實踐

引言: 在軟件開發領域,版本控制是至關重要的一環。它幫助我們跟蹤代碼的變化、管理團隊協作、回溯歷史記錄以及解決沖突等。而Git作為目前最流行的分布式版本控制系統,已經成為了開發者們的必備工具。本文將深入探討Git的核心概念、常用命令以…

使用Docker安裝Superset并設置Oracle訪問和使用PG作Meta數據庫

一、安裝 Docker 安裝一個linux,可以是Centos或Ubuntu,如果是Centos 7.X,那么要注意先將系統自帶的docker先刪除。下文以Centos7.9為例 #刪除自帶的不完整版本 yum remove docker docker-client docker-client-latest \docker-common docker-…

調用win32 api獲取電腦名字和系統目錄

學習一下幾個函數的功能,和調用方式; void CBasenameView::OnDraw(CDC* pDC) {CBasenameDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;TCHAR myname1[50], myname2[50], mydirname1[50], myd…

常見的Linux系統版本

在介紹常見的Linux系統版本之前,首先需要區分Linux系統內核與Linux發行套件系統的不同。Linux系統內核指的是一個由Linus Torvalds負責維護,提供硬件抽象層、硬盤及文件系統控制及多任務功能的系統核心程序。而Linux發行套件系統是我們常說的Linux操作系…

【Vue+Python】—— 基于Vue與Python的圖書管理系統

文章目錄 🍖 前言🎶一、項目描述?二、項目展示🏆三、撒花 🍖 前言 【VuePython】—— 基于Vue與Python的圖書管理系統 🎶一、項目描述 描述: 本項目為《基于Vue與Python的圖書管理系統》,項目…

Minio保姆級教程

轉載自:www.javaman.cn Minio服務器搭建和整合 1、centos安裝minio 1.1、創建安裝目錄 mkdir -p /home/minio1.2、在線下載minio #進入目錄 cd /home/minio #下載 wget https://dl.minio.io/server/minio/release/linux-amd64/minio1.3、minio配置 1.3.1、添加…

Flutter筆記:滑塊及其實現分析1

Flutter筆記 滑塊分析1 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 郵箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/134900784 本文從設計角度&#…

SQL命令---刪除字段

介紹 使用sql語句刪除表字段。 命令 alter table 表名 drop 字段名;例子 刪除a表中的name字段。 alter table a drop name;下面是執行刪除后的表結構:

微服務實戰系列之通信

前言 掰個指頭數一數,博主的“微服務實戰系列”從無到有,從零走到了十五。如果比作時鐘,剛好走過了一刻度。 當初為什么要做這個系列,博主想了又想,私以為作為當下軟件領域的幾個“hot spot”之一,又乘著…

探秘機器學習核心邏輯:梯度下降的迭代過程 (圖文詳解)

一 需求解函數 f() 和 g()函數分別為求y值和求導數的函數。 目的:求該函數的最小值: 代碼: import numpy as np import matplotlib.pyplot as plt f lambda x : (x - 3.5) ** 2 - 4.5 * x 10 g lambda x : 2 * (x - 3.5) - 4.5x np.l…

架構LAMP

目錄 1.什么是LAMP 2.LAMP組成及作用 3.搭建Apache httpd服務 4.編譯安裝mysqld 服務 5.編譯安裝PHP 解析環境 6.安裝論壇 1.什么是LAMP LAMP架構是目前成熟的企業網站應用模式之一,指的是協同工作的一整套系統和相關軟件,能夠提供動態Web站點服務…

MATLAB算法實戰應用案例精講-【人工智能】漫談自動駕駛

目錄 常用數據集 一、自動駕駛領域數據集 1. KITTI數據集 2.CityScapes數據集 3.BDD100K數據集

go與ioc

在Go開發服務端程序時,使用IoC(Inversion of Control)機制并不像在Java等語言中那樣普遍。Go語言的設計哲學傾向于簡潔和直接,更注重代碼的可讀性和可維護性。 在Go中,通常會使用依賴注入(Dependency Inje…