您的位置:首頁 >地市 >

基于k6和python進行自動化性能測試 世界速遞

2023-06-26 11:57:32 來源:博客園
摘要:在性能測試中,達到相應的性能指標對于一個軟件來說十分重要,在本文中,將介紹一種現代化性能測試工具k6。

本文分享自華為云社區《基于k6和python進行自動化性能測試》,作者: 風做了云的夢。


【資料圖】

當我們開發完成一個應用程序時,往往需要對其進行性能測試,以幫助我們更好的優化程序以及發現程序中的一些bug。在性能測試中,達到相應的性能指標對于一個軟件來說十分重要,在本文中,將介紹一種現代化性能測試工具k6。

k6是一個開源工具,基于JavaScript可以編寫k6的測試腳本,測試Web應用程序以及API的性能,支持HTTP等多種協議,可以很好地模擬各種高負載場景,充分驗證程序穩定性和性能。k6支持Linux、MacOS等多個平臺,通過k6官網根據提示即可在各個平臺快速安裝k6,終端輸入k6 version出現如下顯示說明安裝成功。

以下是一個簡單的k6測試腳本,通過k6的HTTP API模擬Get請求,并且休眠一秒鐘:K

import http from "k6/http";import { sleep } from "k6";export default function () { http.get("https://test-api.com"); sleep(1);}

通過執行下面這行代碼,運行腳本,即可對服務完成測試。

k6 run test-script.js

k6提供了豐富的功能,以下是k6常用的一些API,具體可以參考官網文檔介紹:

- http.get(url, [options]):發送GET請求。- http.post(url, body, [options]):發送POST請求。- check(res, checks):檢查響應是否符合預期。- group(name, func):將一組請求分組并統計性能指標。- sleep(duration):休眠指定的時間。

k6的測試結果包括以下一些指標,可以根據這些指標,更好的優化程序。

- VUs:虛擬用戶的數量。- Iterations:迭代次數。- RPS:每秒鐘的請求數。- Duration:測試持續時間。- Data Sent/Received:發送和接收的數據量。- Checks:檢查的數量。- Status codes:響應狀態碼的數量。- Errors:錯誤的數量。- Latency distribution:延遲分布。

通過Python和k6你可以更加高效的完成符合自己要求的自動化測試,Python可以提供非常多的工具庫,用來收集處理k6返回的結果。 我們可以編寫以下k6測試腳本,并且通過Python去執行它,相關注釋我已經標注出來,在handleSummary函數中,我們可以通過metrics來獲取各種測試信息,具體如代碼所示,可以參考官網關于metrics的介紹,同時自定義環境變量的使用也十分方便,可以參考代碼中的使用方式。

