爆肝整理,Python自動化測試-Pytest參數化實戰封裝,一篇打通...

目錄:導讀

    • 前言
    • 一、Python編程入門到精通
    • 二、接口自動化項目實戰
    • 三、Web自動化項目實戰
    • 四、App自動化項目實戰
    • 五、一線大廠簡歷
    • 六、測試開發DevOps體系
    • 七、常用自動化測試工具
    • 八、JMeter性能測試
    • 九、總結(尾部小驚喜)


前言

參數化?
通俗點理解就是,定義一個測試類或測試函數,可以傳入不同測試用例對應的參數,從而執行多個測試用例。

例如:
對登錄接口進行測試,假設有3條用例,正確賬號正確密碼登錄、正確賬號錯誤密碼登錄、錯誤賬號正確密碼登錄,那么我們只需要定義一個登陸測試函數test_login(),然后使用這3條用例對應的參數去調用test_login()即可。

在unittest中可以使用ddt進行參數化,而pytest中也提供非常方便的參數化方式,即使用裝飾器@pytest.mark.parametrize()。

一般寫為pytest.mark.parametrize(“argnames”, argvalues)。
其中:
argnames為參數名稱,可以是單個或多個,多個寫法為"argname1, argname2, …";
argvalues為參數值,類型必須為list(單個參數時可以為元組,多個參數時必須為list,所以最好統一);

例如有下接口:
請求的登陸接口信息:

接口url:http://127.0.0.1:5000/login
請求方式:post
請求參數:
響應信息:

1、單個參數

只需要傳入一個參數時,示例如下:

# 待測試函數
def sum(a):return a+1# 單個參數
data = [1, 2, 3, 4]
@pytest.mark.parametrize("item", data)
def test_add(item):actual = sum(item)print("\n{}".format(actual))# assert actual == 3if __name__ == '__main__':pytest.main()

注意:
@pytest.mark.parametrize()中的第一個參數,必須以字符串的形式來標識測試函數的入參,如上述示例中,定義的測試函數test_login()中傳入的參數名為item,那么@pytest.mark.parametrize()的第一個參數則為"item"。

運行結果如下:

rootdir: E:\blog\python接口自動化\apiAutoTest, configfile: pytest.ini
plugins: html-2.1.1, metadata-1.10.0, ordering-0.6, rerunfailures-9.1.1
collecting ... collected 4 itemstest_case_2.py::test_add[1] PASSED                                       [ 25%]
2test_case_2.py::test_add[2] PASSED                                       [ 50%]
3test_case_2.py::test_add[3] PASSED                                       [ 75%]
4test_case_2.py::test_add[4] PASSED                                       [100%]
5============================== 4 passed in 0.02s ==============================

從結果可以看到,測試函數分別傳入了data中的參數,總共執行了5次。

2、多個參數

測試用例需傳入多個參數時,@pytest.mark.parametrize() 的第一個參數同樣是字符串, 對應用例的多個參數用逗號分隔。

示例:

import pytest
import requests
import json# 列表嵌套元組
data = [("lilei", "123456"), ("hanmeimei", "888888")]
# 列表嵌套列表
# data = [["lilei", "123456"], ["hanmeimei", "888888"]]@pytest.mark.parametrize("username, password", data)
def test_login(username, password):headers = {"Content-Type": "application/json;charset=utf8"}url = "http://127.0.0.1:5000/login"_data = {"username": username,"password": password}res = requests.post(url=url, headers=headers, json=_data).textres = json.loads(res)assert res['code'] == 1000if __name__ == '__main__':pytest.main()

需要注意:
代碼中data的格式,可以是列表嵌套列表,也可以是列表嵌套元組,列表中的每個列表或元組代表一組獨立的請求參數。
"username, password"不能寫成 “username”, “password”。

運行結果如下:

A1

從結果中我們還可以看到每次執行傳入的參數,如下劃線所示部分。

這里所舉示例是2個參數,傳入3個或更多參數時,寫法也同樣如此,一定要注意它們之間一一對應的關系,如下圖:

A2

3、對測試類參數化

上面所舉示例都是對測試函數進行參數化,那么對測試類怎么進行參數化呢?

其實,對測試類的參數化,就是對測試類中的測試方法進行參數化。

@pytest.mark.parametrize()中標識的參數個數,必須與類中的測試方法的參數一致。示例如下:

