自动化测试脚本实践:基于 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

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

2、eth.sh

#!/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

#!/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.rhkb.cn/news/505576.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

with as提高sql的执行效率

实战sql with cte(UNIT_ID, UNIT_NAME, PARENT_UNIT_ID, UNIT_CODE ) as (select UNIT_ID, UNIT_NAME, PARENT_UNIT_ID , UNIT_CODEfrom HPFM_UNITunion allselect t.UNIT_ID, t.UNIT_NAME, t.PARENT_UNIT_ID, t.UNIT_CODEfrom HPFM_UNIT tjoin cte on t.PARENT_UNIT_ID cte.U…

G-Star Landscape 2.0 重磅发布,助力开源生态再升级

近日,备受行业瞩目的 G-Star Landscape 迎来了其 2.0 版本的发布,这一成果标志着 GitCode 在开源生态建设方面又取得了重要进展。 G-Star Landscape仓库链接: https://gitcode.com/GitCode-official-team/G-Star-landscape 2024 GitCode 开…

如何在 Linux系统用中挂载和管理磁盘分区

在 Linux 系统中,挂载和管理磁盘分区是系统管理的基本任务之一。以下是详细步骤,帮助你完成这一过程。 1. 查看现有磁盘和分区 首先,使用以下命令来查看系统中的磁盘和分区: bash 复制 lsblk或者使用: bash 复制…

Unity:删除注册表内的项目记录

然后WinR按键输入regedit 打开注册表 在注册表 HKEY CURRENT USER—>SOFTWARE—>Unity—>UnityEditor—>DefaultCompany —>language_Test 中,删除我们的之前存储的语言环境数据。在 “ 三、文本调用和替换 ” 测试时已经将语言环境存储到注册表中了…

Zustand selector 发生 infinate loops的原因以及解决

Zustand selector 发生 infinate loops 做zustand tutorial project的时候,使用选择器方法引入store,出现Maximum update depth exceeded,也就是组件一直重新渲染,改成直接使用store就没有不会出现这个问题。如下: // const [xIs…

世优波塔数字人 AI 大屏再升级:让智能展厅讲解触手可及

近日,世优波塔大屏AI数字人再度升级,将数字人技术与大屏交互推向了新的高度,为用户带来了全方位的卓越体验,让人工智能不断重塑我们的生活与工作方式。 新形象:数字人的独特魅力 高精度的数字人形象一直是波塔智能体…

STM32F4分别驱动SN65HVD230和TJA1050进行CAN通信

目录 一、CAN、SN65HVD230DR二、TJA10501、TJA1050 特性2、TJA1050 引脚说明 三、硬件设计1、接线说明2、TJA1050 模块3、SN65HVD230 模块 四、程序设计1、CAN_Init:CAN 外设初始化函数2、CAN_Send_Msg、CAN_Receive_Msg 五、功能展示1、接线图2、CAN 数据收发测试 …

Redis数据库笔记——主从复制

大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Redis的主从复制模式,包括作用,原因,工作原理,同步流程等。 文章目录 主从复制什么是 Redis 主从…

【Unity功能集】TextureShop纹理工坊(十二)画笔工具、橡皮擦工具

项目源码:在终章发布 索引 画笔工具橡皮擦工具PS画笔工具、橡皮擦工具TextureShop画笔工具绘制点绘制线段画笔逻辑TextureShop橡皮擦工具画笔工具 画笔工具,可在绘画板上进行自由绘画的工具(了解PS画笔工具)。 橡皮擦工具 橡皮擦工具,可在绘画板上进行自由擦除颜色的工…

MMDetection框架下的常见目标检测与分割模型综述与实践指南

目录 综述与实践指南 SSD (Single Shot MultiBox Detector) 基本配置和使用代码 RetinaNet 基本配置和使用代码 Faster R-CNN 基本配置和使用代码 Mask R-CNN 基本配置和使用代码 Cascade R-CNN 基本配置和使用代码 总结 综述与实践指南 MMDetection是一个基于Py…

【数据库系统概论】第5章 数据库完整性【!触发器】

目录 5.1数据库完整性概述 5.2 实体完整性 5.3 参照完整性 5.4 用户定义的完整性 属性上的约束 1. 列值非空(NOT NULL) 2. 列值唯一(UNIQUE) 3. 检查列值是否满足条件(CHECK) 元组上的约束 5.5 完…

rk3568 , buildroot , qt ,使用sqlite, 动态库, 静态库

问题说明: 客户反馈 ,buildroot 系统 ,使用qt 使用sqlite ,有报错,无法使用sqlite. 测试情况说明: 我自己测试,发现, buildroot 自己默认就是 使能了 sqlite 的。 是否解决说明&…

机器学习实战——决策树:从原理到应用的深度解析

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​ ​​ 决策树(Decision Tree)是一种简单而直观的分类与回归模型,在机器学习中广泛应用。它的…

MySQL 如何赶上 PostgreSQL 的势头?

原文地址 我与 MySQL 社区的前辈交谈时,经常遇到这个问题:「为什么 MySQL 这么棒,而且(至少根据 DB-Engines 的计算)仍然比 PostgreSQL 更流行;但它的地位在下降,PostgreSQL 却势不可挡地越来越…

Linux 下信号的保存和处理

信号的几个状态 信号抵达: 当接收到的信号被处理时, 此时就成为信号的抵达信号的未决: 从信号的产生到信号抵达这个时间段之间, 称为信号未决信号阻塞: 当进程设置了某个信号为阻塞后, 这个进程就不会在接收到这个信号信号忽略: 将信号设置为忽略后, 接收到这个信号, 对这个信…

mybatisX插件的使用,以及打包成配置

装mybatisX插件; idea连接数据库; 点击mybatisx-generator,设置自己装mybatisX插件; idea连接数据库; 点击mybatisx-generator,设置自己要的包和类; 如果要把自己的配置设置成一个自定义模板&a…

AAAI2023《Controllable Image Captioning via Prompting》

摘要 文章提出了一种通过提示学习(prompt learning)嵌入到图像描述生成框架中的方法,以实现对图像描述的可控生成。具体来说,设计了一组提示来微调预训练的图像描述生成器,这些提示使模型能够吸收来自不同领域的风格化…

AR 眼镜之-拍照/录像动效切换-实现方案

目录 📂 前言 AR 眼镜系统版本 拍照/录像动效切换 1. 🔱 技术方案 1.1 技术方案概述 1.2 实现方案 1)第一阶段动效 2)第二阶段动效 2. 💠 默认代码配置 2.1 XML 初始布局 2.2 监听滑动对 View 改变 3. ⚛️…

kubeneters-循序渐进Cilium网络(二)

文章目录 概要IP 地址配置接口配置解析结论 概要 接续前一章节,我们还是以这张图继续深入Cilium网络世界 IP 地址配置 通过检查 Kubernetes 集群的当前环境,可以获取实际的 IP 地址和配置信息。这些信息将被补充到之前的网络示意图中,以使…

宝塔安装mongodb后,写脚本监控运行状态,关闭后自动重启

最近项目用上了mongodb,但是每天晚上 mongodb都回自动关闭,没办法 只能写个监视服务的脚本 在关闭的话就直接重启,创建个计划任务,每三分钟执行一次 # 检查mongo是否还在进程中 countps aux|grep mongo| grep -v grep |wc -l echo…