接口自動化測試框架-AIM

3天精通Postman接口測試,全套項目實戰教程!!

最近在做公司項目的自動化接口測試,在現有幾個小框架的基礎上,反復研究和實踐,搭建了新的測試框架。利用業余時間,把框架總結了下來。

AIM框架介紹

AIM,是Automatic Interface Monitoring的簡稱,即自動化接口監測。是一種基于python unittest的自動化接口測試框架。

設計思想

框架根據python語言的特點,結合了面向對象和面向函數編程。

以高效編程為主要目的,避免為了封裝而封裝。輕配置,重編碼。

接口測試的主要處理對象是參數。如果完全進行數據與代碼的分離,就會造成變量,傳參的冗余,降低編程效率。

于是從不做數據與代碼分離出發,對于需要復用的參數,提取到類之外,視需要進行數據與代碼的分離。

做到有的放矢。兼顧效率和復用性,迭代分離,更具實用性。

1552446647735

目錄結構

1557469790003

case:測試用例

common:公共函數,全局變量

config:配置路徑等

data:數據文件

result:測試結果

util:工具類

run.py:用例執行入口

run_mail.py:執行后自動發送郵件入口

case

BaseCase

所有Case的基類。

封裝了requests庫的post和get函數req,用于發送請求。

調用assertEqual等方法,封裝了用例的斷言。比如檢查接口返回flag,檢查接口狀態200,檢查值相等。

項目Case

測試系統的用例。按模塊分別建立文件編寫腳本。

Env.py:環境配置,包括url處理,登錄對象login實例(用戶名、密碼),數據庫對象dao實例(數據庫連接)。

Public.py:公共模塊。存放本系統公共的變量、函數、用例等。

common

Func.py:公共函數,比如獲取時間日期,獲取隨機數,處理參數。

Login.py:登錄模塊,屬于各系統通用,故放于此目錄下。包括密碼加密,驗證碼處理,強制登錄。

Var.py:全局變量。比如token。

config

RelativePath.py:配置目錄、文件的相對路徑。

data

echarts數據存儲csv文件,項目接口清單等。

result

log:日志。logging實現。支持輸出到文件和打印控制臺。文件暫時使用較少,主要打印控制臺便于調試。

接口調用記錄:輸出每個測試方法調用接口的記錄,包括參數、響應、耗時等。

自動化測試報告:HTMLTestRunner.py實現的html頁面報告。

util

AutoCode.py:自動生成結構化測試代碼。

CSV.py:csv相關函數封裝。比如輸出接口調用記錄。

Excel.py:讀取和存儲excel文件。

Format.py:格式化。比如把瀏覽器復制的參數格式化為代碼中帶有縮進的json。

HTMLTestRunner.py:用于輸出自動化測試報告。

Log.py:封裝日志方法。

Mysql.py:數據庫相關操作。

Parewise.py:結對測試。一種測試技術,后文詳述。

Request.py:核心工具,封裝接口發送請求。

Mail.py:發送郵件。

run.py

執行測試用例入口,可以選擇執行一個或多個系統,也可以執行一個系統中一個或多個模塊。

核心模塊

BaseCase.req

通過requests封裝的發送接口請求的方法。

定義在BaseCase類的內部。

參數說明
p將url、headers、body、method統一封裝到一個json里面進行處理。
method='post'默認為post方法。接口以post居多。
jsondata='json'默認json參數。post方法的json或data,純json使用json參數即可。對于receive_json這種dict,采用data參數。
loglevel=3默認為3。日志級別,輸出請求、響應信息到控制臺或接口調用記錄.csv。
rtext=None一些get請求會返回html或pdf,在控制臺或csv文件中影響顯示,可以指定文本進行替換。

發送請求,并計算耗時:

        start = time.clock()if method == 'post':  # 關閉SSL認證if jsondata == 'json':r = self.timeoutTry("requests.post(p['url'], headers=p['headers'], json=p['body'], verify=False)", p)elif jsondata == 'data':r = self.timeoutTry("requests.post(p['url'], headers=p['headers'], data=p['body'], verify=False)", p)else:print('jsondata錯誤')elif method == 'get':r = self.timeoutTry("requests.get(p['url'], headers=p['headers'], params=p['body'])", p)else:print('method錯誤')end = time.clock()elapsed = decimal.Decimal("%.2f" % float(end - start))

