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

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

前言

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

  本文将介绍一款基于 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.kler.cn/a/500914.html

相关文章:

  • 【复习小结】1-13
  • Python实现windows自动关机
  • 注册中心如何选型?Eureka、Zookeeper、Nacos怎么选
  • 网络安全-kail linux 网络配置(基础篇)
  • 系统思考—因果关系
  • Windows下调试Dify相关组件(2)--后端Api
  • 基于Springboot美食推荐商城系统【附源码】
  • 14. 以太网接口
  • linux-28 文本管理(一)文本查看,cat,tac,more,less,head,tail
  • Nginx 配置支持 HTTPS 代理
  • 计算机类-数据结构课程推荐
  • 《拉依达的嵌入式\驱动面试宝典》—操作系统篇(一)
  • Maven 仓库的分类
  • Cisco认证是Cisco公司建立的网络技术证书体系
  • C#解决浮点数精度丢失的问题(参考方案)
  • [DO374] Ansible 配置文件
  • 云服务器加了安全组端口还是无法访问
  • 一分钟学会文心一言API如何接入,文心一言API接入教程
  • 基于 JavaEE 的影视创作论坛
  • fitz获取pdf内容
  • 浅谈云计算04 | 云基础设施机制
  • 游戏引擎学习第78天
  • SmartScanner:智能化网络漏洞扫描的未来先锋
  • RAID储存技术
  • [创业之路-242]:《华为双向指挥系统》-1-组织再造-纠正企业管理的长短腿-科层制优缺点以及科层制企业的特点
  • uniapp Android 原生插件开发-Module扩展为例-从开发到测试到部署到uniapp项目