自动化测试脚本实践:基于 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.mzph.cn/bicheng/67895.shtml

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

相关文章

协同过滤算法商品推荐系统|Java|SpringBoot|VUE|

【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SpringBoot、Mybatis-Plus、VUE、jquery,html 5⃣️…

初学stm32 --- DMA直接存储器

目录 DMA介绍 STM32F1 DMA框图 DMA处理过程 DMA通道 DMA优先级 DMA相关寄存器介绍 F1 DMA通道x配置寄存器(DMA_CCRx) DMA中断状态寄存器(DMA_ISR) DMA中断标志清除寄存器(DMA_IFCR) DMA通道x传输…

Routine Load 导入问题处理指南

Routine Load 导入问题处理指南 在使用 Apache Doris 的 Routine Load 时,你是否曾经被各种奇奇怪怪的问题卡住?今天就来分享一些最常见的 Routine Load 问题,并提供相应的解决方案,让你快速应对,高效解决!…

【面试题】技术场景 6、Java 生产环境 bug 排查

生产环境 bug 排查思路 分析日志:首先通过分析日志查看是否存在错误信息,利用之前讲过的 elk 及查看日志的命令缩小查找错误范围,方便定位问题。远程 debug 适用环境:一般公司正式生产环境不允许远程 debug,多在测试环…

牛客 《反转链表》 链表 题解

前言 太久没有练习C和Java,基本忘完了…还有数据结构也不太熟悉了。借此机会回顾一下相关的知识点,也为之后做准备吧。 题目内容 思路 要求时间复杂度为O(n),那么只能遍历一次。反转的话,只需要将链表箭头指向换个方向就行。遍…

容器技术全面攻略:Docker的硬核玩法

文章背景 想象一下,一个项目终于要上线了,结果因为环境配置不一致,测试服务器一切正常,生产环境却宕机了。这是开发者噩梦的开始,也是Docker救世主角色的登场!Docker的出现颠覆了传统环境配置的方式&#…

RabbitMQ高级篇

目录 确保发送者的可靠 为什么需要确保发送者的可靠性 RabbitMQ 的发送者重连机制配置 springAMQP实现发送者确认 MQ的可靠性 为什么需要实现MQ的可靠性? 数据持久化 Lazy Queue 核心思想 总结RabbitMQ 如何保证消息的可靠性 持久化 Lazy Queue 消息…

微信小程序用的SSL证书有什么要求吗?

微信小程序主要建立在手机端使用,然而手机又涉及到各种系统及版本,所以对SSL证书也有要求,如果要小程序可以安全有效的访问需要满足以下要求: 1、原厂SSL证书(原厂封)。 2、DV单域名或者DV通配符。 3、兼…

OpenCV计算机视觉 07 图像的模块匹配

在做目标检测、图像识别时,我们经常用到模板匹配,以确定模板在输入图像中的可能位置 API函数 cv2.matchTemplate(image, templ, method, resultNone, maskNone) 参数含义: image:待搜索图像 templ:模板图像 method&…

uniapp开发u-icon图标不显示问题

uniapp开发图标用u-icon不显示,换成uv-icon就可以了 插件市场从这里下载:uv-ui 破釜沉舟之兼容vue32、app、h5、小程序等多端,灵活导入,利剑出击 - DCloud 插件市场 组件库看这个:介绍 | 我的资料管理-uv-ui 是全面兼…

ELK的搭建

ELK elk:elasticsearch logstatsh kibana统一日志收集系统 elasticsearch:分布式的全文索引引擎点非关系型数据库,存储所有的日志信息,主和从,最少需要2台 logstatsh:动态的从各种指定的数据源,获取数据…

【git】-2 分支管理

目录 一、分支的概念 二、查看、创建、切换分支 1、查看分支-git branch 2、创建分支- git branch 分支名 3、切换分支- git checkout 分支名 三、git指针 -实现分支和版本间的切换 四、普通合并分支 git merge 文件名 五、冲突分支合并 ​​​​​​【git】-初始gi…

【项目】修改远程仓库地址、报错jdk

一、修改远程仓库地址 进入你刚刚克隆到本地的仓库目录&#xff0c;执行以下命令来修改远程仓库的 URL&#xff0c;将其指向你自己的新仓库&#xff1a; cd 原仓库名 git remote set-url origin <你自己的新仓库的 Git 地址>补充&#xff1a; 错误分析&#xff1a; wa…

实训云上搭建集群

文章目录 1. 登录实训云1.1 实训云网址1.2 登录实训云 2. 创建网络2.1 网络概述2.2 创建步骤 3. 创建路由器3.1 路由器名称3.1 创建路由器3.3 查看网络拓扑 4. 连接子网5. 创建虚拟网卡5.1 创建原因5.2 查看端口5.3 创建虚拟网卡 6. 管理安全组规则6.1 为什么要管理安全组规则6…

vue3+ts+element-plus 输入框el-input设置背景颜色

普通情况&#xff1a; 组件内容&#xff1a; <el-input v-model"applyBasicInfo.outerApplyId"/> 样式设置&#xff1a; ::v-deep .el-input__wrapper {background-color: pink; }// 也可以这样设置 ::v-deep(.el-input__wrapper) {background-color: pink…

直线模组中导轨和滑块松动如何处理?

直线模组抖动是直线模组在日常运用中比较常见的一种异常行为&#xff0c;直线模组的抖动对精度和寿命都会产生严重影响。直线模组出现抖动通常是由于导轨和滑块之间的摩擦、松动或不平衡所引起的。那么&#xff0c;针对直线模组中导轨和滑块存在的松动问题&#xff0c;可以采取…

Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印 Pyside6版

图 这图是第2版, 现在发布原型版 代码: order_system_pyside6.py from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,QHBoxLayout, QLabel, QLineEdit, QPushButton, QMessageBox,QTableWidget, QTableWidgetItem, QComboBox, QFrame,QH…

element upload上传图片,上传完成隐藏组件或者禁用上传

背景&#xff1a; 在项目开发&#xff0c;需要上传图片&#xff0c;一张或者多张。当上传1张图片时&#xff0c;upload组件有一张图片时&#xff0c;组件自带的disabletrue设置为true禁用上传&#xff0c;就不会触发上传接口了&#xff0c;但是还是可以点开图片进行选择&#x…

【2024年华为OD机试】 (A卷,100分)- 二元组个数(Java JS PythonC/C++)

一、问题描述 以下是题目描述的 Markdown 格式&#xff1a; 题目描述 给定两个数组 a 和 b&#xff0c;若 a[i] b[j]&#xff0c;则称 [i, j] 为一个二元组。求在给定的两个数组中&#xff0c;二元组的个数。 输入描述 第一行输入 m&#xff0c;表示第一个数组的长度。第二…

Homebrew 【MAC安装软件利器】

1、brew介绍 Homebrew游来: Homebrew 的诞生源于一个年轻程序员的不满和创新。2009 年&#xff0c;Max Howell 当时是一名在苹果公司工作的程序员。他觉得在 Mac 上安装和管理开源软件特别麻烦&#xff0c;常常需要手动下载源代码、解决依赖关系、编译安装&#xff0c;过程繁琐…