其中的self.timeoutTry是為了處理響應超時,會在后續博文中介紹。

Parewise

結對測試。接口參數一般是多個,于是比較適合采用parewise進行用例設計。

parewaise的概念可以百度一下。

大概意思就是,大多數的bug都是條件的兩兩組合造成的,parewise就是針對兩兩組合的情況,設計測試用例。

算法為,如果某一組用例的組合結果,在其他組合中均出現,就刪除該組用例,從而精簡用例。

windows下有微軟的PICT,txt文件錄入參數后,命名行執行,就出來結果了。

比如參數

1552448368346

執行后結果,只有31條,精簡了很多。

1552448425685

這個基本上一秒就出來結果了。

我自己參考網上算法寫的,就要慢的多。

估計后面有時間了再看看能不能調優。

parewise算法:

cp = []  # 笛卡爾積
s = []  # 兩兩拆分
for x in eval('itertools.product' + str(tuple(param_list))):cp.append(x)s.append([i for i in itertools.combinations(x, 2)])del_row = []
s2 = copy.deepcopy(s)
for i in range(len(s)):  # 對每個進行匹配t = 0for j in range(len(s[i])):  # 判斷所有同時都存在其他中 且位置相同for i2 in [x for x in range(len(s2)) if s2[x] != s[i]]:  # 其他 只比對有效flag = Falsefor j2 in range(len(s2[i2])):if s[i][j] == s2[i2][j2] and j == j2:t = t + 1flag = Truebreakif flag:breakif t == len(s[i]):del_row.append(i)s2.remove(s[i])return [cp[i] for i in range(len(cp)) if i not in del_row]

網上的例子是用的index函數。在我寫過程中,發現這里有個坑。比如list中存在相同元素,就始終返回前一個匹配的索引,結果就會有問題。我就完全避免了index函數。不知道哪個是對的,目前滿足使用需要,將就著用了。有點小尷尬。

Case

BaseCase斷言:

    def checkFlag(self, p, r):"""預期,實際"""err = str([p['url'], p['body'], r.text])try:b = Falseif (r.json()['flag'] in [1, '1', '', None, 'statistic_by_result', 0,"0", 'struct_product', 'v_select_jz_single']or r.json()['message'] in ("暫無數據", "未查詢到數據")):b = Trueself.assertEqual(True, b, msg=err)except (json.JSONDecodeError, KeyError):  # 1.返回的不是json,比如下載、404  2.無flagself.assertEqual(200, r.status_code, msg=err)

最簡單的一個測試用例:

from case.PyPlatform2_0_2.Public import *class Home(BaseCase):"""首頁"""def setUp(self):log(testname(self.__repr__()) + '\n')record([testname(self.__repr__())])def test(self):"""xxx"""self.req({"url": full_url("xxx"),"body": {}})

setup,輸出日志。

Token

因為公司登陸用的token,跟cookie類似,保留登陸狀態,避免重復登陸。

如何處理token也是框架設計的一個要點。

1557471452464

Env設置token,因為每個系統的登陸參數值都不一樣。

Var.token = login.get_token()

BaseCase.req在每次請求時獲取token,從而免登錄。

if "headers" not in p.keys():p['headers'] = {'token': ''}p['headers']['token'] = Var.token

CSV

寫文件:

if not os.path.exists(path):f = open(path, 'a', newline='')a = csv.writer(f)a.writerow(title)f.close()f = open(path, 'a', newline='')
a = csv.writer(f)
try:a.writerow(d)
except UnicodeEncodeError:d[4] = "Unicode隱藏"  # responsea.writerow(d)
f.close()if get_file_size(path) >= 50 * 1024 * 1024:  # 超過50M刪除文件os.remove(path)record(title)

traceback自動生成文件名:

