使用locust 做性能測試
pip install locust -i https://pypi.tuna.tsinghua.edu.cn/simple
from locust umport HttpUser, task, between
#創(chuàng)建一個類,從HTTPUser繼承
class CarRental(HttpUser):
#思考時間,between是locust中的一個方法,在1~3s之間取隨機數(shù)
wait_time = between(1,3)
# task 帶參數(shù),表示任務(wù)的權(quán)重,默認(rèn)是1
# 訪問車輛的頁面,比訪問Menu頁面的人數(shù)多,或者訪問的頻率高
@task(3)
def loadAllCar(self):
ret = self.client.get("/carRental/car/loadAllCar.action?page=1&limit=10")
assert ret.status_code == 200
@task(1)
def loadAllMenu(self):
ret = self.client.get("/carRental/menu/loadAllMenu.action?page=1&limit=10")
assert ret.status_code == 200
# 命令行中執(zhí)行
# locust回啟動一個web服務(wù),使用8089端口
# 如果端口被占用加上這個參數(shù)修改端口號 --web-port=8088
# locust -f xingneng\f01.py --web-host=127.0.0.1 --web-port=8079
import random
from time import sleep
from locust import HttpUser, between, task
class CarRental(HttpUser):
wait_time = between(1, 3)
@task
def test001(self):
carnumber = "陜A" + str(random.randint(10000, 99999))
car = {"carnumber": carnumber,
"cartype": "比亞迪",
"color": "black",
"carimg": "images/defaultcarimage.jpg",
"description": "一輛車",
"price": "100000",
"rentprice": "1000",
"deposit": "10000",
"isrenting": "0"}
headers = {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
}
r = self.client.post("carRental/car/addCar.action", data=car, headers=headers)
assert r.json()['msg'] == '添加成功'
r = self.client.get("carRental/car/loadAllCar.action?page=1&limit=1000")
assert carnumber in r.text
sleep(5)
car = {"carnumber": carnumber}
r = self.client.post("carRental/car/deleteCar.action", data=car, headers=headers)
assert r.json()['msg'] == '刪除成功'
r = self.client.get("carRental/car/loadAllCar.action?page=1&limit=1000")
assert carnumber not in r.text
''
Jmeter中Perf插件可以配合ServerAgent來監(jiān)控服務(wù)器。
Locust無法監(jiān)控服務(wù)器。可以使用其他的監(jiān)控工具來監(jiān)控。
用python代碼實現(xiàn)一段腳本,來監(jiān)控服務(wù)器。
psutil中提供一些方法,獲取服務(wù)器的數(shù)據(jù)
'''
from datetime import datetime, time
from time import sleep
import psutil
print(psutil.cpu_percent()) # cpu占用的百分比
# svmem(total=8241782784, available=2837688320, percent=65.6, used=5404094464, free=2837688320)
print(psutil.virtual_memory()) # 內(nèi)存
print(psutil.virtual_memory().percent) # 內(nèi)存的百分比
# sdiskusage(total=128034271232, used=40075087872, free=87959183360, percent=31.3)
print(psutil.disk_usage("c:/")) # 磁盤
print(psutil.disk_usage("c:/").percent) # 磁盤占用百分比
# snetio(bytes_sent=2991383096, bytes_recv=288711266, packets_sent=2764774, packets_recv=2455569, errin=0, errout=0, dropin=0, dropout=0)
print(psutil.net_io_counters()) # 網(wǎng)絡(luò)IO
print(psutil.net_io_counters().bytes_sent) # 發(fā)送的字節(jié)數(shù)
print(psutil.net_io_counters().bytes_recv) # 接收的字節(jié)數(shù)
'''
監(jiān)控服務(wù)器,每隔3s獲取一下相關(guān)的數(shù)據(jù),把結(jié)果寫到csv文件中
通過excel的功能,生成折線圖
'''
# 表頭:時間戳,CPU使用率,內(nèi)存使用率,磁盤使用率,發(fā)送字節(jié)數(shù),接收字節(jié)數(shù)
with open("c:/監(jiān)控數(shù)據(jù).csv", mode="w", encoding='utf-8') as f:
f.write("時間戳,CPU使用率,內(nèi)存使用率,磁盤使用率,發(fā)送字節(jié)數(shù),接收字節(jié)數(shù)\n")
print("正在監(jiān)控", end="")
while True:
print(".", end="")
now = datetime.now() # 當(dāng)前時間
t = datetime.strftime(now, "%Y-%m-%d %H:%M:%S") # 格式化時間
cpu = psutil.cpu_percent()
mem = psutil.virtual_memory().percent
disk = psutil.disk_usage("c:/").percent # 部署租車系統(tǒng)的盤
sent = psutil.net_io_counters().bytes_sent
recv = psutil.net_io_counters().bytes_recv
f.write(f"{t},{cpu},{mem},{disk},{sent},{recv}\n")
f.flush()
sleep(3)
import random
from time import sleep
from locust import HttpUser, between, task
class CarRental(HttpUser):
wait_time = between(1, 3)
@task
def test001(self):
carnumber = "陜A" + str(random.randint(10000, 99999))
car = {"carnumber": carnumber,
"cartype": "比亞迪",
"color": "black",
"carimg": "images/defaultcarimage.jpg",
"description": "一輛車",
"price": "100000",
"rentprice": "1000",
"deposit": "10000",
"isrenting": "0"}
headers = {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
}
r = self.client.post("carRental/car/addCar.action", data=car, headers=headers)
assert r.json()['msg'] == '添加成功'
r = self.client.get("carRental/car/loadAllCar.action?page=1&limit=1000")
assert carnumber in r.text
sleep(5)
car = {"carnumber": carnumber}
r = self.client.post("carRental/car/deleteCar.action", data=car, headers=headers)
assert r.json()['msg'] == '刪除成功'
r = self.client.get("carRental/car/loadAllCar.action?page=1&limit=1000")
assert carnumber not in r.text
|