
Shell脚本实用代码片段:测试工程师的百宝箱
大约 3 分钟
Shell脚本实用代码片段:测试工程师的百宝箱
好的程序员会写代码,优秀的程序员会复用代码!作为测试工程师,我们经常需要编写各种自动化脚本。这里收集了一些在实际工作中非常实用的Shell代码片段,就像乐高积木一样,可以组合出各种强大的测试工具。
模块化脚本:让代码更优雅
多模块使用,确定目录,模块间变量引用
在大型测试项目中,我们经常需要将脚本模块化,这样既便于维护,又能提高代码复用性:
#!/bin/bash
# 主测试脚本 - main_test.sh
# 获取脚本所在目录的绝对路径
CUR_DIR=$(cd "$(dirname $0)" && pwd)
BASE_DIR=$(dirname $CUR_DIR)
tmp=$0
CUR_FILE="${tmp##*/}"
# 导入工具模块
source $CUR_DIR/tools/get_device_list.sh
echo "测试设备列表:" ${all_devices_list[*]}
source $CUR_DIR/tools/check_environment.sh
source $CUR_DIR/config/test_config.sh
# 导出全局变量供子模块使用
export TEST_ENV="staging"
export LOG_LEVEL="INFO"💡 测试场景应用:
get_device_list.sh:获取可用的测试设备check_environment.sh:检查测试环境是否就绪test_config.sh:加载测试配置参数
杀掉当前脚本里面的子进程
a=$(pgrep -P $$)
echo "**"
for i in $a; do
echo "${i}"
if kill -9 "${i}"; then
echo "sucess kill " "${i}"
else
echo "kill failed"
fi
done判断命令有没有成功,如果成功打印什么不成功打印啥
# 判断上一个命令有没有成功,成功打印啥,没有成功打印啥
if [ $? -ne 0 ]; then
echo "### Err"
else
echo "### Succeed"
fiif kill -9 "${i}"; then
echo "sucess kill " "${i}"
else
echo "kill failed"
fi如果不想这些命令输出到屏幕上,那么可以这样
/dev/null 2>&1
这个使用一般配合上面的,判断进程是否执行正确来使用
for ((i = 0; i < ${#all_pods_list[@]}; i++)); do
if ! timeout 2 adb -s "${all_pods_list[i]}" shell pwd >/dev/null 2>&1; then
echo "Not a valid pod, will not run test in this pod: ${all_pods_list[i]}"
unset all_pods_list[i]
fi
done进程的后台执行
nohup xxxx 2>&1 &对数组的操作及循环遍历
正常的一个循环
count=1
while [ $count -le 10 ]; do
echo "Loop $count"
sleep 1
count=$(($count + 1))
done
for ((i = 0; i < 10; i++)); do
echo "Loop $(($i + 1))"
sleep 1
done
for i in {1..100}; do
echo "$i"
done对于一个数组
array=(1 2 3 4)
for i in ${array[*]}; do
echo "$i"
done
for i in ${array[@]}; do
echo "$i"
done
echo ${#array[@]}
for ((i = 0; i < ${#array[@]}; i++)); do
echo "${array[i]}"
done对于一些adb命令,shell后面的东西应该如何写
简而言之,就是放到引号里面去
if ! adb -s ${all_pods_list[i]} shell "dumpsys package -list | grep /data/app/com.antutu.benchmark.full"; then
echo "### GPU.apk not installed in this pod: ${all_pods_list[i]}."
echo "===ERR: gpu stress test skipped. Please install GPU.apk first."
else
echo "### start gpu stress test in pod: ${all_pods_list[i]}."
adb -s ${all_pods_list[i]} shell "nohup /data/byte/stress_cpu/run_gpu_stress.sh $start_gpu_stress > /data/byte/stress_log/run_gpu_stress.log 2>&1 & "
fi脚本里是后台执行,当我们ctrl+c时,把脚本里面子进程杀掉
trap kill_all_child_process 2
function kill_all_child_process() {
echo "### signal trapped, kill childprocess of pid[$$]"
child_proc_list=($(pgrep -P $$))
echo "### child_proc_list: ${child_proc_list[*]}"
for child_pid in ${child_proc_list[@]}; do
echo "### show info of child_process $child_pid"
ps -fp $child_pid
echo "\n"
echo "### try: kill child_process $child_pid"
if kill -9 $child_pid; then
echo "### kill succeed "
else
echo "### kill failed "
fi
done
}
wait