def _sys_name():t = str(traceback.extract_stack())b = Truefor x in os.listdir(case_dir):if x not in ["BaseCase.py", "__pycache__"]:if x in t:return x + "接口調用記錄" + current_date() + ".csv"if b:print("request找不到sysname")print(t)

HTMLTestRunner

根據通用的版本,也是參考網上一些現有的美化代碼,綜合了一下,根據自己需求做了改造。

近20交易日測試通過率

1552449137641

加了一個echarts,把最近20交易日的測試通過率,通過折線走勢圖的方式展示出來。監測系統穩定性。

數據存放和讀取在data目錄的csv文件中。

統計表格

1552449314757

按項目進行分組統計,增加測試說明一列,按顏色區別測試結果狀態,可點擊查看詳細描述和錯誤信息。

同時優化了整體的樣式效果。

排序:

# 按照通過率從小到大排序
passrate_value = []
for key in passrate:if key != 'total':passrate_value.append(float(passrate[key].replace('%', '')))passrate_value.sort()

保存折線圖數據:

today = datetime.datetime.now().strftime('%Y-%m-%d')
if '--' not in names:  # 跑單個系統不存if dao_is_trade_date(today):  # 非交易日不存with open(self.rct20_path, "r") as f:  # 讀取數據lines = csv.reader(f)lines = list(lines)for lin in lines:lin[0] = lin[0].replace('月', '-')lin[0] = lin[0].replace('日', '')rct_data = lines# print(rct_data)nowdate = datetime.datetime.now().strftime('%m-%d')# 如果有重復日期,先刪l = len(rct_data)while l != 0 and nowdate == rct_data[l - 1][0]:rct_data.pop(l - 1)l = len(rct_data)for pt in self.passrate_tl:n = pt[0]v = pt[1]row = []row.append(str(nowdate))row.append(str(n))row.append(str(v).replace('%', ''))rct_data.append(row)# 只存近20條row_20 = len(names) * 20if len(rct_data) > row_20:  # 超過20條for i in range(0, len(names)):rct_data.pop(0)with open(self.rct20_path, 'w', newline='') as f:writer = csv.writer(f)writer.writerows(rct_data)

拼接折線圖數據用于展示:

while ri < len(rct_data):  # 遍歷 ->s_datascan = []while ri < len(rct_data) and rct_data[ri][0] == trade_date[di]:s_data[rct_data[ri][1]].append(rct_data[ri][2])scan.append(rct_data[ri][1])ri += 1chg = list(set(names) ^ set(scan))  # 差集for c in chg:s_data[c].append('--')  # 增加/減少的項目,為'--'di += 1series = []  # 系列序列
s_names = s_data.keys()
for k in s_names:s = {}  # 單個系列s['name'] = ks['type'] = 'line'if s_data != {}:s['data'] = s_data[k]series.append(s)

這部分代碼是很久之前寫的了,代碼應該是不夠簡潔、高效、規范滴,是可以優化滴。偷了懶沒有重構了。

用例設計

測試類型描述
冒煙測試所有接口寫單獨的test,確保調用正常。
全選測試將所有參數盡可能多的全選上,調用接口。
一定程序上可以彌補結對測試的不足。
結對測試如前文所述,關注兩兩組合的情況。

參數值,部分采用隨機數。也視需求,從數據庫或其他接口獲取數據。

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

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

相關文章

Orange的運維學習日記--28.Linux邏輯卷詳解

Orange的運維學習日記–28.Linux邏輯卷詳解 文章目錄Orange的運維學習日記--28.Linux邏輯卷詳解為什么使用 LVM基本概念創建物理卷創建卷組創建邏輯卷創建文件系統并掛載清理 LVM 對象擴展與縮減邏輯卷擴展 LV縮減 LV調整文件系統大小擴展 XFS 文件系統擴展 EXT4 文件系統縮減 …

AI大模型學習三十三、HeyGem.ai 服務端(ubuntu)docker 安裝 /客戶端(win)分離部署

