Python+unittest+requests接口自動化測試框架搭建 完整的框架搭建過程

首先配置好開發環境,下載安裝Python并下載安裝pycharm,在pycharm中創建項目功能目錄。如果不會的可以百度Google一下,該內容網上的講解還是比較多比較全的!

大家可以先簡單了解下該項目的目錄結構介紹,后面會針對每個文件有詳細注解和代碼。

common:

——configDb.py:這個文件主要編寫數據庫連接池的相關內容,本項目暫未考慮使用數據庫來存儲讀取數據,此文件可忽略,或者不創建。本人是留著以后如果有相關操作時,方便使用。

——configEmail.py:這個文件主要是配置發送郵件的主題、正文等,將測試報告發送并抄送到相關人郵箱的邏輯。

——configHttp.py:這個文件主要來通過get、post、put、delete等方法來進行http請求,并拿到請求響應。

——HTMLTestRunner.py:主要是生成測試報告相關

——Log.py:調用該類的方法,用來打印生成日志

result:

——logs:生成的日志文件

——report.html:生成的測試報告

testCase:

——test01case.py:讀取userCase.xlsx中的用例,使用unittest來進行斷言校驗

testFile/case:

——userCase.xlsx:對下面test_api.py接口服務里的接口,設計了三條簡單的測試用例,如參數為null,參數不正確等

caselist.txt:配置將要執行testCase目錄下的哪些用例文件,前加#代表不進行執行。當項目過于龐大,用例足夠多的時候,我們可以通過這個開關,來確定本次執行哪些接口的哪些用例。

config.ini:數據庫、郵箱、接口等的配置項,用于方便的調用讀取。

getpathInfo.py:獲取項目絕對路徑

geturlParams.py:獲取接口的URL、參數、method等

readConfig.py:讀取配置文件的方法,并返回文件中內容

readExcel.py:讀取Excel的方法

runAll.py:開始執行接口自動化,項目工程部署完畢后直接運行該文件即可

test_api.py:自己寫的提供本地測試的接口服務

test_sql.py:測試數據庫連接池的文件,本次項目未用到數據庫,可以忽略

二、Python+unittest+requests+HTMLTestRunner完整的接口自動化測試框架搭建_01——測試接口服務

首先,我們想搭建一個接口自動化測試框架,前提我們必須要有一個可支持測試的接口服務。有人可能會說,現在我們的環境不管測試環境,還是生產環境有現成的接口。但是,一般工作環境中的接口,不太滿足我們框架的各種條件。舉例如,接口a可能是get接口b可能又是post,等等等等。因此我決定自己寫一個簡單的接口!用于我們這個框架的測試!

按第一講的目錄創建好文件,打開test_api.py,寫入如下代碼

import flask
import json
from flask import request'''
flask: web框架,通過flask提供的裝飾器@server.route()將普通函數轉換為服
'''
# 創建一個服務,把當前這個python文件當做一個服務
server = flask.Flask(__name__)
# @server.route()可以將普通函數轉變為服務 登錄接口的路徑、請求方式
@server.route('/login', methods=['get', 'post'])
def login():# 獲取通過url請求傳參的數據username = request.values.get('name')# 獲取url請求傳的密碼,明文pwd = request.values.get('pwd')# 判斷用戶名、密碼都不為空if username and pwd:if username == 'xiaoming' and pwd == '111':resu = {'code': 200, 'message': '登錄成功'}return json.dumps(resu, ensure_ascii=False) # 將字典轉換字符串else:resu = {'code': -1, 'message': '賬號密碼錯誤'}return json.dumps(resu, ensure_ascii=False)else:resu = {'code': 10001, 'message': '參數不能為空!'}return json.dumps(resu, ensure_ascii=False)if __name__ == '__main__':server.run(debug=True, port=8888, host='127.0.0.1')

執行test_api.py,在瀏覽器中輸入http://127.0.0.1:8888/login?name=xiaoming&pwd=11199回車,驗證我們的接口服務是否正常~  