# 將登陸接口請求單獨進行了封裝,僅僅只是為了方便下面的示例
def login(username, password):headers = {"Content-Type": "application/json;charset=utf8"}url = "http://127.0.0.1:5000/login"_data = {"username": username,"password": password}res = requests.post(url=url, headers=headers, json=_data).textres = json.loads(res)return res# 測試類參數化
data = [("lilei", "123456"), ("hanmeimei", "888888")
]
@pytest.mark.parametrize("username, password", data)
class TestLogin:def test_login_01(self, username, password):res = login(username, password)assert res['code'] == 1000def test_login_02(self, username, password):res = login(username, password)assert res['msg'] == "登錄成功!"if __name__ == '__main__':pytest.main(["-s"])

運行結果如下:

A3

從結果中可以看出來,總共執行了4次,測試類中的每個測試方法都執行了2次,即每個測試方法都將data中的每一組參數都執行了一次。

注意:
這里還是要強調參數對應的關系,即@pytest.mark.parametrize()中的第一個參數,需要與測試類下面的測試方法的參數一一對應。

4、參數組合

在編寫測試用例的過程中,有時候需要將參數組合進行接口請求,如示例的登錄接口中username有 lilei、hanmeimei,password有 123456、888888,進行組合的話有下列四種情況:

{"username": "lilei", "password": "123456"}
{"username": "lilei", "password": "888888"}
{"username": "hanmeimei", "password": "123456"}
{"username": "hanmeimei", "password": "888888"}

在@pytest.mark.parametrize()也提供了這樣的參數組合功能,編寫格式示例如下:

import pytest
import requests
import jsonusername = ["lilei", "hanmeimei"]
password = ["123456", "888888"]@pytest.mark.parametrize("password", password)
@pytest.mark.parametrize("username", username)
def test_login(username, password):headers = {"Content-Type": "application/json;charset=utf8"}url = "http://127.0.0.1:5000/login"_data = {"username": username,"password": password}res = requests.post(url=url, headers=headers, json=_data).textres = json.loads(res)assert res['code'] == 1000if __name__ == '__main__':pytest.main()

運行結果如下:

rootdir: E:\blog\python接口自動化\apiAutoTest, configfile: pytest.ini
plugins: html-2.1.1, metadata-1.10.0, ordering-0.6, rerunfailures-9.1.1
collecting ... collected 4 itemstest_case_5.py::test_login[lilei-123456] PASSED                          [ 25%]
test_case_5.py::test_login[lilei-888888] FAILED                          [ 50%]
test_case_5.py::test_login[hanmeimei-123456] FAILED                      [ 75%]
test_case_5.py::test_login[hanmeimei-888888] PASSED                      [100%]
=========================== short test summary info ===========================
FAILED test_case_5.py::test_login[lilei-888888] - assert 1001 == 1000
FAILED test_case_5.py::test_login[hanmeimei-123456] - assert 1001 == 1000
========================= 2 failed, 2 passed in 0.18s =========================

從結果可以看出來,2個username、2個password 有4中組合方式,總執行了4次。如果是3個username、2個password,那么就有6中參數組合方式,依此類推。

注意:
以上這些示例中的測試用例僅僅只是用于舉例,實際項目中的登錄接口測試腳本與測試數據會不一樣。

5、增加測試結果可讀性

從示例的運行結果中我們可以看到,為了區分參數化的運行結果,在結果中都會顯示由參數組合而成的執行用例名稱,很方便就能看出來執行了哪些參數組合的用例。

示例:

A5

但這只是簡單的展示,如果參數多且復雜的話,僅僅這樣展示是不夠清晰的,需要添加一些說明才能一目了然。

因此,在@pytest.mark.parametrize()中有兩種方式來自定義上圖中劃線部分的顯示結果,即使用@pytest.mark.parametrize()提供的參數 ids 自定義,或者使用pytest.param()中的參數id自定義。

ids(推薦)
ids使用方法示例如下:

import pytest
import requests
import jsondata = [("lilei", "123456"), ("hanmeimei", "888888")]
ids = ["username:{}-password:{}".format(username, password) for username, password in data]
@pytest.mark.parametrize("username, password", data, ids=ids)
def test_login(username, password):headers = {"Content-Type": "application/json;charset=utf8"}url = "http://127.0.0.1:5000/login"_data = {"username": username,"password": password}res = requests.post(url=url, headers=headers, json=_data).textres = json.loads(res)assert res['code'] == 1000if __name__ == '__main__':pytest.main()

從編寫方式可以看出來,ids就是一個list,且它的長度與參數組合的分組數量一致。

運行結果如下:

A6

比較上面個執行結果,我們能看出ids自定義執行結果與默認執行結果展示的區別。使用過程中,需要根據實際情況來自定義。

id
使用方式示例如下:

