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

news2025/1/9 6:51:21

前言

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

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

一、目录结构

test/
├── config.conf
├── scripts/
│   └── eth.sh
└── tools/
└── xxx_test_scripts.sh

eth.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"; then
		exit 1 # 失败时退出,返回 1
	else
		exit 0 # 成功时退出,返回 0
	fi
}

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" ]]; then
	echo "config.conf not found!"
	exit 1
fi

# 加载配置文件
source ${SCRIPT_DIR}/config.conf


EXAMPLE1_RESULT=0
EXAMPLE2_RESULT=0
EXAMPLE3_RESULT=0


# 依赖软件安装
install() {
	if ! command -v figlet > /dev/null 2>&1; then
		echo "Writing the installation method."
	fi
}


test_example1() {
	read -p "example1 test results(y: pass - n: fail): " example1
	if [[ "${example1}" == "N" ]] || [[ "${example1}" == "n" ]]; then
		EXAMPLE1_RESULT=1
		echo -e "####################\033[31m example1:      fail \033[0m#####################"
		echo "##############################################################"
	else
		EXAMPLE1_RESULT=0
		echo -e "####################\033[32m example1:      pass \033[0m#####################"
		echo "##############################################################"
	fi
}

test_example2() {
	read -p "example2 test results(y: pass - n: fail): " example2
	if [[ "${example2}" == "N" ]] || [[ "${example2}" == "n" ]]; then
		EXAMPLE2_RESULT=1
		echo -e "####################\033[31m example2:      fail \033[0m#####################"
		echo "##############################################################"
	else
		EXAMPLE2_RESULT=0
		echo -e "####################\033[32m example2:      pass \033[0m#####################"
		echo "##############################################################"
	fi
}

test_example3() {
	sudo chmod 777 ${SCRIPT_DIR}/scripts/eth.sh
	sudo ${SCRIPT_DIR}/scripts/eth.sh eth0
	if [[ $? -eq 0 ]]; then
		EXAMPLE3_RESULT=0
		echo -e "####################\033[32m example3:      pass \033[0m#####################"
		echo "##############################################################"
	else
		EXAMPLE3_RESULT=1
		echo -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" ]]; then
		if [[ ${EXAMPLE1_RESULT} -eq 0 ]]; then
			echo -e " 1 (example1                          test) [\033[32m pass \033[0m]"
		else
			echo -e " 1 (example1                          test) [\033[31m fail \033[0m]"
		fi
	fi

	if [[ ${example2_activation} == "0" ]]; then
		if [[ ${EXAMPLE2_RESULT} -eq 0 ]]; then
			echo -e " 2 (example2                          test) [\033[32m pass \033[0m]"
		else
			echo -e " 2 (example2                          test) [\033[31m fail \033[0m]"
		fi
	fi

	if [[ ${example3_activation} == "0" ]]; then
		if [[ ${EXAMPLE3_RESULT} -eq 0 ]]; then
			echo -e " 3 (example3                          test) [\033[32m pass \033[0m]"
		else
			echo -e " 3 (example3                          test) [\033[31m fail \033[0m]"
		fi
	fi

	echo " 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} in
		0)
			test_exit
			;;
		1)
			if [[ ${example1_activation} == "0" ]]; then
				test_example1
			fi
			;;
		2)
			if [[ ${example2_activation} == "0" ]]; then
				test_example2
			fi
			;;
		3)
			if [[ ${example3_activation} == "0" ]]; then
				test_example3
			fi
			;;
		r)
			# Failure item选项,重新测试所有失败的项
			if [[ ${EXAMPLE1_RESULT} -eq 1 ]]; then
				test_example1
			fi
			
			if [[ ${EXAMPLE2_RESULT} -eq 1 ]]; then
				test_example2
			fi

			if [[ ${EXAMPLE3_RESULT} -eq 1 ]]; then
				test_example3
			fi
			;;
		# *)
			# echo "Invalid choice. Please try again."
			# ;;
	esac
}

check_all_pass() {
	local test_results=(
	    ${EXAMPLE1_RESULT}
	    ${EXAMPLE2_RESULT}
	    ${EXAMPLE3_RESULT}
	)

	all_zero=true

	# 如果有一个结果等于1,标记为false
	for all_result in "${test_results[@]}"; do
		if [[ "${all_result}" -eq 1 ]]; then
			all_zero=false
			break
		fi
	done

	# 获取全部测试结果 0通过 1不通过
	if [[ "$all_zero" == true ]]; then
		return 0  # 返回0表示所有结果为0
	else
		return 1  # 返回1表示至少有一个结果不为0
	fi
}

