Shell脚本自动化测试:批量执行嵌入式单板功能用例与日志分析
嵌入式单板(ARM开发板、工控机、物联网网关)的功能测试通常需要反复烧录固件、执行用例、检查结果。手动测试不仅耗时,而且容易遗漏异常日志。Shell脚本天然适合做这件事——通过SSH连接单板,批量运行测试用例,自动抓取日志并分析关键字,最后生成报告。下面以一个典型的单板测试场景为例:测试WiFi连接、GPIO翻转、温度读取三项功能。
一、用例组织与执行框架
将每个测试用例写成独立的Shell函数或脚本,放在testcases/目录下。主控脚本遍历目录,逐一执行并记录结果。
#!/bin/bash
# test_runner.sh - 批量执行单板测试用例
BOARD_IP="192.168.1.100"
USER="root"
PASS="root"
LOG_DIR="./logs/$(date +%Y%m%d_%H%M%S)"
PASS_COUNT=0
FAIL_COUNT=0
mkdir -p "$LOG_DIR"
# 测试用例列表(函数名)
test_cases=(
test_wifi_connect
test_gpio_toggle
test_temperature_read
)
# 通用执行函数:通过SSH在单板上运行命令,记录输出
run_on_board() {
local cmd="$1"
sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no "$USER@$BOARD_IP" "$cmd" 2>&1
}
# 各个测试用例的实现
test_wifi_connect() {
echo "=== Test: WiFi Connection ==="
local result=$(run_on_board "iwconfig wlan0 | grep 'ESSID'")
if echo "$result" | grep -q "MyHomeWiFi"; then
echo "PASS: WiFi connected to MyHomeWiFi"
return 0
else
echo "FAIL: WiFi not connected or wrong ESSID"
echo "$result"
return 1
fi
}
test_gpio_toggle() {
echo "=== Test: GPIO Toggle ==="
local result=$(run_on_board "echo 1 > /sys/class/gpio/gpio17/value; cat /sys/class/gpio/gpio17/value")
if [ "$result" == "1" ]; then
echo "PASS: GPIO toggled high"
return 0
else
echo "FAIL: GPIO did not toggle"
return 1
fi
}
test_temperature_read() {
echo "=== Test: Temperature Read ==="
local temp=$(run_on_board "cat /sys/class/thermal/thermal_zone0/temp")
if [ "$temp" -gt 0 ] 2>/dev/null; then
echo "PASS: Temperature = $temp millidegree"
return 0
else
echo "FAIL: Invalid temperature reading"
return 1
fi
}
# 主循环
for tc in "${test_cases[@]}"; do
echo "----------------------------------------"
echo "Running: $tc"
logfile="$LOG_DIR/${tc}.log"
if $tc > "$logfile" 2>&1; then
((PASS_COUNT++))
echo "[PASS] $tc" | tee -a "$LOG_DIR/summary.log"
else
((FAIL_COUNT++))
echo "[FAIL] $tc" | tee -a "$LOG_DIR/summary.log"
fi
done
echo "========================================"
echo "Total: PASS=$PASS_COUNT FAIL=$FAIL_COUNT"
echo "Logs saved to $LOG_DIR"
二、日志分析:自动提取关键信息
测试结束后,需要对日志进行二次分析,找出异常模式。例如,检查所有日志中是否包含error、fail、timeout等关键字,并统计出现次数。
# analyze_logs.sh - 分析日志目录
LOG_DIR="$1"
ERROR_KEYWORDS=("error" "fail" "timeout" "exception")
echo "=== Log Analysis Report ==="
for keyword in "${ERROR_KEYWORDS[@]}"; do
count=$(grep -ri "$keyword" "$LOG_DIR" --include="*.log" | wc -l)
echo "Keyword '$keyword' appeared $count times"
done
# 列出所有FAIL的用例
echo ""
echo "Failed cases:"
grep -r "\[FAIL\]" "$LOG_DIR/summary.log" || echo "None"
可以将此脚本集成到CI/CD流水线中,每次固件更新后自动触发测试,并推送分析报告。
三、三个翻车高发点
SSH连接超时:单板启动较慢或网络不稳定时,ssh可能长时间阻塞。在ssh命令后加-o ConnectTimeout=10,并在脚本外层设置timeout命令,防止整个测试卡死。
命令返回值误判:有些命令即使执行成功也会返回非零退出码(如grep没找到匹配)。建议在用例中显式检查输出内容,而不是依赖$?。
日志文件过多:如果测试用例多且每次生成独立日志目录,磁盘很快耗尽。在脚本开头添加日志轮转逻辑,保留最近5次运行记录。
Shell脚本将重复的手动测试变成一键执行,配合关键字分析和CI集成,能够显著提升嵌入式单板的测试效率和可靠性。关键在于用例的模块化设计和日志的标准化输出。