?變更我們的參數,查看不同的響應結果確認接口服務一切正常

?三、Python+unittest+requests+HTMLTestRunner完整的接口自動化測試框架搭建_02——配置文件讀取

在我們第二講中,我們已經通過flask這個web框架創建好了我們用于測試的接口服務,因此我們可以把這個接口抽出來一些參數放到配置文件,然后通過一個讀取配置文件的方法,方便后續的使用。同樣還有郵件的相關配置~

按第一講的目錄創建好config.ini文件,打開該文件寫入如下:

# -*- coding: utf-8 -*-
[HTTP]
scheme = http
baseurl = 127.0.0.1
port = 8888
timeout = 10.0[EMAIL]
on_off = on;
subject = 接口自動化測試報告
app = Outlook
addressee = songxiaobao@qq.com
cc = zhaobenshan@qq.com

在HTTP中,協議http,baseURL,端口,超時時間。

在郵件中on_off是設置的一個開關,=on打開,發送郵件,=其他不發送郵件。subject郵件主題,addressee收件人,cc抄送人。

在我們編寫readConfig.py文件前,我們先寫一個獲取項目某路徑下某文件絕對路徑的一個方法。按第一講的目錄結構創建好getpathInfo.py,打開該文件

import osdef get_Path():path = os.path.split(os.path.realpath(__file__))[0]return pathif __name__ == '__main__':# 執行該文件,測試下是否OKprint('測試路徑是否OK,路徑為:', get_Path())

填寫如上代碼并執行后,查看輸出結果,打印出了該項目的絕對路徑:

繼續往下走,同理,按第一講目錄創建好readConfig.py文件,打開該文件,以后的章節不在累贅

import os
import configparser
import getpathInfo#引入我們自己的寫的獲取路徑的類path = getpathInfo.get_Path()#調用實例化,還記得這個類返回的路徑為C:\Users\songlihui\PycharmProjects\dkxinterfaceTest
config_path = os.path.join(path, 'config.ini')#這句話是在path路徑下再加一級,最后變成C:\Users\songlihui\PycharmProjects\dkxinterfaceTest\config.ini
config = configparser.ConfigParser()#調用外部的讀取配置文件的方法
config.read(config_path, encoding='utf-8')class ReadConfig():def get_http(self, name):value = config.get('HTTP', name)return valuedef get_email(self, name):value = config.get('EMAIL', name)return valuedef get_mysql(self, name):#寫好,留以后備用。但是因為我們沒有對數據庫的操作,所以這個可以屏蔽掉value = config.get('DATABASE', name)return valueif __name__ == '__main__':#測試一下,我們讀取配置文件的方法是否可用print('HTTP中的baseurl值為:', ReadConfig().get_http('baseurl'))print('EMAIL中的開關on_off值為:', ReadConfig().get_email('on_off'))

執行下readConfig.py,查看數據是否正確

?一切OK

四、Python+unittest+requests+HTMLTestRunner完整的接口自動化測試框架搭建_03——讀取Excel中的case

配置文件寫好了,接口我們也有了,然后我們來根據我們的接口設計我們簡單的幾條用例。首先在前兩講中我們寫了一個我們測試的接口服務,針對這個接口服務存在三種情況的校驗。正確的用戶名和密碼,賬號密碼錯誤和賬號密碼為空

?我們根據上面的三種情況,將對這個接口的用例寫在一個對應的單獨文件中testFile\case\userCase.xlsx ,userCase.xlsx內容如下:

?緊接著,我們有了用例設計的Excel了,我們要對這個Excel進行數據的讀取操作,繼續往下,我們創建readExcel.py文件

