前言
在现代软件开发中,测试自动化是确保软件质量和稳定性的核心手段之一。随着开发周期的缩短和功能模块的增多,手动测试逐渐无法满足高效性和准确性的需求。因此,测试人员需要依赖自动化工具来提升测试效率,减少人为干预和错误。
本文将介绍一款基于 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++ 转换