当前位置: 首页 > news >正文

Claude Code编程经验记录总结-让AI使用Shell脚本为web接口提供测试脚本

问题背景

这几天用AI,我发现AI自己测试验证后端接口功能是否正常,它不会去写DT,而是通过shell构建测试用例,利用curl等命令来验证业务功能实现是否正确,效果非常不错,使用shell有几个好处
1)AI非常擅长编写脚本,天生适合在终端工作
2)shell脚本更面向业务功能,对表测试写的自动化测试脚本,与代码实现解耦更好
3)shell还能脱离接口的实现语言,往长远说,后面换一种语言实现,用例也能用
shell这种方式也有不好的地方,无法实现mock相关逻辑,必须要有一套能运行的环境
整体看,shell测试套可以和DT配合,让AI写有效的DT还没有深度探索,这几天看看有没有时间让他搞一下
image

看几个例子

让AI开发算子支持添加代码库依赖的功能

image
image

点击查看测试脚本
#!/bin/bash# 算子公共库依赖测试脚本# 基础配置
BASE_URL="http://localhost:8080/api/v1"
USERNAME="admin"
PASSWORD="admin123"# 测试数据
LIBRARY_NAME="TestLibrary_$$"
LIBRARY_VERSION="1.0"
LIBRARY_TYPE="METHOD"
OPERATOR_NAME="TestOperatorForLib_$$"
OPERATOR_CODE="test_operator_lib_$$"# 全局变量
TOKEN=""
LIBRARY_ID=""
OPERATOR_ID=""# 打印测试标题
print_header() {echo ""echo "======================================"echo "$1"echo "======================================"
}# 登录并获取 Token
login() {print_header "1. 登录系统"RESPONSE=$(curl -s -X POST "${BASE_URL}/auth/login" \-H "Content-Type: application/json" \-d "{\"username\":\"${USERNAME}\",\"password\":\"${PASSWORD}\"}")echo "登录响应: $RESPONSE"TOKEN=$(echo "$RESPONSE" | grep -o '"accessToken":"[^"]*"' | sed 's/"accessToken":"//g')if [ -z "$TOKEN" ]; thenecho "❌ 登录失败,无法获取 Token"exit 1fiecho "✅ 登录成功,Token: ${TOKEN:0:20}..."
}# 创建公共库
create_library() {print_header "2. 创建公共库"RESPONSE=$(curl -s -X POST "${BASE_URL}/libraries" \-H "Content-Type: application/json" \-H "Authorization: Bearer $TOKEN" \-d "{\"name\":\"${LIBRARY_NAME}\",\"description\":\"测试用公共库\",\"version\":\"${LIBRARY_VERSION}\",\"category\":\"测试\",\"libraryType\":\"${LIBRARY_TYPE}\",\"files\":[{\"fileName\":\"TestUtils.groovy\",\"code\":\"public class TestUtils {\\n    public static String hello() {\\n        return \\\"Hello\\\";\\n    }\\n}\",\"orderIndex\":0}]}")echo "创建公共库响应: $RESPONSE"LIBRARY_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | head -1 | sed 's/"id"://')if [ -z "$LIBRARY_ID" ]; thenecho "❌ 创建公共库失败"exit 1fiecho "✅ 公共库创建成功,ID: $LIBRARY_ID"
}# 创建算子
create_operator() {print_header "3. 创建算子"RESPONSE=$(curl -s -X POST "${BASE_URL}/operators" \-H "Content-Type: application/json" \-H "Authorization: Bearer $TOKEN" \-d "{\"name\":\"${OPERATOR_NAME}\",\"description\":\"测试算子\",\"operatorCode\":\"${OPERATOR_CODE}\",\"language\":\"GROOVY\",\"status\":\"DRAFT\",\"objectCode\":\"TestObject\"}")echo "创建算子响应: $RESPONSE"OPERATOR_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | head -1 | sed 's/"id"://')if [ -z "$OPERATOR_ID" ]; thenecho "❌ 创建算子失败"exit 1fiecho "✅ 算子创建成功,ID: $OPERATOR_ID"
}# 获取算子依赖的公共库列表(应为空)
get_operator_libraries_empty() {print_header "4. 获取算子依赖的公共库列表(应为空)"RESPONSE=$(curl -s -X GET "${BASE_URL}/operators/${OPERATOR_ID}/library-dependencies" \-H "Authorization: Bearer $TOKEN")echo "获取公共库列表响应: $RESPONSE"if echo "$RESPONSE" | grep -q '"data":\[\]'; thenecho "✅ 算子未依赖任何公共库(符合预期)"elseecho "❌ 算子已有依赖的公共库(不符合预期)"exit 1fi
}# 添加公共库依赖
add_library_dependency() {print_header "5. 添加公共库依赖"RESPONSE=$(curl -s -X POST "${BASE_URL}/operators/${OPERATOR_ID}/library-dependencies" \-H "Content-Type: application/json" \-H "Authorization: Bearer $TOKEN" \-d "{\"libraryId\": ${LIBRARY_ID}}")echo "添加依赖响应: $RESPONSE"SUCCESS=$(echo "$RESPONSE" | grep -o '"success":[^,}]*' | sed 's/"success"://')if [ "$SUCCESS" != "true" ]; thenecho "❌ 添加公共库依赖失败"exit 1fiecho "✅ 公共库依赖添加成功"
}# 获取算子依赖的公共库列表(应有 1 个)
get_operator_libraries_one() {print_header "6. 获取算子依赖的公共库列表(应有 1 个)"RESPONSE=$(curl -s -X GET "${BASE_URL}/operators/${OPERATOR_ID}/library-dependencies" \-H "Authorization: Bearer $TOKEN")echo "获取公共库列表响应: $RESPONSE"if echo "$RESPONSE" | grep -q "${LIBRARY_NAME}"; thenecho "✅ 算子依赖了公共库 ${LIBRARY_NAME}(符合预期)"elseecho "❌ 算子未依赖公共库(不符合预期)"exit 1fi
}# 尝试重复添加公共库依赖(应失败)
add_duplicate_library_dependency() {print_header "7. 尝试重复添加公共库依赖(应失败)"RESPONSE=$(curl -s -X POST "${BASE_URL}/operators/${OPERATOR_ID}/library-dependencies" \-H "Content-Type: application/json" \-H "Authorization: Bearer $TOKEN" \-d "{\"libraryId\": ${LIBRARY_ID}}")echo "重复添加依赖响应: $RESPONSE"SUCCESS=$(echo "$RESPONSE" | grep -o '"success":[^,}]*' | sed 's/"success"://')if [ "$SUCCESS" != "true" ]; thenecho "✅ 重复添加被拒绝(符合预期)"elseecho "❌ 重复添加未被拒绝(不符合预期)"exit 1fi
}# 移除公共库依赖
remove_library_dependency() {print_header "8. 移除公共库依赖"RESPONSE=$(curl -s -X DELETE "${BASE_URL}/operators/${OPERATOR_ID}/library-dependencies/${LIBRARY_ID}" \-H "Authorization: Bearer $TOKEN")echo "移除依赖响应: $RESPONSE"SUCCESS=$(echo "$RESPONSE" | grep -o '"success":[^,}]*' | sed 's/"success"://')if [ "$SUCCESS" != "true" ]; thenecho "❌ 移除公共库依赖失败"exit 1fiecho "✅ 公共库依赖移除成功"
}# 获取算子依赖的公共库列表(应为空)
get_operator_libraries_empty_again() {print_header "9. 获取算子依赖的公共库列表(应为空)"RESPONSE=$(curl -s -X GET "${BASE_URL}/operators/${OPERATOR_ID}/library-dependencies" \-H "Authorization: Bearer $TOKEN")echo "获取公共库列表响应: $RESPONSE"if echo "$RESPONSE" | grep -q '"data":\[\]'; thenecho "✅ 算子未依赖任何公共库(符合预期)"elseecho "❌ 算子仍有依赖的公共库(不符合预期)"exit 1fi
}# 清理测试数据
cleanup() {print_header "10. 清理测试数据"# 删除算子curl -s -X DELETE "${BASE_URL}/operators/${OPERATOR_ID}" \-H "Authorization: Bearer $TOKEN" > /dev/nullecho "✅ 测试算子已删除"# 删除公共库curl -s -X DELETE "${BASE_URL}/libraries/${LIBRARY_ID}" \-H "Authorization: Bearer $TOKEN" > /dev/nullecho "✅ 测试公共库已删除"
}# 主测试流程
main() {echo "开始算子公共库依赖功能测试..."# 登录login# 创建测试数据create_librarycreate_operator# 测试功能get_operator_libraries_emptyadd_library_dependencyget_operator_libraries_oneadd_duplicate_library_dependencyremove_library_dependencyget_operator_libraries_empty_again# 清理cleanupecho ""echo "======================================"echo "✅ 所有测试通过!"echo "======================================"
}# 执行主流程
main
http://www.jsqmd.com/news/401925/

