xtest 是一个基于Aiges平台的自动化测试工具,可支持单元测试、压力测试、功能测试等测试功能,并提供了基本的资源监控,可配合prometheus和grafana使用。
- 启动Aiservice,注意监听的端口是否有改变。
- 根据自己的AI模型修改xtest.toml文件,例如Aiservice端口、参数,测试轮数等配置,具体请参考说明六。
- 由于监听资源需要管理员权限,请保证本地已经安装
netstat
命令,然后执行:sudo ./xtest
或sudo ./xtest -f *.toml
命令启动, 否则资源文件将为空,但并不影响其他任务。 - GPU 监控为待开放功能,源码已实现,但要求用户拥有英伟达显卡监控(Nvidia-smi)
- 模式-支持流式、非流式、异步回调三种模式
- 非流式模式下
- 读取文件输入
- 配置中心手动输入数据
- 流式模式下
- 单一文件一次输入
- 单一文件按照固定长度输入
- 文本文件按行读取 √ 优化代码
- 多个文件,每个文件一帧输入
- 文件有序
- 文件无序
- 并发,显示当前路数
- 成功率,性能数据及性能分布,输出本地相关数据
- 内存、显存定时统计
- CPU
- 内存
- GPU
- 文档说明
- demo样例
[xtest]
taddrs="AIservice@127.0.0.1:5090"
trace-ip = "172.16.51.13"
[svcMode]
service = "AIservice" # 请求目标服务名称, eg:sms
svcId = "s12345678" # 服务id
timeout = 1000 # 服务超时时间, 对应服务端waitTime
multiThr = 100 # 请求并发数
loopCnt = 100000 # 请求总次数
sessMode = 0 # 0: 非会话模式, 1: 常规会话模式 2.文本按行会话模式 3.文件会话模式
linearMs = 5000 # 并发压测线性增长区间,单位:ms
perfOn=true # 是否开启性能测试
perfLevel=0 # 非会话模式默认0
# 会话模式0: 从发第一帧到最后一帧的性能
# 会话模式1:首结果(发送第一帧到最后一帧的性能)
# 会话模式2:尾结果(发送最后一帧到收到最后一帧的性能)
inputCmd = false # 切换为命令行输入,仅在非会话模式生效
prometheus_switch = true # Prometheus开关, 开启后开启双写,同时写入prometheus与本地日志
prometheus_port = 2117 # jbzhou5 Prometheus指标暴露端口
plot = true # 绘制资源图, 默认开启
plot_file = "./log/line.png" # 绘制图形保存路径
file_sorted = 0 # 传入文件是否排序, 0: 随机, 1: 升序, 2: 降序
file_name_seq = "_" # 传入文件名分割方式 例如传入'_', 则1_2.txt -> 1,2_2.txt -> 2, 为空或者传入非法则不处理
[header]
"appid" = "100IME"
"uid" = "1234567890"
[parameter]
"key" = 2
"x" = 1
[data]
payload = "dataKey2" # 输入数据流配置段,多个数据流以";"分割, 如果开启了inputCmd, 该值会被清空
expect = "dataKey3" # 输出数据流配置段,多个数据流以";"分割
[dataKey1] # 输入数据流dataKey1描述
inputSrc = "path" # 上行数据流数据源, 配置文件路径(配置为目录则循环读取目录中文件)
sliceOn = false # 切片开关, false:关闭切换, true:开启切片
sliceSize = 1280 # 上行数据切片大小,用于会话模式: byte
interval = 40 # 上行数据发包间隔,用于会话模式: ms. 注:动态校准,每个包间隔非严格interval
name = "input1" # 输入数据流key值
type = "image" # 数据类型,支持"audio","text","image","video"
describe = "k1=v1;k2=v2" # 数据描述信息,多个描述信息以";"分割
# 图像支持如下属性:"encoding", 如"encoding=jpg"
[dataKey2]
inputSrc = "./testdata/text2" # 上行数据流数据源, 配置文件路径(配置为目录则循环读取目录中文件)
sliceOn = false # 切片开关, false:关闭切换, true:开启切片
sliceSize = 1280 # 上行数据切片大小,用于会话模式: byte
interval = 40 # 上行数据发包间隔,用于会话模式: ms. 注:动态校准,每个包间隔非严格interval
name = "input2" # 输入数据流key值
type = "text" # 数据类型,支持"audio","text","image","video"
describe = "encoding=utf8" # 数据描述信息,多个描述信息以";"分割
# 图像支持如下属性:"encoding", 如"encoding=jpg"
[dataKey3]
name = "result" # 输入数据流key值
type = "text" # 输出数据类型,支持"audio","text","image","video"
describe = "k1=v1;k2=v2" # 数据描述信息,多个描述信息以";"分割
# 文本支持如下属性:"encoding","compress", 如"encoding=utf8;compress=gzip"
[downstream] # 下行数据流存储输出
output = 0 # 输出方式: 0:输出至公共文件outputDst 1:以独立文件形式输出至目录outputDst(文件名:sid+**) 2:输出至终端
outputDst = "./log/result" # 响应数据输出目标, 若output=0则配置目录, output=1则配置文件
[log]
file = "./log/xtest.log" # 日志文件名
level = "debug" # 日志打印等级
size = 100 # 日志文件大小
count = 20 # 日志备份数量
async = 0 # 异步开关
die = 30
[trace]
able = 0
xtest.toml 中大部分字段一般保持不变,下面仅对常用字段进行说明解释。
-
[xtest]
taddrs="AIservice@127.0.0.1:5090"
: 与Aiservice的通信地址,与AIservice的启动端口对应,其中端口会被解析用于获取Aiservice的进程,监听其使用资源信息。trace-ip = "172.16.51.13
-
[svcMode]
service = "AIservice"
: 请求目标服务名称, eg:smssvcId = "s12345678"
:服务idtimeout = 1000
:服务超时时间, 对应服务端waitTimemultiThr = 100
:请求并发数,即同时开启多个协程发送请求测试loopCnt = 100000
: multiThr个协程发送的请求总次数sessMode = 0
: 0: 非会话模式, 1: 常规会话模式 2.文本按行会话模式 3.文件会话模式linearMs = 5000
:并发压测线性增长区间,单位:msperfOn=true
: 是否开启性能测试,即是否在log文件夹底下记录perf.txt和PerfRecord.csv,用于记录成功率、失败率、发送延迟等性能指标。perfLevel=0
:与sessMode字段对应,非会话模式默认0,会话模式0: 从发第一帧到最后一帧的性能,会话模式1:首结果(发送第一帧到最后一帧的性能),会话模式2:尾结果(发送最后一帧到收到最后一帧的性能)inputCmd = false
:切换为命令行输入,仅在非会话模式生效,配置该字段时,所配置的[data] 字段将失效,仅读取用户命令行输入数据prometheus_switch = true
:Prometheus开关,开启后会开放一个Prometheus监控端口,可使用grafana进行数据的展示。关闭/打开都会在Log目录生成一个Resource.csv 资源监听文件。prometheus_port = 2117
:Prometheus指标暴露端口plot = true
:绘制资源图,默认开启,将绘制Aiservice使用的资源变化折线图plot_file = "./log/line.png"
:绘制图形保存路径file_sorted = 0
:[data] 传入文件是否按名称排序, 0: 随机, 1: 升序, 2: 降序file_name_seq = "_"
: 传入文件名分割方式 例如传入'_', 则1_2.txt -> 1,2_2.txt -> 2, 为空或者传入非法(即不能作为文件名的字符)则不处理, 注意此处分割为仅保留前半部分,若文件名为1_2_3.txt, 则得到的分割文件名为1。
-
[parameter]
:使用的AI模型需要传入的字段,根据自己需要填写"key" = 2
"x" = 1
-
[data]
payload = "dataKey2"
:输入数据流配置段,多个数据流以";"分割, jbzhou5 如果开启了inputCmd, 该值会被清空expect = "dataKey3"
:输出数据流配置段,多个数据流以";"分割
-
[dataKey1]
:名称可自定义,主要用于在[data] 字段的payload属性中方便标记加载数据,输入数据流dataKey1描述inputSrc = "path"
:上行数据流数据源, 配置文件路径(配置为目录则循环读取目录中文件)sliceOn = false
:切片开关, false:关闭切换, true:开启切片sliceSize = 1280
:上行数据切片大小,用于会话模式: byteinterval = 40
: 上行数据发包间隔,用于会话模式: ms. 注:动态校准,每个包间隔非严格intervalname = "input1"
: 输入数据流key值type = "image"
: 数据类型,支持"audio","text","image","video"describe = "k1=v1;k2=v2"
: 数据描述信息,多个描述信息以";"分割,图像支持如下属性:"encoding", 如"encoding=jpg"
-
[dataKey2]
inputSrc = "./testdata/text2"
:上行数据流数据源, 配置文件路径(配置为目录则循环读取目录中文件)sliceOn = false
: 切片开关, false:关闭切换, true:开启切片sliceSize = 1280
:上行数据切片大小,用于会话模式: byteinterval = 40
: 上行数据发包间隔,用于会话模式: ms. 注:动态校准,每个包间隔非严格intervalname = "input2"
: 输入数据流key值type = "text"
: 数据类型,支持"audio","text","image","video"describe = "encoding=utf8"
: 数据描述信息,多个描述信息以";"分割图像支持如下属性:"encoding", 如"encoding=jpg"
-
[dataKey3]
name = "result"
: 输入数据流key值type = "text"
:输出数据类型,支持"audio","text","image","video"describe = "k1=v1;k2=v2"
: 数据描述信息,多个描述信息以";"分割,文本支持如下属性:"encoding","compress", 如"encoding=utf8;compress=gzip"
-
[downstream]
:下行数据流存储输出output = 0
: 输出方式: 0:输出至公共文件outputDst 1:以独立文件形式输出至目录outputDst(文件名:sid+**) 2:输出至终端outputDst = "./log/result"
:响应数据输出目标, 若output=0则配置目录, output=1则配置文件
-
[log]
file = "./log/xtest.log"
:日志文件名level = "debug"
:日志打印等级size = 100
:日志文件大小,单个超过size,将会写入新文件。count = 20
: 日志备份数量async = 0
: 异步开关die = 30
-
[trace]
able = 0