一、說明服務端安裝官方安裝客戶端在windows 上安裝解決分離問題利用samba實現共享&#xff0c;我是在局域網訪問&#xff0c;安裝道理可以在非局域網訪問重新弄了一塊顯卡&#xff0c;所以驅動也重新裝下二、環境準備(base) mucunax58:~$ lsb_release -a No LSB modules are …

AI在安全方面的十個應用場景

人工智能&#xff08;AI&#xff09;正在重塑安全領域的“游戲規則”&#xff0c;把“被動防御”變成“主動狩獵”。綜合當前主流實踐與最新案例&#xff0c;可將其應用歸納為以下十大場景&#xff1a;威脅檢測與狩獵利用機器學習/深度學習模型對網絡流量、終端行為和云端日志進…

Android --- Bug調查經驗記錄

文章目錄1.布局中Pag不顯示的問題2.數據庫降級問題3.RecycleView 列表滑動卡頓1.布局中Pag不顯示的問題 在調查一個pag不顯示的問題&#xff0c;整體邏輯沒有問題&#xff0c;但是就是不顯示 pag不顯示的根本原因大概有文件找不到&#xff0c;一個是路徑問題&#xff0c;一個是…

【C語言】深度剖析指針(三):回調機制、通用排序與數組指針邏輯

文章目錄一、回調函數&#xff1a;通過函數指針實現靈活調用1.1 什么是回調函數&#xff1f;1.2 回調函數的實際應用&#xff1a;簡化計算器代碼二、qsort函數2.1 qsort函數的參數說明2.2 使用qsort排序整型數據2.3 使用qsort排序結構體數據示例&#xff1a;學生信息排序2.4 qs…

sql調優總結

sql調優 線上發現部分sql查詢時間過長。使用explain觀察是否命中表的索引。未命中索引&#xff0c;使用 TABLE add index 語句添加索引。 除此之外&#xff0c;單個字段命中聯合索引的情況也會導致查詢變慢 針對多個字段的查詢可添加聯合索引。 總結如下慢sql的原因&#xff1a…

如何在nuxt項目中使用axios進行網絡請求?

在 Nuxt 項目中使用 Axios 進行網絡請求有兩種常用方式&#xff1a;一是直接安裝 Axios 并全局配置&#xff0c;二是使用 Nuxt 官方推薦的 nuxtjs/axios 模塊&#xff08;更便捷&#xff09;。以下是詳細步驟&#xff1a; 方法一&#xff1a;使用官方推薦的 nuxtjs/axios 模塊&…

Unity 實現手機端和電腦項目在局域網內通信

電腦端啟動后自動廣播自身存在&#xff0c;手機端啟動后監聽廣播并發現服務器。發現后自動建立 UDP 連接&#xff0c;雙方可互發消息。內置心跳檢測&#xff0c;網絡中斷時會自動檢測并提示斷開using UnityEngine; using System.Net; using System.Net.Sockets; using System.T…

C++_389_定義一個禁用了賦值操作、具有線程同步資源保護的結構體,作為一些回調函數的參數,方便獲取響應操作的結果等信息

