回归用例的log_check 脚本编写

        最近有人私信我,问我log_check脚本如何写,那鄙人就献丑了。

        我们一般在每日回归用例(其实很难做到每日都有回归结果)时,一般都要跑很多条用例,这也是我之前为什么要写《python多进程并发回归测试用例》这个脚本的目的,我们不可能把每个命令在terminal都敲一遍,但是交给机器做这些事是非常轻松加愉快的。好回归正题,那么如何做log_check脚本呢?

首先,我们用例跑完的log,拿vcs来说,一般默认是simv.log,所有与仿真有关的信息我们都是从log里面获取的,没有例外(这里不讨论波形),通常情况下,我们都是先把log拉到最后,看uvm统计的 UVM_ERROR , UVM_FATAL 以及 UVM_WARNING的个数是不是为0,如果UVM_ERROR和UVM_FATAL的个数都为零,我们就认为用例是pass的,反之用例就是fail掉了。那么,这里就有几个问题得拿出来说清楚:

1,对于很多官方VIP(我自己使用 ETH的VIP),会提供一些宏或者cmdline,讲VIP打印的 UVM_ERROR,UVM_WARNING以及UVM_FATAL变成UVM_INFO;

2,对于验证环境本身,每个人的习惯都不一样,有些人喜欢用$display来打印输出信息,或者用例直接timeout跳出来了,那么就没有 UVM_ERROR等信息

3,uvm同样可以通过cmdline将UVM_ERROR,UVM_WARNING以及UVM_FATAL变成UVM_INFO,(在uvm_cmdline_processor.svh里面,里面还有API可以用哟)

以上几种情况会导致我们在check UVM_ERROR关键词时会漏掉或者误判错误用例,这是非常危险的;

对于第一种情况,我们自己首先要清楚,要不要做这些开关,对于第二种情况,我们要在写代码之前就约定好,使用uvm提供的宏:`uvm_info,`uvm_warning,`uvm_fatal,`uvm_error,第三种情况,我们自身可以避免(就怕自己忘记了)。

接下来我们来说log_check脚本如何写:

准备工作:

1,首先给每个用例添加一个收集UVM_ERROR ,UVM_WARNING, UVM_FATAL的类,这在uvm_report_server.svh(在源码base文件夹内) 里面可以找到原型,代码如下:

function void tcxxx::final_phase(uvm_phase phase)
    uvm_report_server my_server = uvm_report_server::get_server();
    super.final_phase(phase);

    if(my_server.get_severity_count(UVM_FATAL)||(my_server.get_severity_count(UVM_ERROR))
        $display("CASE FAILED");
    else
        $display("CASE PASSED");


endfunction:final_phase

 uvm会在final_phase里收集 UVM_FATAL和UVM_ERROR的错误数量,如果都为0,那么就打印CASE_PASSED(注意这里用的$display,防止被屏蔽),反之就失败了。

2,log 如何check:

          其实上面已经讲得很清楚了,我们只需要看simv.log里面是否打印了CASE FAILED或者CASE PASSED 标记即可,接下里我们讲log_check脚本的内容

脚本编写:

        由于我的回归脚本使用Python写的,所以log_chek也就用Python写了(也方便我将两个脚本整合)。下面看代码:

import subprocess os,re,time

work_pat = "xxxxxxx" # 用你自己的目录代替,最好从参数上获取

tc_list_dir = os.listdir(work_path)

try:
    fp_log = open("tc.log",'w')
except:
    print("-----PROCESS ERROR----- cant creat file tc.log")

final_log = []
flag_check = 'unknow'

# 这里隐去了如何在文件夹中找到simv.log的过程


for i tc_list

    try:
        log = open(i,'r',encoding='gbk')
    except:
        print("CANT OPEN simv.log")

    for line in log:
        match_pass = re.search(r'CASE PASSED',line)
        match_fail = re.search(r'CASE FAILED',line)
        if match_pass is not None:
            flag_check = 'pass'
        elseif match_fail is not None:
            flag_check = 'fail'
    os.system('echo "%s : is %s ">>  tc.log'%(i,flag_check))
    flag_check = 'unknow'

这里我只是提供了关键部分的代码,其余部分需要自己完成,整体的思路是:

1,首先我们遍历整个目录,把所有的文件夹找出来;

2,打开文件夹,打开其中的simv.log;

3,在打开simv.log后,扫描整个文件,找到CASE PASSED 或者 CASE FAILED,输出对应的结果到tc.log内,如果没有找到,那么就输出unknow

4,遍历完整文件夹;

由此整个脚本的内容就完成了。但是,凡是都要问个为什么:

1,log_check如果遇到编译失败压根就没有simv.log文件时该怎么办?

2,log_check是要单独做一个脚本,还是于  《python多进程并发回归测试用例》 这个脚本放一起呢?

3,有人说我的用例 fianl_phase压根都没有,别说最后统计ERROR和FATAL了,那怎么办呢? 这个问题好像又是另一个话题了。。。

这几个问题其实各有各的解决办法,留给喜欢思考的人思考吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值