当前位置: 首页 > news >正文

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

相关文章:

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

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

WebSocket 测试入门篇

Websocket 是一种用于 H5 浏览器的实时通讯协议,可以做到数据的实时推送,可适用于广泛的工作环境,例如客服系统、物联网数据传输系统, 基础介绍 我们平常接触最多的是 http 协议的接口,http 协议是请求与响应的模式&…...

Apache Traffic存在SQL注入漏洞(CVE-2024-45387)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

Centos7使用yum工具出现 Could not resolve host: mirrorlist.centos.org

在 CentOS 7 中使用 yum 工具时,出现 "Could not resolve host: mirrorlist.centos.org" 的错误,一般情况是因为默认的镜像源无法访问。 以下是一些常用的解决方法: 检查网络连接:首先使用 ping 命令测试网络连接是否…...

zookeeper shell操作和zookeeper 典型应用(配置中心、集群选举服务、分布式锁)

文章目录 引言I zookeeper客户端命令查看子节点 ls创建子节点 create获取节点信息 get更新节点数据 set删除节点 delete\ rmrII 监听机制node1:设置监听node3:修改监听节点node1:得到监听反馈III zookeeper 典型应用分布式锁集群选举服务数据发布/订阅(配置中心)引言 zk 的…...

Vue中Watch使用监听修改变动

使用注意 监听一个值时 多个值时...

Lua语言的文件IO

1、我们都知道,在任何语言当中都有输入输出,比如c语言当中就有很多printf,scanf,get ,put,gets,puts,文件io:open,read,write,close,标准io:fopen,fread,fwrite,fclose.在lua语言当中,也有相同的一些输入输出特性,叫io.open,io.re…...

C语言基本知识复习浓缩版:输出函数printf

输出函数printf学习 printf()的作用是将文本输出到屏幕上使用之前需要先引入stdio.h头文件printf函数在使用的时候,至少需要一个参数 printf() 是 C 语言标准库中的一个函数,用于将格式化的文本输出到标准输出设备(通常是屏幕)。…...

Ubuntu中使用miniconda安装R和R包devtools

安装devtools环境包 sudo apt-get install gfortran -y sudo apt-get install build-essential -y sudo apt-get install libxt-dev -y sudo apt-get install libcurl4-openssl-dev -y sudo apt-get install libxml2.6-dev -y sudo apt-get install libssl-dev -y sudo apt-g…...

Jmeter-压测时接口如何按照顺序执行

Jmeter-压测时接口如何按照顺序执行-临界部分控制器 在进行压力测试时,需要按照顺序进行压测,比如按照接口1、接口2、接口3、接口4 进行执行 查询结果是很混乱的,如果请求次数少,可能会按照顺序执行,但是随着次数增加…...

Ungoogled Chromium127 编译指南 MacOS篇(七)- 安装依赖包

1. 引言 在获取了 Ungoogled Chromium 的源代码之后,我们需要安装所有必要的依赖包。这些依赖包对于成功编译 Chromium 至关重要。本文将指导您完成所有必需软件包的安装。 2. 依赖包安装 2.1 使用 Homebrew 安装基础依赖 # 安装 Ninja 构建系统 brew install n…...

批量写入数据到数据库,卡顿怎么解决

在批量写入数据到数据库时,遇到卡顿或性能瓶颈是比较常见的问题。以下是一些可能的解决方案和优化策略,帮助你提高批量写入的性能: ### 1. **批量大小优化** - **调整批量大小**:尝试调整批量写入的数据量,找到一个平衡点。过大或过小的批量大小都可能影响性能。通常,批…...

Python爬虫 - 豆瓣图书数据爬取、处理与存储

文章目录 前言一、使用版本二、需求分析1. 分析要爬取的内容1.1 分析要爬取的单个图书信息1.2 爬取步骤1.2.1 爬取豆瓣图书标签分类页面1.2.2 爬取分类页面1.2.3 爬取单个图书页面 1.3 内容所在的标签定位 2. 数据用途2.1 基础分析2.2 高级分析 3. 应对反爬机制的策略3.1 使用 …...

Qt 5.14.2 学习记录 —— 칠 QWidget 常用控件(2)

文章目录 1、Window Frame2、windowTitle3、windowIcon4、qrc机制5、windowOpacity 1、Window Frame 在运行Qt程序后,除了用户做的界面,最上面还有一个框,这就是window frame框。对于界面的元素,它们的原点是Qt界面的左上角或win…...

在vue3项目中利用自定义ref实现防抖

一&#xff0c;效果展示 自定义ref实现防抖效果 二&#xff0c;代码部分 1在app.vue中 <template><input v-model"text"/><p class"result">{{text}}</p> </template><script setup> import {debounceRef} from ./u…...

服务器及MySQL安全设置指南

文章目录 Linux安全配置1、密码复杂度策略2、登陆失败策略3、登录超时策略4、安全日志记录5、账户策略5.1 创建系统管理员&#xff08;应该对/var进行授权&#xff0c;修改可能会影响到ssh登录&#xff09;5.2 创建安全管理员&#xff08;应该对/etc进行授权&#xff09;5.3 创…...

MDX语言的网络编程

MDX语言的网络编程探索 引言 在当今信息技术快速发展的时代&#xff0c;网络编程越来越成为软件开发的重要组成部分。无论是为了创建Web应用&#xff0c;还是为了开发与云服务交互的程序&#xff0c;网络编程的知识愈发显得重要。MDX&#xff08;Multidimensional Expression…...

client-go中watch机制的一些陷阱

Reference https://stackoverflow.com/questions/51399407/watch-in-k8s-golang-api-watches-and-get-events-but-after-sometime-doesnt-get-an 问题描述 最近在使用 client-go 的 watch 机制监听 k8s 中的 deployment 资源时&#xff0c;发现一个奇怪的现象 先看下代码&a…...

Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问

在访问网页的时候&#xff0c;因为浏览器自身的安全设置问题&#xff0c; 对于https的网页访问会出现安全隐私的提示&#xff0c; 甚至无法访问对应的网站&#xff0c;尤其是chrome浏览器&#xff0c; 因此本文主要讲解如何设置chrome浏览器的设置&#xff0c;来解决该问题&…...

Jenkins pipeline 发送邮件及包含附件

Jenkins pipeline 发送邮件及包含附件 设置邮箱开启SMTP服务 此处适用163 邮箱 开启POP3/SMTP服务通过短信获取TOKEN &#xff08;保存TOKEN, 后面Jenkins会用到&#xff09; Jenkins 邮箱设置 安装 Build Timestamp插件 设置全局凭证 Dashboard -> Manage Jenkins …...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...