摘要:在性能測試中,達到相應(yīng)的性能指標(biāo)對于一個軟件來說十分重要,在本文中,將介紹一種現(xiàn)代化性能測試工具k6。
本文分享自華為云社區(qū)《基于k6和python進行自動化性能測試》,作者: 風(fēng)做了云的夢。
【資料圖】
當(dāng)我們開發(fā)完成一個應(yīng)用程序時,往往需要對其進行性能測試,以幫助我們更好的優(yōu)化程序以及發(fā)現(xiàn)程序中的一些bug。在性能測試中,達到相應(yīng)的性能指標(biāo)對于一個軟件來說十分重要,在本文中,將介紹一種現(xiàn)代化性能測試工具k6。
k6是一個開源工具,基于JavaScript可以編寫k6的測試腳本,測試Web應(yīng)用程序以及API的性能,支持HTTP等多種協(xié)議,可以很好地模擬各種高負載場景,充分驗證程序穩(wěn)定性和性能。k6支持Linux、MacOS等多個平臺,通過k6官網(wǎng)根據(jù)提示即可在各個平臺快速安裝k6,終端輸入k6 version出現(xiàn)如下顯示說明安裝成功。
以下是一個簡單的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);}通過執(zhí)行下面這行代碼,運行腳本,即可對服務(wù)完成測試。
k6 run test-script.js
k6提供了豐富的功能,以下是k6常用的一些API,具體可以參考官網(wǎng)文檔介紹:
- http.get(url, [options]):發(fā)送GET請求。- http.post(url, body, [options]):發(fā)送POST請求。- check(res, checks):檢查響應(yīng)是否符合預(yù)期。- group(name, func):將一組請求分組并統(tǒng)計性能指標(biāo)。- sleep(duration):休眠指定的時間。
k6的測試結(jié)果包括以下一些指標(biāo),可以根據(jù)這些指標(biāo),更好的優(yōu)化程序。
- VUs:虛擬用戶的數(shù)量。- Iterations:迭代次數(shù)。- RPS:每秒鐘的請求數(shù)。- Duration:測試持續(xù)時間。- Data Sent/Received:發(fā)送和接收的數(shù)據(jù)量。- Checks:檢查的數(shù)量。- Status codes:響應(yīng)狀態(tài)碼的數(shù)量。- Errors:錯誤的數(shù)量。- Latency distribution:延遲分布。
通過Python和k6你可以更加高效的完成符合自己要求的自動化測試,Python可以提供非常多的工具庫,用來收集處理k6返回的結(jié)果。 我們可以編寫以下k6測試腳本,并且通過Python去執(zhí)行它,相關(guān)注釋我已經(jīng)標(biāo)注出來,在handleSummary函數(shù)中,我們可以通過metrics來獲取各種測試信息,具體如代碼所示,可以參考官網(wǎng)關(guān)于metrics的介紹,同時自定義環(huán)境變量的使用也十分方便,可以參考代碼中的使用方式。
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為自定義的環(huán)境變量,可以通過__ENV調(diào)用,在執(zhí)行腳本時可直接通過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); #檢測結(jié)果是否是200OK check(res, { "status is 200": (r) => r.status === 200 });}export function handleSummary(data) { #通過data.metrics中的字段可以獲取你想要的一些信息,例如每個請求的持續(xù)時間和吞吐量 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可以將內(nèi)容打印到控制臺 return {stdout : res}; #輸出到標(biāo)準輸出}如下是一個Python代碼示例,相關(guān)代碼已經(jīng)注釋,通過Python中的subprocess模塊執(zhí)行k6腳本,并且捕獲k6腳本的輸出,通過pandas庫進行整理輸出到excel中。還可以通過argparse庫解析命令行參數(shù)傳入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 # 用來解析命令行參數(shù) 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") #解析命令行參數(shù),控制測試時間args = parser.parse_args()print("每條語句測試時間 : ", args.duration_time)vus = ["10", "20", "30", "40"] # 并發(fā)數(shù)集合 ,分別測試并發(fā)數(shù)為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的列名# 循環(huán)測試,可以將多個需要測試的語句集合放入到dataMap中for (name, data) in dataMap.items(): print("當(dāng)前測試的項目為 :", 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("當(dāng)前測試語句為 :", 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執(zhí)行k6腳本,并且捕獲它的標(biāo)準輸出 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("并發(fā):", 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)執(zhí)行此Python腳本,可以得到類似以下輸出:
1、k6官網(wǎng)文檔鏈接:https://k6.io/docs/
2、k6安裝鏈接:https://k6.io/docs/get-started/installation/
號外
7月7日,華為開發(fā)者大會2023 ( Cloud )將拉開帷幕,并將在國內(nèi)30多個城市、海外10多個國家開設(shè)分會場,誠邀您參加這場不容錯過的年度開發(fā)者盛會,讓我們一起開啟探索之旅!
我們將攜手開發(fā)者、客戶、合作伙伴,為您呈現(xiàn)華為云系列產(chǎn)品服務(wù)與豐富的創(chuàng)新實踐,并與您探討AI、大數(shù)據(jù)、數(shù)據(jù)庫、PaaS、aPaaS、媒體服務(wù)、云原生、安全、物聯(lián)網(wǎng)、區(qū)塊鏈、開源等技術(shù)話題,展開全面深入的交流。
大會將匯聚全球科學(xué)家、行業(yè)領(lǐng)袖、技術(shù)專家、社區(qū)大咖,開設(shè)200多場開發(fā)者專題活動,為全球開發(fā)者提供面對面交流與合作的機會,共同探討技術(shù)創(chuàng)新和業(yè)務(wù)發(fā)展。
大會官網(wǎng):https://developer.huaweicloud.com/HDC.Cloud2023.html
參會購票:https://www.vmall.com/product/10086352254099.html?cid= 211761
點擊參與開發(fā)者社區(qū)活動,觀賞技術(shù)大咖秀、玩轉(zhuǎn)技術(shù)夢工廠,有機會贏取4000元開發(fā)者禮包!
歡迎關(guān)注“華為云開發(fā)者聯(lián)盟”公眾號,獲取大會議程、精彩活動和前沿干貨。
點擊關(guān)注,第一時間了解華為云新鮮技術(shù)~
關(guān)鍵詞:

營業(yè)執(zhí)照公示信息