自动化测试脚本实践:基于 Bash 的模块化测试框架

embedded/2025/1/13 10:07:54/

前言

  在现代软件开发中,测试自动化是确保软件质量和稳定性的核心手段之一。随着开发周期的缩短和功能模块的增多,手动测试逐渐无法满足高效性和准确性的需求。因此,测试人员需要依赖自动化工具来提升测试效率,减少人为干预和错误。

  本文将介绍一款基于 Bash 脚本的简单自动化测试工具,它旨在帮助测试人员高效地管理和执行多种测试任务。这个脚本不仅能在命令行下交互式地进行模块选择,还能根据实际测试结果显示通过或失败的状态,方便测试人员快速识别问题。

一、目录结构

bash">test/
├── config.conf
├── scripts/
│   └── eth.sh
└── tools/
└── xxx_test_scripts.sheth.sh: 当前示例脚本,一个sh脚本写一个测试功能,所有测试脚本都放在scripts目录下;
xxx_test_scripts.sh: 这是框架的主脚本,包含多个可选的测试模块,用户可以根据需要选择并执行某个具体的功能测试;
config.conf: 配置文件,用于存储全局配置、测试项启用状态以及其他参数;
tools/: 存放工具或素材,用于扩展框架的功能。

二、代码

1、config.conf

bash"># ====== 0 代表启用测试项,1 代表不启用测试项 ======
example1_activation=0
example2_activation=0
example3_activation=0# ====== 其它功能配置 ======
test=888

2、eth.sh

bash">#!/bin/bash# 获取当前脚本所在的目录
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
echo "Current script directory: ${SCRIPT_DIR}"# 返回到上级目录
PARENT_DIR=$(dirname "$SCRIPT_DIR")
echo "Parent directory: ${PARENT_DIR}"# 加载上级目录中的配置文件
source ${PARENT_DIR}/config.conf
echo "${test}"test_eth() {eth_status="$1"if ! ip link show "$eth_status" | grep -q "state UP"; thenexit 1 # 失败时退出,返回 1elseexit 0 # 成功时退出,返回 0fi
}test_eth "$1"

3、xxx_test_scripts.sh

bash">#!/bin/bash# 获取当前脚本所在的目录
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)# 检查 config.conf 是否存在
if [[ ! -f "${SCRIPT_DIR}/config.conf" ]]; thenecho "config.conf not found!"exit 1
fi# 加载配置文件
source ${SCRIPT_DIR}/config.confEXAMPLE1_RESULT=0
EXAMPLE2_RESULT=0
EXAMPLE3_RESULT=0# 依赖软件安装
install() {if ! command -v figlet > /dev/null 2>&1; thenecho "Writing the installation method."fi
}test_example1() {read -p "example1 test results(y: pass - n: fail): " example1if [[ "${example1}" == "N" ]] || [[ "${example1}" == "n" ]]; thenEXAMPLE1_RESULT=1echo -e "####################\033[31m example1:      fail \033[0m#####################"echo "##############################################################"elseEXAMPLE1_RESULT=0echo -e "####################\033[32m example1:      pass \033[0m#####################"echo "##############################################################"fi
}test_example2() {read -p "example2 test results(y: pass - n: fail): " example2if [[ "${example2}" == "N" ]] || [[ "${example2}" == "n" ]]; thenEXAMPLE2_RESULT=1echo -e "####################\033[31m example2:      fail \033[0m#####################"echo "##############################################################"elseEXAMPLE2_RESULT=0echo -e "####################\033[32m example2:      pass \033[0m#####################"echo "##############################################################"fi
}test_example3() {sudo chmod 777 ${SCRIPT_DIR}/scripts/eth.shsudo ${SCRIPT_DIR}/scripts/eth.sh eth0if [[ $? -eq 0 ]]; thenEXAMPLE3_RESULT=0echo -e "####################\033[32m example3:      pass \033[0m#####################"echo "##############################################################"elseEXAMPLE3_RESULT=1echo -e "####################\033[31m example3:      fail \033[0m#####################"echo "##############################################################"fi
}test_exit() {exit 11
}module_choice() {echo " "echo "**************** Test Module Selection (Failures Detected) ****************"echo " 0 (exit                              test)"if [[ ${example1_activation} == "0" ]]; thenif [[ ${EXAMPLE1_RESULT} -eq 0 ]]; thenecho -e " 1 (example1                          test) [\033[32m pass \033[0m]"elseecho -e " 1 (example1                          test) [\033[31m fail \033[0m]"fifiif [[ ${example2_activation} == "0" ]]; thenif [[ ${EXAMPLE2_RESULT} -eq 0 ]]; thenecho -e " 2 (example2                          test) [\033[32m pass \033[0m]"elseecho -e " 2 (example2                          test) [\033[31m fail \033[0m]"fifiif [[ ${example3_activation} == "0" ]]; thenif [[ ${EXAMPLE3_RESULT} -eq 0 ]]; thenecho -e " 3 (example3                          test) [\033[32m pass \033[0m]"elseecho -e " 3 (example3                          test) [\033[31m fail \033[0m]"fifiecho " R (Failure item                      test)"echo "***************************************************************************"read -p "please select a test module to rerun or exit: " MODULE_CHOICE
}module_test() {MODULE_CHOICE=$(echo "$MODULE_CHOICE" | tr '[:upper:]' '[:lower:]')case ${MODULE_CHOICE} in0)test_exit;;1)if [[ ${example1_activation} == "0" ]]; thentest_example1fi;;2)if [[ ${example2_activation} == "0" ]]; thentest_example2fi;;3)if [[ ${example3_activation} == "0" ]]; thentest_example3fi;;r)# Failure item选项,重新测试所有失败的项if [[ ${EXAMPLE1_RESULT} -eq 1 ]]; thentest_example1fiif [[ ${EXAMPLE2_RESULT} -eq 1 ]]; thentest_example2fiif [[ ${EXAMPLE3_RESULT} -eq 1 ]]; thentest_example3fi;;# *)# echo "Invalid choice. Please try again."# ;;esac
}check_all_pass() {local test_results=(${EXAMPLE1_RESULT}${EXAMPLE2_RESULT}${EXAMPLE3_RESULT})all_zero=true# 如果有一个结果等于1,标记为falsefor all_result in "${test_results[@]}"; doif [[ "${all_result}" -eq 1 ]]; thenall_zero=falsebreakfidone# 获取全部测试结果 0通过 1不通过if [[ "$all_zero" == true ]]; thenreturn 0  # 返回0表示所有结果为0elsereturn 1  # 返回1表示至少有一个结果不为0fi
}test_single() {while true; domodule_choicemodule_testcheck_all_passif [[ $? -eq 0 ]]; thenecho "****************************************************************"echo -e "\033[32m$(figlet "PASS")\033[0m"echo "****************************************************************"breakfisleep 1done
}test_all() {echo " "echo "******************** Test Execution Started ********************"echo "****************************************************************"echo " "if [[ ${example1_activation} == "0" ]]; thentest_example1sleep 1fiif [[ ${example2_activation} == "0" ]]; thentest_example2sleep 1fiif [[ ${example3_activation} == "0" ]]; thentest_example3sleep 1fiecho " "echo " "echo "********************* Test Results Summary *********************"echo "****************************************************************"if [[ ${example1_activation} == "0" ]]; thenif [[ ${EXAMPLE1_RESULT} -eq 0 ]]; thenecho -e "example1:                       \033[32m pass \033[0m"elseecho -e "example1:                       \033[31m fail \033[0m"fifiif [[ ${example2_activation} == "0" ]]; thenif [[ ${EXAMPLE2_RESULT} -eq 0 ]]; thenecho -e "example2:                       \033[32m pass \033[0m"elseecho -e "example2:                       \033[31m fail \033[0m"fifiif [[ ${example3_activation} == "0" ]]; thenif [[ ${EXAMPLE3_RESULT} -eq 0 ]]; thenecho -e "example3:                       \033[32m pass \033[0m"elseecho -e "example3:                       \033[31m fail \033[0m"fifiecho " "check_all_passif [[ $? -eq 0 ]]; thenecho "****************************************************************"echo -e "\033[32m$(figlet "PASS")\033[0m"echo "****************************************************************"elseecho "****************************************************************"echo -e "\033[31m$(figlet "FAIL")\033[0m"echo "****************************************************************"echo " " echo " "fi
}send_result() {echo "Upload test results."
}main() {installtest_allcheck_all_passif [[ $? -eq 1 ]]; thentest_singlefisend_result
}main