test_single() {
	while true; do
		module_choice
		module_test
		check_all_pass
		if [[ $? -eq 0 ]]; then
			echo "****************************************************************"
			echo -e "\033[32m$(figlet "PASS")\033[0m"
			echo "****************************************************************"
			break
		fi
		sleep 1
	done
}

test_all() {
	echo " "
	echo "******************** Test Execution Started ********************"
	echo "****************************************************************"
	echo " "
	if [[ ${example1_activation} == "0" ]]; then
		test_example1
		sleep 1
	fi

	if [[ ${example2_activation} == "0" ]]; then
		test_example2
		sleep 1
	fi

	if [[ ${example3_activation} == "0" ]]; then
		test_example3
		sleep 1
	fi

	echo " "
	echo " "
	echo "********************* Test Results Summary *********************"
	echo "****************************************************************"

	if [[ ${example1_activation} == "0" ]]; then
		if [[ ${EXAMPLE1_RESULT} -eq 0 ]]; then
		 	echo -e "example1:                       \033[32m pass \033[0m"
		else
			echo -e "example1:                       \033[31m fail \033[0m"
		fi
	fi

	if [[ ${example2_activation} == "0" ]]; then
		if [[ ${EXAMPLE2_RESULT} -eq 0 ]]; then
		 	echo -e "example2:                       \033[32m pass \033[0m"
		else
			echo -e "example2:                       \033[31m fail \033[0m"
		fi
	fi

	if [[ ${example3_activation} == "0" ]]; then
		if [[ ${EXAMPLE3_RESULT} -eq 0 ]]; then
		 	echo -e "example3:                       \033[32m pass \033[0m"
		else
			echo -e "example3:                       \033[31m fail \033[0m"
		fi
	fi

	echo " "
	check_all_pass
	if [[ $? -eq 0 ]]; then
		echo "****************************************************************"
		echo -e "\033[32m$(figlet "PASS")\033[0m"
		echo "****************************************************************"
	else
		echo "****************************************************************"
		echo -e "\033[31m$(figlet "FAIL")\033[0m"
		echo "****************************************************************"
		echo " " 
		echo " "
	fi
}

send_result() {
	echo "Upload test results."
}

main() {
	install
	test_all
	check_all_pass
	if [[ $? -eq 1 ]]; then
		test_single
	fi
	send_result
}

main

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2273633.html

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

相关文章

benchANT 性能榜单技术解读 Part 1:写入吞吐

近期,国际权威数据库性能测试榜单 benchANT 更新了 Time Series: Devops(时序数据库)场景排名,KaiwuDB 数据库在 xsmall 和 small 两类规格下的时序数据写入吞吐、查询吞吐、查询延迟、成本效益等多项指标刷新榜单原有数据纪录。在…