相关文章:

  • 基于Java:同城理发预约高效服务系统
  • Redux store深度解析
  • 【含文档+PPT+源码】基于SpringBoot+Vue的自由服装穿搭平台
  • 基于Thinkphp和Laravel的微科优选校园招聘平台
  • ChatGPT归档实践指南:从数据管理到高效检索
  • Ollama部署translategemma-12b-it企业实操:替代DeepL实现数据不出域翻译
  • 实战解析:如何高效生成ChatTTS样本音频代码
  • 学术写作“变形记”:书匠策AI如何让论文降重与AIGC消除成为“创意游戏”
  • No162:AI中国故事-对话庖丁——解牛之道与AI入微:依乎天理与技进于道
  • 嵌入式系统稳定性三大支柱:防御启动、状态机初始化与多级看门狗
  • WeKnora企业落地:某车企用WeKnora构建车型配置知识库,销售响应提速300%
  • AI辅助开发实战:如何构建高可用客服智能体系统
  • 毕业设计C语言项目避坑指南:从需求分析到健壮实现的完整技术路径
  • 基于Thinkphp和Laravel的智慧图书馆图书借阅管理系统
  • 嵌入式系统稳定性三大基石:上电自检、状态机与看门狗协同设计
  • cv_resnet50_face-reconstruction模型部署中的GPU资源优化
  • 嵌入式系统稳定性加固:上电自检、状态机与看门狗协同设计
  • OLED模块硬件接口设计与I²C通信避坑指南
  • 基于Thinkphp和Laravel的幼儿园学生管理系统vue
  • 毕业设计刷题平台:新手入门实战指南与架构避坑
  • ESP32 WiFi硬件设计与MicroPython协同优化指南
  • 用一个厨房故事,看懂Spring全体系(Spring→Spring Boot→Spring Cloud,小白也能懂)
  • Chrome TTS报错深度解析:从AI辅助开发到声音播放故障排查
  • Qwen2.5-Coder-1.5B参数详解:28层GQA结构与32K上下文实战价值
  • 嵌入式系统掉电鲁棒性:从Flash保护到状态机初始化
  • ESP32+MicroPython实现高可靠MQTT物联网通信
  • Solid组件深度解析
  • BERT在智能客服中的实战应用:从模型选型到生产部署
  • ESP32 WiFi连接失败的根因分析与网络拓扑验证
  • 读人工智能全球格局:未来趋势与中国位势12人才争夺(下)