XCUITest后处理脚本中xcparse命令持续报错,终端执行却正常
XCUITest截图导出脚本中xcparse命令报错问题
问题描述
我已搭建XCUITest目标以自动生成截图,现尝试编写bash脚本自动化导出这些截图,脚本内容如下:
exec > "${PROJECT_DIR}/post_test.log" 2>&1 set -o pipefail set -e subparent="$(dirname "$BUILD_DIR")" derived_data="$(dirname "$subparent")" test_result_folder="$derived_data/Logs/Test" files=($test_result_folder/*.xcresult) filename=${files[@]: -1} echo "DerivedData path: $derived_data" echo "Test result folder: $test_result_folder" echo "Files:" printf '%s\n' "${files[@]}" echo "\nMost recent is $filename" echo /opt/homebrew/bin/xcparse attachments ${filename} ${PROJECT_DIR}/Screenshots | pbcopy /opt/homebrew/bin/xcparse attachments $filename ${PROJECT_DIR}/Screenshots
脚本中的xcparse命令始终返回错误,但将相同命令粘贴到终端执行却完全正常,错误信息如下:
Error: “/Users/user/Library/Developer/Xcode/DerivedData/MyApp-dhlyvtxfzjxxazcadignzodednxi/Logs/Test/Test-MyAppScreenshotsUITests-2023.03.31_12-27-42-+0200.xcresult” does not appear to be an xcresult
问题原因与解决办法
- 核心问题:脚本中用
files=($test_result_folder/*.xcresult)通过通配符赋值数组的方式,当xcresult文件路径包含+这类特殊字符时,Shell会错误解析路径,导致filename变量拿到的路径被拆分或转义异常,最终xcparse无法识别正确的文件路径。 - 修复方案:
- 改用
find命令获取最新的xcresult文件,避开通配符解析问题:filename=$(find "$test_result_folder" -name "*.xcresult" -type d | sort -r | head -n 1) - 所有路径变量使用时必须用双引号包裹,防止特殊字符被Shell拆分:
修改xcparse执行命令为:/opt/homebrew/bin/xcparse attachments "$filename" "${PROJECT_DIR}/Screenshots" - 复制命令到剪贴板的行也要添加双引号,确保终端执行时路径正确:
echo "/opt/homebrew/bin/xcparse attachments \"$filename\" \"${PROJECT_DIR}/Screenshots\"" | pbcopy
- 改用
- 修复后的完整脚本:
exec > "${PROJECT_DIR}/post_test.log" 2>&1 set -o pipefail set -e subparent="$(dirname "$BUILD_DIR")" derived_data="$(dirname "$subparent")" test_result_folder="$derived_data/Logs/Test" # 获取最新的xcresult文件 filename=$(find "$test_result_folder" -name "*.xcresult" -type d | sort -r | head -n 1) echo "DerivedData path: $derived_data" echo "Test result folder: $test_result_folder" echo "Most recent is $filename" # 复制带引号的命令到剪贴板 echo "/opt/homebrew/bin/xcparse attachments \"$filename\" \"${PROJECT_DIR}/Screenshots\"" | pbcopy # 执行xcparse命令,路径用双引号包裹 /opt/homebrew/bin/xcparse attachments "$filename" "${PROJECT_DIR}/Screenshots"
内容的提问来源于stack exchange,提问作者Andrea Mario Lufino
相关产品推荐
相关产品推荐

