在python文件中搜索所有if条件,并在下一行添加打印语句

时间:2019-06-26 06:51:37

标签: python automation code-coverage cocotb

我必须编辑一个python文件,以便在每个if条件之后,我需要添加一行内容,

if condition_check:
    if self.debug == 1: print "COVERAGE CONDITION #8.3 True (condition_check)"
    #some other code
else:
    if self.debug == 1: print "COVERAGE CONDITION #8.4 False (condition_check)"
    #some other code

数字8.4(通常为yx)表示这样的事实,即条件在函数编号8(y)中(函数只是顺序数字,关于8没什么特别的),并且x是在yth函数中存在条件的xth。< / p>

,当然,要添加的行必须添加适当的缩进。 condition_check是要检查的条件。

例如:

if (self.order_in_cb):
         self.ccu_process_crossing_buffer_order()

成为:

if (self.order_in_cb):
         if self.debug == 1: print "COVERAGE CONDITION #8.2 TRUE (self.order_in_cb)"
         self.ccu_process_crossing_buffer_order()

我该如何实现?

其他背景: 我有大约1200行python代码以及大约180条if条件-我需要查看在执行47个测试用例期间是否满足了所有if条件。 换句话说,我需要进行代码覆盖。复杂的是-我正在使用cocotb刺激进行RTL验证。结果,没有直接的方法来驱动刺激,所以我看不到使用标准coverage.py测试覆盖率的简便方法。 有没有其他方法可以检查覆盖率?我觉得我缺少什么。

2 个答案:

答案 0 :(得分:1)

如果您确实不能使用coverage.py,那么我将编写一个辅助函数,该函数使用inspect.stack查找调用方,然后使用linecache读取源代码行,并以此方式进行记录。然后,您只需要在整个文件中将if something:更改为if condition(something):,这应该很容易。

这是概念证明:

import inspect
import linecache
import re

debug = True

def condition(label, cond):
    if debug:
        caller = inspect.stack()[1]
        line = linecache.getline(caller.filename, caller.lineno)
        condcode = re.search(r"if condition\(.*?,(.*)\):", line).group(1)
        print("CONDITION {}: {}".format(label, condcode))
    return cond


x = 1
y = 1
if condition(1.1, x + y == 2):
    print("it's two!")

此打印:

CONDITION 1.1:  x + y == 2
it's two!

答案 1 :(得分:-1)

  

我有大约1200行python代码以及大约180条if条件-我需要查看在执行47个测试用例期间是否满足了所有if条件。换句话说,我需要进行代码覆盖。复杂的是-我正在使用cocotb刺激进行RTL验证。

Cocotb has support for coverage built indocs

export COVERAGE=1
# run cocotb however you currently invoke it