shell脚本发送随机请求
文章目录
- 需求
- 参数随机
- 不同时间不同发送频率
- 处理响应
- 实现
- 判断时间区域
- 随机数
- 文件随机读取
- 完整代码
需求
在日常开发测试中,模拟发送请求是一项极为常见且重要的任务,尤其是在对API进行全面测试以验证其响应准确性、性能稳定性以及边界条件的处理能力时。
参数随机
为了实现更为真实和全面的测试环境,我们需要能够模拟发送具备随机性的不同参数请求,这些参数的随机性可以体现在请求内容、查询参数、头部信息等各个方面。
不同时间不同发送频率
发送请求的频率也应能够随时间动态变化,以模拟实际使用场景中可能出现的突发请求、高峰时段及低峰时段的请求模式。通过编写脚本实现这种动态变化的发送频率,可以更精确地评估系统在不同负载下的表现。
处理响应
考虑到实际测试场景中可能存在对特定请求的响应时间要求,我们还需要在发送请求后根据具体场景设置等待需求。这意味着脚本需要能够处理请求响应的延迟,并在必要时调整发送下一个请求的时机,以确保测试过程能够按照预定的时间线进行。
实现
为了实现上述需求,计划使用Shell脚本结合如curl这样的命令行工具来编写模拟请求发送的脚本。脚本中可以通过随机数生成器来创建具有随机性的参数,利用循环和条件语句来控制请求的发送频率,以及使用sleep函数来实现对响应时间的模拟等待。
判断时间区域
# 获取当前小时和分钟
current_hour=$(date +%H)
echo "当前时间戳: $ts $current_hour"
if [[ $current_hour -ge 10 && $current_hour -lt 13 ]] || [[ $current_hour -ge 18 && $current_hour -le 23 ]]; then
echo "当前时间在10:00-13:00或18:00-23:00之间。"
else
echo "当前时间不在10:00-13:00或18:00-23:00之间。"
fi
随机数
输出一个介于0.5到1.9之间的随机浮点数
awk 'BEGIN{srand(); print ((1.5 - 0.1) * rand()+0.5);}'
awk 是一个强大的文本处理工具,常用于Linux和Unix环境中。它允许你编写简单的程序来处理数据行。awk
程序的基本结构可以包括三个部分:BEGIN 部分、主程序部分以及END部分。
- BEGIN{srand();}:这部分告诉 awk 在开始处理任何输入之前执行一些初始化代码。
- srand() 函数用于初始化随机数生成器。如果不调用 srand() 或者每次调用时使用相同的种子值,那么每次运行程序时产生的随机数序列将会相同。
- print ((1.5 - 0.1) * rand()+0.5);:这部分代码计算并打印一个随机数。具体来说:
rand() 返回一个大于等于0且小于1的随机浮点数。
(1.5 - 0.1) 计算出结果为1.4。 - (1.5 - 0.1) * rand() 会返回一个介于0(包含)到1.4(不包含)之间的随机数。
最后,加上0.5,得到的结果将是一个介于0.5(包含)到1.9(不包含)之间的随机数。
文件随机读取
shuf
是一个Unix/Linux命令行工具,用于生成伪随机排列(洗牌)。它的名字来源于“shuffle”(洗牌),通常用来从列表中随机抽取元素。
使用
shuf -n 1 a.txt
的各部分含义如下:
- shuf:这是命令的名字,用于执行洗牌操作。
- -n 1:这个选项告诉 shuf 只要输出一行(一个元素)。-n 后面跟的是要抽取的行数,在这里是指定输出第一行经过随机选择后的结果。
- a.txt:这是命令的作用对象,即输入文件名。shuf 将从这个文件中读取内容,并从中随机选择行。
完整代码
#!/bin/bash
while (1>0)
do
ts=$(date +%s)
# echo "当前时间戳: $ts"
# 获取当前小时和分钟
current_hour=$(date +%H)
echo "当前时间戳: $ts $current_hour"
if [[ $current_hour -ge 10 && $current_hour -lt 13 ]] || [[ $current_hour -ge 18 && $current_hour -le 23 ]]; then
echo "当前时间在10:00-13:00或18:00-23:00之间。"
stime=$(awk 'BEGIN{srand(); print ((1.5 - 0.1) * rand()+0.5);}' | awk '{printf "%.1f\n", $0}')
else
echo "当前时间不在10:00-13:00或18:00-23:00之间。"
stime=$(awk 'BEGIN{srand(); print ((3 - 0.9) * rand() + 2.1);}' | awk '{printf "%.1f\n", $0}')
fi
chnid="001"
filename="uuid-$chnid.txt"
codefile="code-$chnid.txt"
echo $filename $mediafile
uu_token=`shuf -n 1 $filename`
echo "$uu_token"
uuid=$(echo "$uu_token" | cut -d',' -f1)
token=$(echo "$uu_token" | cut -d',' -f2)
tid=$(echo "$uu_token" | cut -d',' -f3)
code=`shuf -n 1 $codefile`
download_url="http://127.0.0.1:8081/test/v1/hello?chnid=$chnid&uuid=$uuid&tid=$tid&ts=$ts&code=$code&token=$token"
echo $download_url
wget -qO - $download_url
echo $stime
sleep $stime
done