关注公众号,赠送AI/Python/Linux资料,对AI智能体有兴趣的朋友也可以添加一起交流
webbench是一个网站的压力测试开源软件。我经常用这个软件对网站做压力测试,顺便借用产生的HTTP报文测试设备通信。
现在需要把webbench功能融入到测试代码中去,测试代码是用python写的。所以需要把webbench转成Python的实现。webbench的代码不复杂,但既然有了AI,这个活就交给AI来干。看看腾讯元宝能不能做到
在线网页地址:https://yuanbao.tencent.com/chat/naQivTmsDa
首先是提示词,让元宝变身编程语言转换专家。熟悉c以及Python代码编写。
然后我将webbench的源代码以文件的形式上传,让元宝学习,并要求转成Python代码
元宝只是提供一个类似伪代码的实现。要求继续完善
这一次元宝完善了代码,但是从代码来看,很多以前在c使用的函数并没有转换成python的实现。要求元宝用python代码来覆盖并且用python的库
这一次元宝提供的代码功能齐全
import socket
import multiprocessing
import argparse
import sys
from time import time, strftime
from multiprocessing import Lock
from multiprocessing import Manager
# 全局变量
http10 = 1 # 默认使用 HTTP/1.0
method = 'GET' # 默认方法为 GET
clients = 1
force = 0
force_reload = 0
proxyport = 80
proxyhost = None
benchtime = 30
url = ''
success_count = 0
failed_count = 0
bytes_transferred = 0
# 请求模板
def build_request(url, method='GET', force_reload=force_reload):
request = f"{method} {url} HTTP/1.1\r\n"
request += f"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
request += " Connection: close\r\n\r\n"
print(request)
return request.encode()
# 解析URL
def parse_url(url):
protocol, rest = url.split("://", 1)
host = rest.split('/')[0]
return protocol, host
# 基准测试核心函数
def benchcore(host, port, request, benchtime,speed_counter,failed_counter,bytes_counter):
global success_count, failed_count, bytes_transferred
start_time = time()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5)
try:
s.connect((host, port))
except ConnectionRefusedError:
print("Connect to server failed. Aborting benchmark.")
return None
while (time() - start_time) < benchtime:
try:
s.sendall(request)
if force:
return
while True:
try:
data = s.recv(1500)
except BaseException as e:
continue
# print(data)
if not data:
failed_counter['value'] += 1
break
with Lock():
bytes_counter['value'] += len(data)
speed_counter['value'] += 1
except socket.error:
with Lock():
failed_counter['value'] += 1
return
s.close()
# 子进程执行的基准测试
def child_benchcore(host, proxyport, request, benchtime,speed_counter,failed_counter,bytes_counter):
host=host
port=proxyport
request=request
benchtime=benchtime
benchcore(host, port, request, benchtime,speed_counter,failed_counter,bytes_counter)
# 解析命令行参数
def parse_args():
parser = argparse.ArgumentParser(description="Simple Web Benchmark")
parser.add_argument("url", help="URL to benchmark")
parser.add_argument("-c", "--clients", type=int, default=1, help="Number of clients")
parser.add_argument("-t", "--time", type=int, default=30, help="Run benchmark for <sec> seconds")
parser.add_argument("-f", "--force", action="store_true", help="Don't wait for reply from server")
parser.add_argument("-r", "--reload", action="store_true", help="Send reload request - Pragma: no-cache")
parser.add_argument("--http09", action="store_true", help="Use HTTP/0.9 style requests")
parser.add_argument("--http10", action="store_true", help="Use HTTP/1.0 protocol")
parser.add_argument("--http11", action="store_true", help="Use HTTP/1.1 protocol")
return parser.parse_args()
# 主函数
def main():
global benchtime, clients, force, force_reload, http10, url, proxyhost, proxyport
args = parse_args()
url = args.url
clients = args.clients
benchtime = args.time
force = args.force
force_reload = args.reload
if args.http09:
http10 = 0
elif args.http10:
http10 = 1
elif args.http11:
http10 = 2
_, host = parse_url(url)
if ':' in host: # 如果URL包含端口,解析端口号
host, port_str = host.split(':')
proxyport = int(port_str)
request = build_request(url, 'GET', force_reload)
manager = Manager()
speed_counter = manager.dict(value=0)
failed_counter = manager.dict(value=0)
bytes_counter = manager.dict(value=0)
processes = []
for _ in range(clients):
p = multiprocessing.Process(target=child_benchcore, args=(host, proxyport, request, benchtime,speed_counter,failed_counter,bytes_counter,))
p.start()
processes.append(p)
for p in processes:
p.join()
print(f"Benchmark completed at {strftime('%Y-%m-%d %H:%M:%S')}\n")
speed = speed_counter['value']
failed = failed_counter['value']
bytes_received = bytes_counter['value']
print(f"\nSpeed={speed} pages/min, {bytes_received / benchtime:.2f} bytes/sec.")
print(f"Requests: {speed} succeeded, {failed} failed.")
if __name__ == "__main__":
main()
执行代码,模拟10个终端在30秒进行网站压测。统计结果和c代码的差不多。算是实现了大部分功能
不过仔细对比代码,开源webbench中关于proxy的处理并没有实现。但是至少这个转换完成了大部分的功能。省去了一些时间。目前只测试了基本使用,还没有测试所有的功能调用。
总结:
这种比较复杂的代码,最好是给一个完整的提示词,然后再运行。代码的质量,完整度明显要好一点。因此一个好的提示词,是产生一个好结果的关键。
我再vs code上用腾讯AI编码助手试了一遍,也可以得到类似的代码结果。
腾讯AI编程助手的安装使用方法参考这篇文章
经过今天的尝试,后续很多代码转换工作都可以交给AI来做了。省去很多写代码的时间
关注公众号,赠送AI/Python/Linux资料,对AI智能体有兴趣的朋友也可以添加一起交流