使用shell模拟并发测试
侧边栏壁纸
  • 累计撰写 52 篇文章
  • 累计收到 10 条评论

使用shell模拟并发测试

admin
2024-02-27 / 0 评论 / 292 阅读 / 正在检测是否收录...
#!/bin/bash

# 设置并发数
CONCURRENT=10

SUCCESS_COUNT=0
FAIL_COUNT=0
LOG_FILE="error_responses.log"

# 清空之前的日志文件
> "$LOG_FILE"

DATA_BOOKMARK='{"query":"mutation backend_add_bookmark"}'

DATA_HISTORY='{"query":"mutation backend_add_history"}'

URL="https://prod-user-media-api-alb.viu.com/api/graphql/backend"

echo "开始压力测试,控制并发数为 $CONCURRENT"
echo "测试URL: $URL"
echo "按 Ctrl+C 停止测试"
echo "----------------------------------------"

make_request() {
    local data=$1
    local response=$(curl -s -w "%{http_code}" \
        -H 'accept: application/json' \
        -H 'accept-language: zh-CN,zh;q=0.9,en;q=0.8' \
        -H 'authorization: Bearer xxxxxxxxxxxxxxxxx' \
        -H 'content-type: application/json' \
        -d "$data" \
        "$URL")
    
    # 提取状态码(最后3个字符)
    local response_code=${response: -3}
    # 提取响应体(除最后3个字符外的所有内容)
    local response_body=${response%???}
    
    # 根据响应码更新计数器
    if [ "$response_code" = "200" ]; then
        SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
    else
        FAIL_COUNT=$((FAIL_COUNT + 1))
        # 记录错误响应到日志文件
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] Status: $response_code" >> "$LOG_FILE"
        echo "$response_body" >> "$LOG_FILE"
    fi
    
    printf "\\r成功: %d, 失败: %d, 最新状态码: %s" "$SUCCESS_COUNT" "$FAIL_COUNT" "$response_code"
}

worker() {
    while true; do
        # 随机选择一个请求数据
        if [ $((RANDOM % 2)) -eq 0 ]; then
            make_request "$DATA_BOOKMARK"
        else
            make_request "$DATA_HISTORY"
        fi
        sleep 0.1
    done
}

for ((i=1; i<=CONCURRENT; i++)); do
    worker &
done

wait
0

评论 (0)

取消