import os
import getpathInfo# 自己定義的內部類,該類返回項目的絕對路徑
#調用讀Excel的第三方庫xlrd
from xlrd import open_workbook
# 拿到該項目所在的絕對路徑
path = getpathInfo.get_Path()class readExcel():def get_xls(self, xls_name, sheet_name):# xls_name填寫用例的Excel名稱 sheet_name該Excel的sheet名稱cls = []# 獲取用例文件路徑xlsPath = os.path.join(path, "testFile", 'case', xls_name)file = open_workbook(xlsPath)# 打開用例Excelsheet = file.sheet_by_name(sheet_name)#獲得打開Excel的sheet# 獲取這個sheet內容行數nrows = sheet.nrowsfor i in range(nrows):#根據行數做循環if sheet.row_values(i)[0] != u'case_name':#如果這個Excel的這個sheet的第i行的第一列不等于case_name那么我們把這行的數據添加到cls[]cls.append(sheet.row_values(i))return cls
if __name__ == '__main__':#我們執行該文件測試一下是否可以正確獲取Excel中的值print(readExcel().get_xls('userCase.xlsx', 'login'))print(readExcel().get_xls('userCase.xlsx', 'login')[0][1])print(readExcel().get_xls('userCase.xlsx', 'login')[1][2])
結果為:

完全正確~?

五、Python+unittest+requests+HTMLTestRunner完整的接口自動化測試框架搭建_04——requests請求配置文件有了,讀取配置文件有了,用例有了,讀取用例有了,我們的接口服務有了,我們是不是該寫對某個接口進行http請求了,這時候我們需要使用pip install requests來安裝第三方庫,在common下configHttp.py,configHttp.py的內容如下:

 
import requests
import jsonclass RunMain():def send_post(self, url, data):  # 定義一個方法,傳入需要的參數url和data# 參數必須按照url、data順序傳入result = requests.post(url=url, data=data).json()  # 因為這里要封裝post方法,所以這里的url和data值不能寫死res = json.dumps(result, ensure_ascii=False, sort_keys=True, indent=2)return resdef send_get(self, url, data):result = requests.get(url=url, params=data).json()res = json.dumps(result, ensure_ascii=False, sort_keys=True, indent=2)return resdef run_main(self, method, url=None, data=None):  # 定義一個run_main函數,通過傳過來的method來進行不同的get或post請求result = Noneif method == 'post':result = self.send_post(url, data)elif method == 'get':result = self.send_get(url, data)else:print("method值錯誤!!!")return resultif __name__ == '__main__':  # 通過寫死參數,來驗證我們寫的請求是否正確result1 = RunMain().run_main('post', 'http://127.0.0.1:8888/login', {'name': 'xiaoming','pwd':'111'})result2 = RunMain().run_main('get', 'http://127.0.0.1:8888/login', 'name=xiaoming&pwd=111')print(result1)print(result2)

執行該文件,驗證結果正確性:

?我們發現和瀏覽器中進行請求該接口,得到的結果一致,說明沒有問題,一切OK

六、Python+unittest+requests+HTMLTestRunner完整的接口自動化測試框架搭建_05——參數動態化

在上一講中,我們寫了針對我們的接口服務,設計的三種測試用例,使用寫死的參數(result = RunMain().run_main('post', 'http://127.0.0.1:8888/login', 'name=xiaoming&pwd='))來進行requests請求。本講中我們寫一個類,來用于分別獲取這些參數,來第一講的目錄創建geturlParams.py,geturlParams.py文件中的內容如下:

import readConfig as readConfigreadconfig = readConfig.ReadConfig()class geturlParams():# 定義一個方法,將從配置文件中讀取的進行拼接def get_Url(self):new_url = readconfig.get_http('scheme') + '://' + readconfig.get_http('baseurl') + ':8888' + '/login' + '?'#logger.info('new_url'+new_url)return new_urlif __name__ == '__main__':# 驗證拼接后的正確性print(geturlParams().get_Url())

通過將配置文件中的進行拼接,拼接后的結果:http://127.0.0.1:8888/login?和我們請求的一致


????????????? 【下面是我整理的2023年最全的軟件測試工程師學習知識架構體系圖】