/* 回調參數。注意:此結構體禁用了賦值,會編譯報錯 */struct API_CALLBACK_T{public:API_CALLBACK_T(){eRet = e_fail;bWait = true;

uniapp基礎 (一)

目錄 UniApp 是什么&#xff1f;有什么優勢 跨平臺高效開發 Vue.js 技術生態 插件生態豐富 漸進式開發支持 UniApp 跨平臺兼容的實現原理 編譯時轉 運行時適配層 條件編譯 性能優化策略 1.預編譯模 2.原生組件混合渲 3.分包加載 UniApp 的生命周期鉤子有哪些&#x…

【圖像算法 - 10】進階入門:改進 YOLO11 安全帽檢測的關鍵參數與場景適配

一、項目背景與需求 視頻全文介紹 【圖像算法 - 10】進階入門&#xff1a;改進 YOLO11 安全帽檢測的關鍵參數與場景適配今天我們使用深度學習來訓練一個安全帽檢測系統&#xff0c;基于YOLO11的安全帽檢測系統。我們使用了兩萬張圖片的數據集訓練了這次的基于YOLO11的安全帽檢…

【C 學習】04.1-類型轉換浮點數

“知道做不到就是不知道”一、類型轉換1.自動類型轉換&#xff1a;當運算符&#xff08;常見、-、*、/、%&#xff09;兩邊出現不一致的類型時&#xff0c;編譯器會自動轉換成較大的&#xff08;范圍更大&#xff09;類型。從小到大&#xff1a;char-short-int-long-long long;…

基于反事實對比學習的魯棒圖像表征|文獻速遞-醫學影像算法文獻分享

Title題目Robust image representations with counterfactual contrastive learning基于反事實對比學習的魯棒圖像表征01文獻速遞介紹醫學影像中的對比學習已成為利用未標記數據的有效策略。這種自監督學習方法已被證明能顯著提升模型跨領域偏移的泛化能力&#xff0c;并減少訓…

機器學習(5):樸素貝葉斯分類算法

貝葉斯的核心思想就是&#xff0c;誰的概率高就歸為哪一類。貝葉斯推論P(A):先驗概率。即在B事件發生之前&#xff0c;我們對A事件概率的一個判斷。P(A|B)&#xff1a;后驗概率。即在B事件發生之后&#xff0c;我們對A事件概率的重新評估。P(B|A)/P(B)&#xff1a;可能性函數。…

Docker 容器內進行 frp 內網穿透

開始之前需要有一臺可以進行公網訪問的服務器 下載安裝 frp 這個直接到 github 官網就可以下載了 點擊Releases 就可以查看到可以下載的源&#xff0c;根據自己電腦的型號進行選擇就好了。 linux服務器上下載 如果是在linux的服務器上的話可以直接通過wget進行下載 例如&a…

復制網頁文字到Word、WPS文字?選中后直接拖放

要把網頁、PDF或其他應用中的文字內容復制到Word、WPS文字、記事本等&#xff0c;不一定要先復制、再粘貼&#xff0c;也可以選中文字后直接拖動到目標位置即可。多次操作&#xff0c;可以把窗口并排再拖動。如果你經常需要在不同應用之間引用文字&#xff0c;不妨試一試。操作…

Starrocks中的 Query Profile以及explain analyze及trace命令中的區別

背景 本文基于Starrocks 3.5.5 現有公司因為業務的不同&#xff0c;可能會更加關系單個SQL 的RT&#xff0c;因為如果一個SQL的RT比較大的話&#xff0c;影響的就是這個業務&#xff0c;從而影響收入&#xff0c;所以對于這方面我們就比較關心&#xff0c; 而最近在基于Starro…

網絡 —— 筆記本(主機)、主機虛擬機(Windows、Ubuntu)、手機(筆記本熱點),三者進行相互ping通

背景介紹最近在筆記本電腦上的虛擬機(Ubuntu、Windows Server搭配)上部署了"WD"開源手游服務器(舊版本)&#xff0c;手機連接上了筆記本電腦開啟的WIFI熱點&#xff0c;同時手機上安裝了"WD"手游客戶端。于是首先得保證網絡相互暢通才能玩游戲&#xff0c;…

裸露土堆識別準確率↑32%:陌訊多模態融合算法在生態監測的實戰解析

原創聲明本文為原創技術解析文章&#xff0c;涉及技術參數及架構描述均參考《陌訊技術白皮書》&#xff0c;禁止任何形式的轉載與抄襲。一、行業痛點&#xff1a;裸露土堆識別的現實挑戰在生態環境保護、建筑工地監管等場景中&#xff0c;裸露土堆的精準識別是遏制揚塵污染、防…

網站從HTTP升級到HTTPS網址方法

將網站從HTTP升級到HTTPS涉及幾個關鍵步驟&#xff0c;以確保安全連接以及用戶和搜索引擎的平穩過渡。獲取并安裝SSL/TLS證書&#xff1a;1、從CA機構授權提供商Gworg獲取SSL/TLS證書。選項包括域名驗證(DV)、組織驗證(OV)和擴展驗證(EV)證書&#xff0c;驗證嚴格度各不相同&am…