当前位置:首页 > 嵌入式 > 嵌入式分享
[导读]嵌入式单板(ARM开发板、工控机、物联网网关)的功能测试通常需要反复烧录固件、执行用例、检查结果。手动测试不仅耗时,而且容易遗漏异常日志。Shell脚本天然适合做这件事——通过SSH连接单板,批量运行测试用例,自动抓取日志并分析关键字,最后生成报告。下面以一个典型的单板测试场景为例:测试WiFi连接、GPIO翻转、温度读取三项功能。

嵌入式单板(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集成,能够显著提升嵌入式单板的测试效率和可靠性。关键在于用例的模块化设计和日志的标准化输出。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

在复杂软件系统的调试过程中,缺陷定位往往占据70%以上的故障修复时间。传统单一日志分析或断点调试方法在分布式、异步化架构中逐渐失效,本文提出一种日志分析与信号追踪的联合定位模型,通过时空维度交叉验证实现缺陷的精准定位。

关键字: 缺陷定位 日志分析 信号追踪

摘要:随着网络安全设备的不断增加和业务的快速发展,安全防护日志已成为一类海量数据,对安全日志进行统一存储和分析已成为电信运营商亟需解决的问题。现设计并实现了一种基于ELK的安全防护日志管理系统,通过合理设计系统架构,完成...

关键字: ELK 日志采集 日志分析

Java日志基础Java使用了一种自定义的、可扩展的方法来输出日志。虽然Java通过java.util.logging包提供了一套基本的日志处理API,但你可以很轻松的使用一种或者多种其它日志解决方案

关键字: java 日志分析
关闭