diff --git a/lib/ts_common.sh b/lib/ts_common.sh index 3e8bd1b1b27c988b6706ba9e8e7a68e2fc2d1a50..6470932b21c37f2c5a78b9b07e4af9c768666156 100644 --- a/lib/ts_common.sh +++ b/lib/ts_common.sh @@ -58,22 +58,29 @@ tc_teardown_common() { } # 判断ltp用例执行结果是否skip -# $1 -- 执行结果路径 +# $1 -- 执行结果路径(包含 results.json 的目录) # 返回值:0 -- skip,1 -- 非skip is_test_skip() { local run_path="$1" - - grep -A 5 "^Summary:" "$run_path/testcase.log" | grep "^failed[[:blank:]]*[1-9]$" && return 1 + local report="${run_path}/results.json" + + [ -f "$report" ] || return 1 + python3 -c ' +import json, sys +s = json.load(open(sys.argv[1]))["stats"] +sys.exit(0 if (s["failed"]+s["broken"]==0 and s["skipped"]>0 and s["passed"]==0) else 1) +' "$report" } # 执行ltp用例 -# $1 -- 用例所在文件 +# $1 -- 用例所在文件(runtest/ 下的 suite 名) # $2 -- 用例名称 ltp_run_testcase() { local ret=0 - local ltp_ret=0 local case_file=$1 local case_name=$2 + local run_dir="${g_test_dir}/run" + local report="${run_dir}/results.json" local tst_block=/dev/vdb if [ -n "$TST_DEVICE_BLOCK" ] && [ -b "$TST_DEVICE_BLOCK" ]; then @@ -93,76 +100,72 @@ ltp_run_testcase() { msg "tst_block=$tst_block" skip_if_false [ -b "$tst_block" ] - rm -rf "${g_test_dir}/run" - mkdir -p "${g_test_dir}/run/tmp" - cd "${g_install_dir}" || return 1 - # 将用例对应的命令写入文件 - if ! grep "^${case_name}[[:blank:]]" "${g_install_dir}/runtest/$case_file"; then - echo "get command for testcase $case_name fail" + if ! grep -wq "^${case_name}" "${g_install_dir}/runtest/${case_file}"; then + echo "case $case_name not in runtest/$case_file" return 1 fi - cat "${g_install_dir}"/runtest/* | grep -w "^$case_name" >"${g_test_dir}/run/testcase.run" - echo "testcase.run >>>>" - cat "${g_test_dir}/run/testcase.run" - echo "<<<< testcase.run" - - # 执行用例 - ./runltp -p \ - -C "${g_test_dir}/run/testcase.fail" \ - -T "${g_test_dir}/run/testcase.nofully" \ - -d "${g_test_dir}/run/tmp" \ - -f "${g_test_dir}/run/testcase.run" \ - -l "${g_test_dir}/run/testcase.result" \ - -o "${g_test_dir}/run/testcase.log" \ - -B "ext4" \ - -z "$tst_block" -Z ext4 - ltp_ret=$? - msg "runltp exit with code $ltp_ret" - if [ $ltp_ret -ne 0 ]; then - ret=1 - fi - # 打印测试日志 - for f in testcase.fail testcase.nofully testcase.run testcase.result testcase.log; do - echo "=====[ show ${g_test_dir}/run/$f ]=====" - if [ -f "${g_test_dir}/run/$f" ]; then - cat "${g_test_dir}/run/$f" - else - msg "file ${g_test_dir}/run/$f not found" - fi - echo "=====[ show ${g_test_dir}/run/$f ]=====" - done + # kirk 拒绝覆盖已存在的 json 报告,运行前清空目录 + rm -rf "$run_dir" + mkdir -p "$run_dir/tmp" + cd "${g_install_dir}" || return 1 - if [ $ret -ne 0 ]; then - # 用例如果失败了,就把内核日志也一起打印出来 - echo "====[ show ${g_test_dir}/run/dmesg.lasg.log ]====" - [ -f "${g_test_dir}/run/dmesg.lasg.log" ] && cat "${g_test_dir}/run/dmesg.lasg.log" + # 块设备通过环境变量传给 kirk,libkirk/ltp.py 会自动转发 LTP_/TST_ 前缀变量 + export LTP_DEV="$tst_block" + export LTP_DEV_FS_TYPE=ext4 + export LTP_BIG_DEV="$tst_block" + export LTP_BIG_DEV_FS_TYPE=ext4 + + ./kirk \ + --no-colors -v \ + -d "$run_dir/tmp" \ + -o "$report" \ + -f "$case_file" \ + -p "^${case_name}$" + msg "kirk exit with code $?" + + echo "=====[ show $report ]=====" + if [ -f "$report" ]; then + cat "$report" + else + msg "file $report not found" + echo "=====[ show $report ]=====" echo "====[ dmesg -c ]====" dmesg -c + return 1 fi + echo "=====[ show $report ]=====" + + local stats_output + if ! stats_output="$(python3 -c ' +import json, sys +with open(sys.argv[1]) as f: + s = json.load(f)["stats"] +print(s["passed"], s["failed"], s["broken"], s["skipped"]) +' "$report")"; then + msg "parse $report fail" + return 1 + fi + local passed failed broken skipped + read -r passed failed broken skipped <<<"$stats_output" + msg "passed=$passed failed=$failed broken=$broken skipped=$skipped" - # 测试没结果,直接失败 - [ -f "${g_test_dir}/run/testcase.result" ] || return 1 - - # 检查执行结果 - echo "check ${g_test_dir}/run/testcase.fail" - [ "$(wc -l <"${g_test_dir}/run/testcase.fail")" -ne 0 ] && { - echo "some testcase fail" - ret=1 - } - - local ltp_total - ltp_total="$(grep "Total Tests:" "${g_test_dir}/run/testcase.result" | awk '{print $NF}')" - local ltp_skip - ltp_skip="$(grep "Total Skipped Tests:" "${g_test_dir}/run/testcase.result" | awk '{print $NF}')" - msg "ltp_total=$ltp_total, ltp_skip=$ltp_skip" - if [ -z "$ltp_total" ]; then + local executed=$((passed + failed + broken)) + if [ "$((executed + skipped))" -eq 0 ]; then ret=1 - elif [ "$ltp_total" -eq 0 ]; then + elif [ "$failed" -gt 0 ] || [ "$broken" -gt 0 ]; then ret=1 - elif [ "$ltp_total" == "$ltp_skip" ]; then + elif [ "$executed" -eq 0 ] && [ "$skipped" -gt 0 ]; then skip_test "all test skip" fi + if [ $ret -ne 0 ]; then + # 用例如果失败了,就把内核日志也一起打印出来 + echo "====[ show ${run_dir}/dmesg.lasg.log ]====" + [ -f "${run_dir}/dmesg.lasg.log" ] && cat "${run_dir}/dmesg.lasg.log" + echo "====[ dmesg -c ]====" + dmesg -c + fi + return $ret } diff --git a/tst-open-ltp b/tst-open-ltp index 01614cde43132e7da9f3c9ba7703ead576caa424..70511a0d16e1203ca6316918ba8c66631e0c047c 160000 --- a/tst-open-ltp +++ b/tst-open-ltp @@ -1 +1 @@ -Subproject commit 01614cde43132e7da9f3c9ba7703ead576caa424 +Subproject commit 70511a0d16e1203ca6316918ba8c66631e0c047c