Files
my-mom-system/mom-backend/docs/Testing/run-ebom-api-tests.sh
2026-03-06 02:12:34 +08:00

151 lines
6.1 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# EBOM API 测试脚本(依据 docs/Testing/EBOM-API测试文档.md
# 使用:先启动后端(如 mvn spring-boot:run -pl ktg-admin再执行本脚本。
# 环境变量BASE_URL默认 http://localhost:8080、TOKEN可选不设则尝试登录、USERNAME、PASSWORD
set -e
BASE_URL="${BASE_URL:-http://localhost:8080}"
USERNAME="${USERNAME:-admin}"
PASSWORD="${PASSWORD:-admin123}"
RESULT_DIR="${RESULT_DIR:-./test-results}"
mkdir -p "$RESULT_DIR"
REPORT="$RESULT_DIR/ebom-api-test-$(date +%Y%m%d-%H%M%S).txt"
PASS=0
FAIL=0
log() { echo "[$(date +%H:%M:%S)] $*" | tee -a "$REPORT"; }
run() {
local name="$1"
local method="$2"
local path="$3"
local data="$4"
local extra="$5"
local url="${BASE_URL}${path}"
local out="$RESULT_DIR/response_${name}.json"
local code=""
if [[ "$method" == GET ]]; then
if [[ -n "$extra" ]]; then
url="${url}${extra}"
fi
code=$(curl -s -w '%{http_code}' -o "$out" -H "Authorization: Bearer ${TOKEN}" "$url")
elif [[ "$method" == POST ]]; then
code=$(curl -s -w '%{http_code}' -o "$out" -X POST -H "Content-Type: application/json" -H "Authorization: Bearer ${TOKEN}" -d "$data" "$url")
elif [[ "$method" == PUT ]]; then
code=$(curl -s -w '%{http_code}' -o "$out" -X PUT -H "Content-Type: application/json" -H "Authorization: Bearer ${TOKEN}" -d "$data" "$url")
elif [[ "$method" == DELETE ]]; then
code=$(curl -s -w '%{http_code}' -o "$out" -X DELETE -H "Authorization: Bearer ${TOKEN}" "$url")
fi
local json_code=""
if [[ -f "$out" ]] && [[ -s "$out" ]]; then
json_code=$(grep -o '"code"[[:space:]]*:[[:space:]]*[0-9]*' "$out" | head -1 | grep -o '[0-9]*' || true)
fi
if [[ "$code" == 200 ]] && { [[ -z "$json_code" ]] || [[ "$json_code" == "200" ]]; }; then
log "PASS $name ($method $path)"
((PASS++)) || true
return 0
else
log "FAIL $name ($method $path) HTTP=$code jsonCode=$json_code"
[[ -f "$out" ]] && log " body: $(head -c 500 "$out")"
((FAIL++)) || true
return 1
fi
}
# 登录获取 token若未设置 TOKEN
if [[ -z "$TOKEN" ]]; then
log "Login to get token..."
login_out="$RESULT_DIR/login.json"
http=$(curl -s -w '%{http_code}' -o "$login_out" -X POST -H "Content-Type: application/json" \
-d "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\",\"code\":\"\",\"uuid\":\"\"}" \
"$BASE_URL/login")
if [[ "$http" != 200 ]]; then
log "Login failed (HTTP $http). Set TOKEN manually or disable captcha. body: $(cat "$login_out")"
exit 1
fi
TOKEN=$(grep -o '"token"[[:space:]]*:[[:space:]]*"[^"]*"' "$login_out" | sed 's/.*:"\(.*\)"/\1/')
if [[ -z "$TOKEN" ]]; then
log "Login response had no token. body: $(cat "$login_out")"
exit 1
fi
log "Token obtained."
fi
log "========== EBOM API Tests =========="
log "BASE_URL=$BASE_URL"
# 2.1 列表
run "bom-list" "GET" "/mes/md/bom/list" "" ""
run "bom-list-status" "GET" "/mes/md/bom/list" "" "?pageNum=1&pageSize=10&status=DRAFT"
run "bom-list-itemCode" "GET" "/mes/md/bom/list" "" "?pageNum=1&pageSize=10"
# 2.2 详情(先取一条 id从列表结果取第一个 bomId若无则跳过
if [[ -f "$RESULT_DIR/response_bom-list.json" ]] && [[ -s "$RESULT_DIR/response_bom-list.json" ]]; then
first_id=$(grep -o '"bomId"[[:space:]]*:[[:space:]]*[0-9]*' "$RESULT_DIR/response_bom-list.json" | head -1 | grep -o '[0-9]*' || true)
if [[ -n "$first_id" ]]; then
run "bom-get" "GET" "/mes/md/bom/$first_id" "" ""
else
log "SKIP bom-get (no bomId in list)"
fi
else
log "SKIP bom-get (no list response)"
fi
# 2.3 新增
add_body='{"bomCode":"API-TEST-BOM-'$(date +%s)'","bomName":"API测试BOM","itemId":1,"itemCode":"ITEM01","itemName":"产品A","unitName":"台","baseQty":1,"version":"V1.0","versionDesc":"初版","status":"DRAFT","enableFlag":"Y","remark":"脚本测试"}'
run "bom-add" "POST" "/mes/md/bom" "$add_body"
# 从新增响应取 bomId 用于后续修改/审核/删除
new_bom_id=""
if [[ -f "$RESULT_DIR/response_bom-add.json" ]]; then
new_bom_id=$(grep -o '"bomId"[[:space:]]*:[[:space:]]*[0-9]*' "$RESULT_DIR/response_bom-add.json" | head -1 | grep -o '[0-9]*' || true)
# 也可能在 data 里
if [[ -z "$new_bom_id" ]]; then
new_bom_id=$(grep -o '"data"[[:space:]]*:[[:space:]]*{[^}]*"bomId"[^}]*}' "$RESULT_DIR/response_bom-add.json" | grep -o '"bomId"[[:space:]]*:[[:space:]]*[0-9]*' | grep -o '[0-9]*' || true)
fi
fi
# 2.4 修改(若有新 id
if [[ -n "$new_bom_id" ]]; then
update_body="{\"bomId\":$new_bom_id,\"bomCode\":\"API-TEST-BOM-UPD\",\"bomName\":\"API测试BOM(已改)\",\"itemId\":1,\"baseQty\":1,\"version\":\"V1.0\",\"status\":\"DRAFT\"}"
run "bom-update" "PUT" "/mes/md/bom" "$update_body"
fi
# 2.6 审核
if [[ -n "$new_bom_id" ]]; then
run "bom-approve" "PUT" "/mes/md/bom/approve" "{\"bomId\":$new_bom_id}"
fi
# 2.7 反审核
if [[ -n "$new_bom_id" ]]; then
run "bom-reject" "PUT" "/mes/md/bom/reject" "{\"bomId\":$new_bom_id}"
fi
# 2.8 导出(只检查 HTTP 200 或 403
export_url="${BASE_URL}/mes/md/bom/export?pageNum=1&pageSize=10"
export_code=$(curl -s -w '%{http_code}' -o "$RESULT_DIR/response_bom-export.bin" -H "Authorization: Bearer ${TOKEN}" "$export_url")
if [[ "$export_code" == 200 ]]; then
log "PASS bom-export (GET /mes/md/bom/export)"
((PASS++)) || true
else
log "FAIL bom-export HTTP=$export_code (may be 403 if no permission)"
((FAIL++)) || true
fi
# 3.1 明细列表
run "line-list" "GET" "/mes/md/bom/line/list" "" "?pageNum=1&pageSize=10"
# 3.3 新增明细(需要有效的 bomCode/bomId用上面 new_bom_id 或列表第一条的 bomCode
bom_code="API-TEST-BOM-UPD"
if [[ -n "$new_bom_id" ]]; then
line_add_body="{\"bomCode\":\"$bom_code\",\"itemId\":1,\"bomItemId\":2,\"bomItemCode\":\"MAT01\",\"bomItemName\":\"物料1\",\"quantity\":2,\"unitOfMeasure\":\"个\",\"lineNo\":1,\"supplyType\":\"PRODUCE\"}"
run "line-add" "POST" "/mes/md/bom/line" "$line_add_body"
fi
# 2.5 删除(放在最后,删除本次新增的 BOM
if [[ -n "$new_bom_id" ]]; then
run "bom-delete" "DELETE" "/mes/md/bom/$new_bom_id" "" ""
fi
log "========== Result: PASS=$PASS FAIL=$FAIL =========="
[[ $FAIL -gt 0 ]] && exit 1 || exit 0