import http from "k6/http";import { check, sleep} from "k6";import {Rate} from "k6/metrics";export default function() {    #post請求所需要的body體 let requestBody = { "xxx":[ "xxxxx"        ], "xxxx": __ENV.MyVar # MyVar為自定義的環境變量,可以通過__ENV調用,在執行腳本時可直接通過MyVar=xxx傳值    };    #url const url = "http://example.com"; const payload = JSON.stringify(requestBody); const params = {    headers: { "Content-Type": "application/json",        },    timeout: "100s" #每個請求的超時時間    }; let res = http.post(url, payload, params);    #檢測結果是否是200OK check(res, { "status is 200": (r) => r.status === 200 });}export function handleSummary(data) {        #通過data.metrics中的字段可以獲取你想要的一些信息,例如每個請求的持續時間和吞吐量 const time = `${data.metrics.http_req_duration.values.avg.toFixed(3)}`; const rps = `${data.metrics.http_reqs.values.rate.toFixed(3)}`; const res = `${time} ${rps}`;         console.log(res); # 利用console.log可以將內容打印到控制臺 return {stdout : res}; #輸出到標準輸出}

如下是一個Python代碼示例,相關代碼已經注釋,通過Python中的subprocess模塊執行k6腳本,并且捕獲k6腳本的輸出,通過pandas庫進行整理輸出到excel中。還可以通過argparse庫解析命令行參數傳入k6腳本中,更加靈活,高效。

# -*- coding: utf-8 -*-import subprocessfrom alive_progress import alive_bar # 非常豐富的進度條工具庫from tqdm import tqdm # 進度條工具庫import pandas as pd # 可以用來處理文本excel,csv等from collections import OrderedDictimport argparse # 用來解析命令行參數 import timeprint("測試時間 : ", time.strftime("%b %d %Y %H:%M:%S", time.gmtime(time.time())))print("************開始測試啦! 祈禱不出錯!**************")# 需要測試的測試語句集合test_examples = [ "aaaaaaa", "bbbbbbb", "ccccccc"]dataMap = {"test": test_examples}parser = argparse.ArgumentParser()parser.add_argument("-d", default="60s", help="duration time", dest="duration_time") #解析命令行參數,控制測試時間args = parser.parse_args()print("每條語句測試時間 : ", args.duration_time)vus = ["10", "20", "30", "40"] # 并發數集合 ,分別測試并發數為10,20,30,40的場景cols_name = ["1-avg/ms", "1-rps/s", "10-avg/ms", "10-rps/s","20-avg/ms", "20-rps/s","50-avg/ms", "50-rps/s"] # excel的列名# 循環測試,可以將多個需要測試的語句集合放入到dataMap中for (name, data) in dataMap.items():  print("當前測試的項目為 :", name)        res = OrderedDict()        res["test_examples"] = [] for n in cols_name:                res[n] = []        df = pd.DataFrame(res) excel_name = name + ".xlsx" df.to_excel(excel_name, index=False) for query in data: print("當前測試語句為 :", query)                origin = pd.read_excel(excel_name) with alive_bar(len(vus)) as bar: temp_dict = {} temp_dict["test_examples"] = query for vu in vus: keyRps = vu + "-rps/s" keyTime = vu + "-avg/ms" MyVar="MyVar=" + query #通過Popen執行k6腳本,并且捕獲它的標準輸出                                process = subprocess.Popen(["k6", "run", "--quiet", "script.js", "--env", MyVar, "--vus", vu, "--duration", args.duration_time], stdout=subprocess.PIPE, stderr=subprocess.PIPE)                                result = process.stdout.read()                                temp = result.split() temp_dict[keyTime] = temp[0].decode(); temp_dict[keyRps] = temp[1].decode(); print("并發:", vu, temp[0].decode(), temp[1].decode()) bar() #將腳本輸出寫到excel save_data = origin.append(temp_dict, ignore_index=True) save_data.to_excel(excel_name, index=False)

執行此Python腳本,可以得到類似以下輸出:

1、k6官網文檔鏈接:https://k6.io/docs/

2、k6安裝鏈接:https://k6.io/docs/get-started/installation/

號外

7月7日,華為開發者大會2023 ( Cloud )將拉開帷幕,并將在國內30多個城市、海外10多個國家開設分會場,誠邀您參加這場不容錯過的年度開發者盛會,讓我們一起開啟探索之旅!

我們將攜手開發者、客戶、合作伙伴,為您呈現華為云系列產品服務與豐富的創新實踐,并與您探討AI、大數據、數據庫、PaaS、aPaaS、媒體服務、云原生、安全、物聯網、區塊鏈、開源等技術話題,展開全面深入的交流。

大會將匯聚全球科學家、行業領袖、技術專家、社區大咖,開設200多場開發者專題活動,為全球開發者提供面對面交流與合作的機會,共同探討技術創新和業務發展。

大會官網:https://developer.huaweicloud.com/HDC.Cloud2023.html

參會購票:https://www.vmall.com/product/10086352254099.html?cid= 211761

點擊參與開發者社區活動,觀賞技術大咖秀、玩轉技術夢工廠,有機會贏取4000元開發者禮包!

歡迎關注“華為云開發者聯盟”公眾號,獲取大會議程、精彩活動和前沿干貨。

點擊關注,第一時間了解華為云新鮮技術~

關鍵詞: