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