注释:文件必须 Unix(LF) 格式 ,可用通过 notepad++ 转换


http://www.ppmy.cn/embedded/153528.html

相关文章

Github 2025-01-11 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2025-01-11统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10C项目1Swift项目1Yazi - 快速终端文件管理器 创建周期:210 天开发语言:Rust协议类型:MIT LicenseStar数量:5668 个Fork数量:122…

实现一个VSCode插件(从创建到发布)

实现一个自己的VSCode 插件 本文将以 yo 为例, 实现一个 VS Code 插件 从创建到发布。 文章目录 实现一个自己的VSCode 插件1. 初始化项目2. 项目结构3. 实现插件功能4. 测试和运行插件5. 发布6. 下载自己发布的插件 1. 初始化项目 首先,我们需要安装 …

openGauss 创建数据库

a. 使用如下命令创建一个新的表空间tpcds_local。 CREATE TABLESPACE tpcds_local RELATIVE LOCATION tablespace/tablespace_1 ; openGauss# CREATE TABLESPACE tpcds_local RELATIVE LOCATION tablespace/tablespace_1 ; CREATE TABLESPACE openGauss# b. 使用如下命令创…

前端开发:快速生成框架

html 标签是整个 html 文件的根标签 ( 最顶层标签 ):告诉浏览器,从这就开始html内容分析了 head 标签中写页面的属性 . title 标签中写的是页面的标题 body 标签中写的是页面上显示的内容 head和body是兄弟标签; head和title是父子标签…

作业(一)

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容,不存在则创建一个文件将创建时间写入。 # vim a.sh#!/bin/bash​#先对文件/tmp/size.log 是否存在进行判断 if [ -f /tmp/size.log ]; #如果存在,则用cat命令显示文件内容thencat /tmp/…

torch.einsum计算张量的外积

torch.einsum 是一种强大的张量操作工具,可以通过爱因斯坦求和约定(Einstein summation convention)来简洁地表示复杂的张量运算。通过它,我们可以高效地计算矩阵乘法、转置、点积、外积等操作。 以下是关于如何使用 torch.einsum 计算两个四维张量在第三维度上的外积的解…

【C语言】_类型重命名typedef关键字

目录 1. 从复杂类型理解类型重命名的必要性 1.1 示例1 1.2 示例2 2. typedef 用法 2.1 简单类型重命名 2.2 复杂指针类型重命名 2.2.1 数组指针类型 2.2.2 函数指针类型 3. 使用typedef简化复杂类型的定义 4. #define与typedef 1. 从复杂类型理解类型重命名的必要性 …

Single Agent 阶段性总结

Agent 通常指的是一类具备高度自主性的智能实体,它们能够巧妙地在特定环境里自主感知信息,运用内置的智能算法做出理性决策,进而精准无误地执行相应动作。相较于 RAG(检索增强生成)技术,Agent 可解决诸多难…