import pytest
import requests
import jsondata = [pytest.param("lilei", "123456", id="correct username and correct password"),pytest.param("lilei", "111111", id="correct user name and wrong password")
]@pytest.mark.parametrize("username, password", data)
def test_login(username, password):headers = {"Content-Type": "application/json;charset=utf8"}url = "http://127.0.0.1:5000/login"_data = {"username": username,"password": password}res = requests.post(url=url, headers=headers, json=_data).textres = json.loads(res)assert res['code'] == 1000if __name__ == '__main__':pytest.main()

運行結果如下:

A7

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

一、Python編程入門到精通

請添加圖片描述

二、接口自動化項目實戰

請添加圖片描述

三、Web自動化項目實戰

請添加圖片描述

四、App自動化項目實戰

請添加圖片描述

五、一線大廠簡歷

請添加圖片描述

六、測試開發DevOps體系

請添加圖片描述

七、常用自動化測試工具

請添加圖片描述

八、JMeter性能測試

請添加圖片描述

九、總結(尾部小驚喜)

奮斗是一段漫長的旅程,痛苦與磨難只是通往成功的試煉。不懼困難,堅守信念,用汗水澆灌夢想的花朵。相信自己,勇往直前,你將創造屬于自己的輝煌,留下無悔的足跡!

執著的火焰燃燒內心,不屈的勇氣驅散黑暗。放下畏懼,迎接挑戰,奮斗的腳步不停歇。每一次努力鑄就堅韌,每一次拼搏開啟新篇章。勇往直前,追逐夢想。

人生的舞臺,唯有奮斗才能譜寫出絢麗的樂章。不要畏懼困難,要勇敢地迎接挑戰。堅持努力,永不放棄,相信自己的力量,你將創造出意想不到的精彩人生!

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

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

相關文章

uniapp案例30余種實戰項目

uniapp案例30余種實戰項目 mpvue框架仿滴滴出行didi-masteruni-app自定義導航欄title-customvue-mpvue-ChatRobot聊天機器人vue-mpvue-ChatRobot-master一款播課類小程序, 基于 mpvue 構建mp-podcast-mpvue-mastermpVue高仿美團小程序教程mpvue-meituan-masteruni-app 二維碼生…

【RS485 - 為什么要接收端計算時間偏移量】

我以前一直以為計算機等的信號傳輸速率都是非常快的,不用計算時間差。 然而在實際應用中發現信息是需要傳輸時間的,而這些時間somehow是可以計算的。 前提信息 波特率 9600; 控制器和執行器通過RS485通信; 控制器發出同步的命令…

spring框架,以及和spring框架相關的Java面試題和spring ioc的注入方式

目錄 一.spring來源,以及介紹 1.spring誕生的背景 2.spring框架 介紹 3.spring框架在使用中的優點以及不足 3.1優點 3.2不足 3.3總結 4.為什么要使用spring 二.將spring框架部署在IDEA中 1.替換pom.xml 2.構建spring所需要的xml文件 三.spring的三種注入…

網絡通信原理IP頭部格式(第四十二課)

字段作用解析:1)版本: 指的IP地址的版本 (IPv4 或 IPV6)2)首部長度: 次數據包的首部長度一共是多少,沒有加可選項3)優先級與服務類型:表示****數據包是否需要優選傳遞4)總長度: 表示的是整個數據包的大小,也就****是首部+數據5)標識符、標志、段偏移量:的作用將拆開的…

無涯教程-Perl - syswrite函數

描述 此函數嘗試將SCALAR中的LENGTH個字節寫入與FILEHANDLE相關的文件。如果指定了OFFSET,則從提供的SCALAR中的OFFSET字節中讀取信息。該函數使用C /操作系統的write()函數,該函數繞過普通緩沖。 語法 以下是此函數的簡單語法- syswrite FILEHANDLE, SCALAR, LENGTH, OFFS…

draw.io導出矢量圖到word報錯text is not svg - cannot display

先參考https://blog.csdn.net/a625750076/article/details/126384831 如果不行,可能是轉存的問題 解決方法:直接在draw.io上操作 第一步 第二步 然后再word中粘貼,依舊是矢量圖哦!

Ajax入門+aixos+HTTP協議

一.Ajax入門 概念:AJAX是瀏覽器與服務器進行數據通信的技術 axios使用: 引入axios.js使用axios函數:傳入配置對象,再用.then回調函數接受結果,并做后續處理 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>01.axios使用…

面試題. 零矩陣

編寫一種算法&#xff0c;若M N矩陣中某個元素為0&#xff0c;則將其所在的行與列清零。 示例 1&#xff1a; 輸入&#xff1a; [[1,1,1],[1,0,1],[1,1,1] ] 輸出&#xff1a; [[1,0,1],[0,0,0],[1,0,1] ] 示例 2&#xff1a; 輸入&#xff1a; [[0,1,2,0],[3,4,5,2],[1,3…