一、Python編程入門到精通

二、接口自動化項目實戰

三、Web自動化項目實戰


四、App自動化項目實戰

五、一線大廠簡歷


六、測試開發DevOps體系

七、常用自動化測試工具


八、JMeter性能測試

九、總結(尾部小驚喜)

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

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

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

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

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

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

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

相關文章

docker 可視化工具操作說明 portainer

官網地址 https://docs.portainer.io/start/install-ce/server/docker/linux 1.First, create the volume that Port docker volume create portainer_data2.下載并安裝容器 docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restartalways -v /var/run/docker…

PWN動態調試

這篇文章就是來教大家學習怎么動態調試的,然后我還寫了一篇關于動態調試的文章,不是buu上面的題,就是兩道簡單的棧溢出問題,那兩道題挺有特點的。大家可以去看看。 每日3道PWN之課外2道(第2.5天)-CSDN博客 …

C#暫停和恢復(Thread.Suspend()和Thread.Resume() vs AutoResetEvent()和EventWaitHandle())

目錄 一、Thread.Suspend()和Thread.Resume() 二、AutoResetEvent()和EventWaitHandle() 1.AutoResetEvent() 2.EventWaitHandle() 3.示例及生成效果 一、Thread.Suspend()和Thread.Resume() 自 .NET 2.0 以后(含),Thread.Suspend() 和…

性能監控體系:InfluxDB Grafana Prometheus

InfluxDB 簡介 什么是 InfluxDB ? InfluxDB 是一個由 InfluxData 開發的,開源的時序型數據庫。它由 Go 語言寫成,著力于高性能地查詢與存儲時序型數據。 InfluxDB 被廣泛應用于存儲系統的監控數據、IoT 行業的實時數據等場景。 可配合 Te…

SSD基礎架構與NAND IO并發問題探討

在我們的日常生活中,我們經常會遇到一些“快如閃電”的事物:比如那場突如其來的雨、那個突然出現在你眼前的前任、還有就是今天我們要聊的——固態硬盤(SSD)。 如果你是一個技術宅,或者對速度有著近乎偏執的追求&…

電阻知識總結與詳細選型指南

目錄 1. 基礎知識 1.1 電阻的定義和符號 1.2 電阻的公式 1.3 電阻的串聯與并聯 2. 參數選型 2.1 電阻值 2.2 功率 2.3 精度 2.4 溫度系數 2.5 電壓系數 2.6 包裝類型 2.7 耐壓 2.8 特殊應用需求 2.9 環保要求 3. 產品應用 3.1 電流限制和保護 3.2 電壓分壓和電…

【Qt開發流程】之容器類1:介紹及常用容器類和使用Java風格迭代器進行遍歷

概述 Qt庫提供了一組通用的基于模板的容器類。這些類可用于存儲指定類型的項。例如&#xff0c;如果需要一個可調整大小的QString數組&#xff0c;可以使用QVector<QString>。 這些容器類被設計成比STL容器更輕、更安全、更易于使用。如果不熟悉STL&#xff0c;或者更喜…

低多邊形3D建模石頭材質紋理貼圖

在線工具推薦&#xff1a; 3D數字孿生場景編輯器 - GLTF/GLB材質紋理編輯器 - 3D模型在線轉換 - Three.js AI自動紋理開發包 - YOLO 虛幻合成數據生成器 - 三維模型預覽圖生成器 - 3D模型語義搜索引擎 當談到游戲角色的3D模型風格時&#xff0c;有幾種不同的風格&#xf…

云計算在計算機領域的應用與發展

云計算在計算機領域的應用與發展 一、引言 隨著科技的不斷發展&#xff0c;計算機領域已經成為當今社會最為活躍和創新的領域之一。云計算作為一種新興的計算模式&#xff0c;已經在計算機領域中得到了廣泛的應用&#xff0c;并且正在不斷地推動著計算機領域的發展。本文將探…

