验证环境脚本开发

文章展示了如何使用Shell和Python脚本执行自动化回归测试,包括设置运行次数、并行执行测试用例、处理日志以及根据测试结果进行重试和错误分析。脚本涉及环境变量配置、随机种子生成和线程管理,旨在提高测试效率。
摘要由CSDN通过智能技术生成

 回归测试脚本

回归shell脚本

#!/bin/bash
FSDB=off
UVM_VERBOSITY=UVM_NONE
run_times=()
regress_list=(
    "TS=tc_uart_tx cfg=default ,runtimes=10"
    "TS=tc_uart_rx cfg=default ,runtimes=10"
)
max_threads=10
for ((i=0; i<${#regress_list[@]}; i++)); do
    tmp=(${regress_list[i]//=/ })  # 将字符串以等号进行拆分
    run_times+=("${tmp[-1]}")
done

cmd="make nrun SYS=mmu "
#val=$(rm -rf ./rgr_log_dir/*.log)
#val=$(make cmp cov=on mode=regress)


for ((i=0; i<${#regress_list[@]}; i++)); do
    num = ${run_times[i]}
    for ((k=0; k<${run_times[i]}; k++)); do
        while true; do
              runing_threads=$(ps -ef | grep "make ncrun SYS=mmu" | grep -v grep | wc -l)
              if[ $runing_threads -lt $max_threads ];then
                    tmp_seed=""
                    for ((j=0; j<8; j++)); do
                        tmp_seed+=$(( RANDOM % 10 ))  # 生成随机数字并拼接到 tmp_seed 字符串
                    done
                    seed=$((10#$tmp_seed))  # 将字符串转换为十进制数
                    echo "${cmd} ${regress_list[i]} num=${num} SEED=${seed}"
                    val=$(eval "$cmd ${regress_list[i]} SEED=$seed DUMP=$FSDB UVM_VERBOSITY=$UVM_VERBOSITY cov=on &")& # &可实现并行
                    num=$((num -1))
                    break
                else
                    sleep 2
                fi
        done
    done
done
wait
echo "over"
val=$(grep 'Simulation Result' -R ./rgr_log_dir/*.log > regress.log)
echo "$val"

    while true;do
         fail_name=$(grep -l "cpu_affinity/auto_affinity failed" SYS_mmu/log/*)
         fail_num=$(grep -R "cpu_affinity/auto_affinity failed" SYS_mmu/log/* | wc -l)
         echo "fail num is $fail_num"
         if [ $fail_num -eq 0 ]; then
               break
         else
               for fail_file in $fail_name; do
                    file_name=$(basename "$fail_file")
                    TS=$(echo "$file_name" | awk -F '_CFG' '{print $1}' | awk -F 'TS_' '{print $2}')
                    CFG=$(echo "file_name" | awk -F 'CFG_' '{print $2}' | awk -F '_SEED' '{print $1}')
                    SEED=$(echo "file_name" | awk -F 'SEED_' '{print $2}' | awk -F '.log' '{print $1}') 
                    while true; do
                          running_threads=$(ps -ef | grep "make ncrun SYS=mmu" | grep -v grep | wc -l )
                          if [ $running_threads -lt $max_threads ] ;then
                              echo "make ncrun TS=$TS CFG=$CFG SEED=$SEED"
                              val=$(eval "make ncrun SYS=mmu TOOL=vcs TS=$TS CFG=$CFG SEED=$SEED DUMP=$FSDB UVM_VERBOSITY=$UVM_VERBOSITY &") &
                              break
                          else
                              sleep 100
                          fi
                    done
               done
         fi 

   done
   wait
echo "over_all"
#grep -l 用于显示包含匹配内容的文件名,而 grep -L 用于显示不包含匹配内容的文件名
#grep "make ncrun SYS=mmu TOOL=vcs *TS=page_fault_test_seq"
#grep "make ncrun SYS=mmu.*sfence*."

 回归python脚本

import os
import re
import sys
import random

run_times =[]
regress_list =[
              "tc=tc_uart_tx cfg=default ,runtimes=10"
              "tc=tc_uart_rx cfg=default ,runtimes=10"
               ]
for i in range (len(run_times));
    tmp = regrss_list[i].split("=")
    run_times[i] = int(tmp[-1])

cmd = "make nrun"
val = os.system("rm -rf ./rgr_log_dir/*.log")
val = os.system("make cmp cov=on mode=regress")

for i in range(len(regress_list)):
    for k in range(run_times[i]):
        tmp_seed = ""
        for j in range(8):
           tmp_seed = (tmp_seed + str(random.randint(0,9)))
    seed =int(tmp_seed)
    val = os.system("{} {} seed={} cov =on wave=off mode=regress".format(cmd,regress_list[i],seed))

val = os.system("grep 'Simulation Result' -R ./rgr_log_dir/*.log > regress.log")
print(val)

 Check Log并重新仿真脚本

直接chcklog后进行仿真

max_threads=6
       files=$(grep -L "PASS" SYS_MMU/log*) #指定log路径
       for file in $files;do
            filename=$(basename "$file") #key1
            TS=$(echo "$filename" | awk -F '_CFG' '{print $1}' | awk -F 'TS_' '{print $2}')
            CFG=$(echo "$filename" | awk -F 'CFG_' '{print $2}' | awk -F '_SEED' '{print $1}')
            SEED=$(echo "$filename" | awk -F 'SEED_' '{print_$2}' | awk -F '.log' '{print $1}') 
            while true; do
                running_threads=$(ps- ef | grep "make ncrun SYS=mmu" | grep -v grep | wc-l) 
                if [$running_threads -lt $max_threads ] ;then
                     echo "make ncrun TS=$TS CFG=$CFG SEED=$SEED"
                     val=$(eval "make ncrun TS=$TS CFG=$CFG SEED=$SEED &")&
                     break
                else
                      sleep 2
                fi
         
            done
        done

wait
echo "over"






key1:
Shell脚本中,basename 是一个用于获取文件路径的基本名称的命令或函数。它可以从给定的文件路径中剥离出文件名部分,并返回该文件名。

使用 basename 命令的语法如下:

basename FILENAME [SUFFIX]
其中,FILENAME 是要获取基本名称的文件路径,而 SUFFIX 是可选参数,如果提供了该参数,basename 会去除文件名中以 SUFFIX 结尾的部分。

下面是一些示例,说明 basename 的使用:

获取文件路径的基本名称:
shell
$ basename /path/to/file.txt
file.txt
去除文件名中的扩展名:
shell
$ basename /path/to/file.txt .txt
file
获取相对路径的基本名称:
shell
$ basename ../path/to/file.txt
file.txt
请注意,basename 命令只返回文件路径中的最后一个部分作为基本名称。如果需要获取文件名的目录部分,可以使用 dirname 命令。

 通过check_regress.log进行错误用例重新仿真

max_threads=6
       files=$(grep -o "TS_[^[:space:]]*" ./run.log) #指定log路径
       for file in $files;do
            filename=$(basename "$file") #key1
            TS=$(echo "filename" | awk -F '_CFG' '{print $1}' | awk -F 'TS_' '{print $2}')
            CFG=$(echo "filename" | awk -F 'CFG_' '{print $2}' | awk -F '_SEED' '{print $1}')
            SEED=$(echo "$filename" | awk -F 'SEED_' '{print_$2}' | awk -F '.log' '{print $1}') 
            while true; do
                running_threads=$(ps- ef | grep "make ncrun SYS=mmu" | grep -v grep | wc-l) 
                if [$running_threads -lt $max_threads ] ;then
                     echo "make ncrun TS=$TS CFG=$CFG SEED=$SEED"
                     val=$(eval "make ncrun TS=$TS CFG=$CFG SEED=$SEED"&")&
                     break
                else
                      sleep 2
                fi
         
            done
        done

wait
echo "over"
#grep -o 是 grep 命令的一个选项,它用于只显示匹配的文本
#^:表示匹配行的开头。
#[:space:]:代表空白字符类别。[:space:] 包括空格、制表符、换行符等空白字符。
#[^...]:表示除了指定范围内的字符之外的任意字符。在这里,[^[:space:]] 表示非空白字符,即匹配任何#不是空格、制表符等空白字符的字符。
#*:表示匹配前面的字符零次或多次,即可以匹配任意长度的非空白字符序列。
#因此,[^[:space:]]* 可以理解为匹配任意长度的不包含空白字符的字符串。

 统计log

grep -R 'Quit count:' ./SYS_mmu/log/* | grep -v "0 of 35" > run.log

输入指定log快速仿真测试

read -p "请输入log" log_file
if [ "$log_file" != " " ]; then
     key="${log_file%.*}"
     key1="$(echo "$key" | awk -F '_CFG' '{print $1}' | awk -F 'TS_' '{print $2}')"
     key2="$(echo "$key" | awk -F 'CFG_' '{print $2}' | awk -F '_SEED' '{print $1}')"
     key3="$(echo "$key" | awk -F 'SEED_' '{print $2}')"
     echo "make ncrun SYS=mmu TS=$key1 CFG=$key2 SEED=$key3"
     make ncrun SYS=mmu TOOL=vcs TS=$key1 CFG=$key2 SEED=$key3

else
    echo fault
fi
    echo over

快速测试用例添加脚本

strl=""
read -p "请输入文件名:" filename
if [ -f "$filename" ]; then
    keyword1="${filename%.*}"
    keyword="${keyword1//_seq/}"
    read -p "请输入CFG=:" CFG_NAME
    read -p "请输入CFG1=: " CFG_NAME1
    read -p "请输入make num=: " NUM
    echo \#${filename} >> ../../../work_mmu/case.mk
    echo -e "${NUM}:" >> ../../../work_mmu/case.mk
    if ["$CFG_NAME1" = "$strl"]; then
         echo -e "make ncrun SYS=mmu TS=${keyword1} TOOL=vcs CFG=${CFG_NAME%.*}" >> ../../../work_mmu/case.mk
         echo -e "TS=${keyword1} runtimes=0" >> ../../../work_mmu/regress.sh
    else
        echo -e "make ncrun SYS=mmu TS=${keyword1} TOOL=vcs CFG=${CFG_NAME%.*} CFG1=${CFG_NAME%1.*} " >> ../../../work_mmu/case.mk
        
    fi
    echo "内容写入"
else
    echo "失败"
fi

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值