摘要:在性能測驗中,達到相應的性能指標對于一個軟體來說十分重要,在本文中,將介紹一種現代化性能測驗工具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 subprocess from alive_progress import alive_bar # 非常豐富的進度條工具庫 from tqdm import tqdm # 進度條工具庫 import pandas as pd # 可以用來處理文本excel,csv等 from collections import OrderedDict import argparse # 用來決議命令列引數 import time print('測驗時間 : ', 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元開發者禮包!
歡迎關注“華為云開發者聯盟”公眾號,獲取大會議程、精彩活動和前沿干貨,
點擊關注,第一時間了解華為云新鮮技術~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/555925.html
標籤:其他
下一篇:返回列表