Ultimate VFX

Ultimate VFX 構建套件:

【利用二手車數據進行可視化分析】

利用二手車數據進行可視化分析 查看原始數據去除重復數據需求分析1.統計全國總共有多少量二手車&#xff0c;用KPI圖進行展示2.統計安徽總共有多少量二手車&#xff0c;用KPI圖進行展示3.統計合肥總共有多少量二手車&#xff0c;用KPI圖進行展示4.取最貴的10輛二手車信息&#…

web,Apache簡述

一.HTTP請求訪問的完整過程 1.建立連接 2.接收請求 3.處理請求 4.訪問資源 服務器獲取請求報文中請求的資源web服務器&#xff0c;即存放了web資源的服務器&#xff0c;負責向請求者提供對方請求的靜態資源&#xff0c;或動態運行后生成的資源 靜態資源&#xff1a;不需要…

C語言 內聯函數 + 遞歸函數

函數分類 內聯函數 1&#xff09;內聯函數在編譯時將函數的代碼直接插入到調用它的地方&#xff0c;而不是通過函數調用的方式執行&#xff0c;從而減少了函數調用的開銷&#xff0c;提高了代碼的執行速度 2&#xff09;使用 inline 關鍵字來聲明 3&#xff09;將函數聲明為內聯…

小目標檢測模型設計的一點思考

1. 小目標的特性 目標之間的交疊概率比較低&#xff0c;即使有交疊&#xff0c;其IoU多數情況下也是比較小的 AI-TOD Tiny Person Dateset 小目標自身的紋理顯著度有強弱區別&#xff0c;但是總體來說紋理特征都較弱&#xff0c;很多時候需要借助一定的圖像上下文來幫助確認 …

Java解決島嶼周長問題

Java解決島嶼周長問題 01 題目 給定一個 row x col 的二維網格地圖 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陸地&#xff0c; grid[i][j] 0 表示水域。 網格中的格子 水平和垂直 方向相連&#xff08;對角線方向不相連&#xff09;。整個網格被水完全包圍&am…

ssm校園論壇管理系統項目分享

校園論壇管理系統是基于java編程語言&#xff0c;mysql數據庫&#xff0c;ssm框架和idea工具開發&#xff0c;本系統主要分為學生用戶&#xff0c;管理員兩個角色&#xff0c;其中用戶可以注冊登陸系統&#xff0c;在線發帖&#xff0c;查看欄目帖子&#xff0c;回復帖子&#…

某音上很火的圣誕樹分享

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 效果截圖&#xff08;這里不給動態了&#xff0c;某音到處都是了&#xff09;&#xff1a; 源代碼&#xff1a; <script src"…

Spring Boot 3 集成 MyBatis詳解

MyBatis是一款開源的持久層框架&#xff0c;它極大地簡化了與數據庫的交互流程。與類似Hibernate的ORM框架不同&#xff0c;MyBatis更具靈活性&#xff0c;允許開發者直接使用SQL語句與數據庫進行交互。Spring Boot和MyBatis分別是兩個功能強大的框架&#xff0c;它們的協同使用…

Linux shell編程學習筆記34:eval 命令

0 前言 在JavaScript語言中&#xff0c;有一個很特別的函數eval&#xff0c;eval函數可以將字符串當做 JavaScript 代碼執行&#xff0c;返回表達式或值。 在Linux Shell 中也提供了內建命令eval&#xff0c;它是否具有JavaScript語言中eval函數的功能呢&#xff1f; 1 eval命…

GPIO的使用--USART串口通信--傳感器控制數據

目錄 一、串口通信 1、概念 2、原理圖 3、使用步驟 &#xff08;1&#xff09;尋找串口位置 &#xff08;2&#xff09;確定引腳編號 &#xff08;3&#xff09;編寫代碼 4、實驗結果 實驗代碼 main.c usart.c usart.h 一、串口通信 1、概念 串行接口是一種可以將…