消息队列MQ(二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 MQ学习笔记 前言一、发送者的可靠性1. 生产者重试机制2. 生产者确认机制3. 实现生产者确认 二、MQ的可靠性1. 数据持久化2. LazyQueue 前言 在用MQ实现异步调用时&#xff0…

HTML基础入门——简单网页页面

目录 一,网上转账电子账单 ​编辑 1,所利用到的标签 2,代码编写 3,运行结果 二,李白诗词 1,所用到的标签 2,照片的编辑 3,代码编写 4,运行结果 一,网…

365天深度学习训练营:第N2周:构建词典

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 本周任务: 使用N1周的.txt 文件构建词典,停用词请自定义 1. 导入数据 from torchtext.vocab import build_vocab_from_iterator from collection…

vue2迁移至rsbuild

背景 由于远程机器配置较低,每次运行vue2项目都会非常卡。后期项目文件、路由更多的时候,启动到一半直接会跳出open too many files类似的错误,尝试将路由屏蔽掉只剩下开发所需的一个路由也不行(不是说webpack的打包是全部打包&am…

升级 Spring Boot 3 配置讲解 — 新版本的秒杀系统怎么做?

学会这款 🔥全新设计的 Java 脚手架 ,从此面试不再怕! 1. Spring Boot 3 升级指南 在升级 Spring Boot 3 之前,首先需要确保你的项目已经升级到 Java 17,因为 Spring Boot 3 不再支持 Java 8 和 Java 11。接下来&…

Seata的部署与微服务集成

文章目录 Seata的部署与微服务集成1. Seata介绍2. 部署TC服务2.1 数据准备2.2 配置文件2.3 docker 部署2.4 访问 3. 微服务集成Seata3.1 引入服务3.2 改造配置3.3 添加数据库表3.4 注解标记 Seata的部署与微服务集成 1. Seata介绍 Seata 是一款开源的分布式事务解决方案&…

NFS 组件容器化部署实战指南

文章目录 前言部署NFS服务器K8S部署NFS问题记录 前言 使用nfs-client-provisioner这个应用,利用nfs server给kubernets提供作为持久化后端,并且动态提供pv。所有节点需要安装nfs-utils组件,并且nfs服务器与kubernets worker节点都能网络连通…

【江协STM32】10-2/3 MPU6050简介、软件I2C读写MPU6050

1. MPU6050简介 MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景3轴加速度计(Accelerometer&#xff…

裸机器搭建k8s部署 1.28.10版本

问了搭建k8s集群踩了很多坑,问题主要出现在网络插件处,因此主要是master节点操作问题。重新走一下流程整理一下笔记。 目录 虚拟机准备 虚拟机 系统版本信息 修改镜像地址 配置静态ip 关闭防火前和交换分区 转发 IPv4 并让 iptables 看到桥接流量…

HCIE-day10-ISIS

ISIS ISIS(Intermediate System-to-Intermediate System)中间系统到中间系统,属于IGP(内部网关协议);是一种链路状态协议,使用最短路径优先SPF算法进行路由计算,与ospf协议有很多相…

70.爬楼梯 python

爬楼梯 题目题目描述示例 1:示例 2:提示: 题解思路分析Python 实现代码空间优化代码解释提交结果 题目 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff…

优质内容在个人IP运营中的重要性:以开源AI智能名片商城小程序为应用实例的深度探讨

摘要:在数字化时代,个人品牌(IP)的塑造与传播已成为各行各业提升影响力、吸引用户关注、促进商业转化的关键策略。优质内容作为连接个人IP与目标受众的桥梁,其在个人IP运营中的重要性不言而喻。本文旨在深入探讨优质内…

有限元分析学习——Anasys Workbanch第一阶段笔记(8)水杯案例的对称与轴对称处理

目录 1 序言 2 对称处理 2.1 模型处理 2.2 网格划分、约束载荷及接触设置 2.3 计算结果 3 轴对称处理 3.1 对称与轴对称概念 3.2 轴对称问题的应用 3.2.1 创建分析案例 3.2.2 导入并处理模型 3.2.3 网格划分、约束载荷及接触设置 3.2.4 后处理计算结果 1 序言 本章…

网络安全-web渗透环境搭建-BWAPP(基础篇)

01--所需系统环境: 虚拟主机系统部署(vmware,虚拟主机创建、虚拟主机网络配置(桥接,便于网络中多个主机都能访问虚拟主机)、虚拟软件功能,快照、克隆、镜像文件加载,ova文件制作&am…

Java 实现 Elasticsearch 查询当前索引全部数据

Java 实现 Elasticsearch 查询当前索引全部数据 需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后 需求背景 通常情况下,Elasticsearch 为了提高查询效率,对于不指定分页查询条数的查询语句,默认会返回10条数据。那么这就会有…

算能AI计算服务器SE5设备树的二次修改实操

目录 1.大纲 2.实操 2.下载对应文件包 3.解包启动文件 4.修改对应的设备树 5.重启后 教程链接:https://github.com/sophgo/sophon-tools/tree/main/source/pmemory_edit 1.大纲 2.实操 2.1 选择串口,波特率115200,重启设备&#xff0…

Python的Matplotlib库应用(超详细教程)

目录 一、环境搭建 1.1 配置matplotlib库 1.2 配置seaborn库 1.3 配置Skimage库 二、二维图像 2.1 曲线(直线)可视化 2.2 曲线(虚线)可视化 2.3 直方图 2.4 阶梯图 三、三维图像 3.1 3D曲面图 3.2 3D散点图 3.3 3D散…

Flutter:封装一个自用的bottom_picker选择器

效果图&#xff1a;单列选择器 使用bottom_picker: ^2.9.0实现&#xff0c;单列选择器&#xff0c;官方文档 pubspec.yaml # 底部选择 bottom_picker: ^2.9.0picker_utils.dart AppTheme&#xff1a;自定义的颜色 TextWidget.body Text() <Widget>[].toRow Row()下边代…

牛客网刷题 ——C语言初阶(6指针)——BC106 上三角矩阵判定

1. 题目描述——BC106 上三角矩阵判定 牛客网OJ题链接 描述 KiKi想知道一个n阶方矩是否为上三角矩阵&#xff0c;请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵&#xff0c;主对角线为从矩阵的左上角至右下角的连线。 示例 输入&#xff1a; 3 1 2 3 0 4 5 0 0…