獲取excel中的圖片(包含wps中嵌入單元格圖片)

項目中有excel導入功能,并且需要導入excel中的圖片;模板如圖: 已知office中插入的圖片為浮動形式;如圖: wps中可以插入浮動圖片,也可以插入嵌入單元格圖片;如圖: 并且在wps嵌入單元格形式的圖片可以看到使用的是公式;如圖: 問題來了,如何獲取圖片 并且將圖片與單元格進行對應 …

Cat(3):客戶端集成—簡單案例

接下來編寫一個簡單的springboot與Cat整合的案例 1 新建springboot項目 首先創建一個Spring Boot的初始化工程。只需要勾選web依賴即可。 2 添加 Maven 添加依賴 <dependency><groupId>com.dianping.cat</groupId><artifactId>cat-client</artifa…

UE4/5Niagara粒子特效學習(使用UE5.1,適合新手)

目錄 創建空模板 創建粒子 粒子的基礎屬性 粒子的生命周期 顏色 大小設置 生成的位置 Skeletal Mesh Location的效果&#xff1a; Shape Location 添加速度 添加Noise力場 在生成中添加&#xff1a; 效果&#xff1a; ?編輯 在更新中添加&#xff1a; 效果&…

機器學習線性代數基礎

本文是斯坦福大學CS 229機器學習課程的基礎材料&#xff0c;原始文件下載 原文作者&#xff1a;Zico Kolter&#xff0c;修改&#xff1a;Chuong Do&#xff0c; Tengyu Ma 翻譯&#xff1a;黃海廣 備注&#xff1a;請關注github的更新&#xff0c;線性代數和概率論已經更新完畢…

簡述 TCP 和 UDP 的區別以及優缺點和使用場景?

一、TCP與UDP區別總結&#xff1a; 1、TCP面向連接&#xff08;如打電話要先撥號建立連接&#xff09;;UDP是無連接的&#xff0c;即發送數據之前不需要建立連接 2、TCP提供可靠的服務。也就是說&#xff0c;通過TCP連接傳送的數據&#xff0c;無差錯&#xff0c;不丟失&…

SQL Injection

SQL Injection 就是通過把惡意的sql命令插入web表單遞交給服務器&#xff0c;或者輸入域名或頁面請求的查詢字符串遞交到服務器&#xff0c;達到欺騙服務器&#xff0c;讓服務器執行這些惡意的sql命令&#xff0c;從而讓攻擊者&#xff0c;可以繞過一些機制&#xff0c;達到直…

Vue使用element-ui

main.js配置 //引入Vue import Vue from vue //引入App import App from ./App.vue//完整引入 //引入ElementUI組件庫 // import ElementUI from element-ui; //引入ElementUI全部樣式 // import element-ui/lib/theme-chalk/index.css;//按需引入 import { Button,Row,DatePi…

記一次前端直接上傳圖片到oss報錯

前端直接上傳圖片到阿里云oss,相關過程官網和網上資料已經很詳細&#xff0c;不做贅述。 但這個過程比較復雜&#xff0c;前后端對接過程中很容易出現報錯&#xff0c;這里遇到了以下報錯&#xff0c;不容易排查。 請求顯示net::ERR_NAME_NOT_RESOLVED錯誤&#xff0c;catch輸…

如何在windows電腦安裝多個tomcat服務器和亂碼問題

前提條件安裝jdk 以17版本為例&#xff0c;將jdk8卸載干凈 1.首先進入tomcat官網下載 tomcat網址 這里下載tomcat10為例子 1.1 這里選擇方式一 下載解壓版 2.解壓后拷貝三份 分別命名為 8081、 8082、 8083 3.分別對每個tomcat執行以下操作 3.1 找到tomcat所在webapps文…

Flask框架-配置日志(1):flask使用日志

一、項目結構 study_flask --| apps/ --| __init__.py --| base/ --| logger.py --| __init__.py --| app.py 二、配置日志功能 1、base/logger.py import os import logging from datetime import datetime,date,timedelta from logging.handlers import RotatingFileHandl…

python 開啟5個進程處理list數據

要在 Python 中開啟多個進程來處理列表數據&#xff0c;你可以使用 multiprocessing 模塊。下面是一個開啟5個進程處理列表數據的示例代碼&#xff1a; python import multiprocessingdef process_item(item):# 在這里處理每個列表項的邏輯print(f"Processing item: {ite…

LeetCode[56]合并區間

難度&#xff1a;Medium 題目&#xff1a; 以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0c;該數組需恰好覆蓋輸入中的所有區間 。 示例 1&…