XML实体扩展命令行工具:Shell测试脚本动态时间戳XML处理需求
嘿,这个用XML外部实体处理动态时间戳的思路真的很靠谱——既保留了测试用例XML的静态可读性,又能灵活注入动态值,完美适配你的需求!下面我给你拆解一套完整的Shell脚本实现方案,一步步来:
1. 先写好带实体占位的XML测试模板
给每个测试用例单独创建静态XML文件,把需要动态替换的两个时间戳用外部实体占位就行。比如我给你整个示例模板test_case_1.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE payload [ <!ENTITY current_ts SYSTEM "current_ts.txt"> <!ENTITY future_ts SYSTEM "future_ts.txt"> ]> <request> <event> <startTime>¤t_ts;</startTime> <endTime>&future_ts;</endTime> <!-- 下面都是你的静态测试内容,按需编写 --> <type>USER_LOGIN</type> <source>AUTOMATED_TEST</source> </event> </request>
这里¤t_ts;和&future_ts;就是动态时间戳的占位符,我们会用Shell脚本动态生成这两个对应的文本文件内容。
2. 用Shell生成符合要求的动态时间戳
Shell里用date命令就能轻松搞定时间戳生成,关键是要匹配目标系统的时间格式(比如常见的ISO 8601格式YYYY-MM-DDTHH:MM:SSZ)。示例代码如下:
# 生成接近当前时间的时间戳(示例用UTC时间,时区按需调整) CURRENT_TS=$(date -u +"%Y-%m-%dT%H:%M:%SZ") # 生成未来2小时的时间戳,偏移量可灵活修改:+30min、+1h、+5h都支持 FUTURE_TS=$(date -u -d "+2 hours" +"%Y-%m-%dT%H:%M:%SZ") # 把时间戳写入外部实体文件,供XML模板调用 echo "$CURRENT_TS" > current_ts.txt echo "$FUTURE_TS" > future_ts.txt
如果目标系统需要其他格式(比如纯数字串20240520143000),只需要修改date后面的格式字符串即可,比如换成%Y%m%d%H%M%S。
3. 解析XML实体并发送到目标系统
接下来需要让XML解析器加载外部实体,生成完整的XML内容。Linux系统默认自带的xmllint工具就能搞定这个,用--noent参数就能自动替换实体。然后把生成的完整XML发给目标系统就行:
# 处理XML模板,替换实体得到最终的请求XML FINAL_XML=$(xmllint --noent test_case_1.xml) # 发送请求,这里用curl做示例,你根据目标系统的接口调整请求方式 curl -X POST -H "Content-Type: application/xml" -d "$FINAL_XML" http://your-target-system/api/endpoint
4. 多测试用例的批量处理
如果有多个测试用例(每个对应独立XML模板),你可以把逻辑封装成函数,循环处理更高效:
# 封装处理单个测试用例的函数 process_test_case() { local template_file=$1 local future_offset=$2 # 传入未来时间的偏移量,比如"+30min" # 生成时间戳 CURRENT_TS=$(date -u +"%Y-%m-%dT%H:%M:%SZ") FUTURE_TS=$(date -u -d "$future_offset" +"%Y-%m-%dT%H:%M:%SZ") echo "$CURRENT_TS" > current_ts.txt echo "$FUTURE_TS" > future_ts.txt # 处理XML并发送 FINAL_XML=$(xmllint --noent "$template_file") echo "正在发送测试用例: $template_file" curl -X POST -H "Content-Type: application/xml" -d "$FINAL_XML" http://your-target-system/api/endpoint } # 批量调用处理不同测试用例 process_test_case "test_case_1.xml" "+30min" process_test_case "test_case_2.xml" "+2h" process_test_case "test_case_3.xml" "+1h30min"
5. 别忘了清理临时文件
脚本运行完后,要删掉生成的current_ts.txt和future_ts.txt临时文件,避免影响下次执行。你可以在脚本开头加个陷阱,确保不管脚本正常结束还是异常退出都能清理:
# 脚本退出时自动删除临时文件 trap "rm -f current_ts.txt future_ts.txt" EXIT
几个小提醒
- 一定要确认目标系统的时间格式和时区要求,示例用的是UTC时间(
-u参数),如果系统需要本地时间,去掉-u即可 - 如果你的系统没有
xmllint,也可以用xsltproc或者直接Shell字符串替换,但实体方案对复杂XML更友好,不容易出错 - 如果时间戳需要精确到毫秒,GNU环境下的
date命令可以用%3N,比如date -u +"%Y-%m-%dT%H:%M:%S.%3NZ"
内容的提问来源于stack exchange,提问作者user149408




