Поиск всех условий if в файле python и добавление оператора печати в следующей строке

Я должен отредактировать файл 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) относится к тому факту, что это условие if находится в функции номер 8(y) (функции представляют собой просто числа последовательно, ничего особенного в 8), а x является x-м условием в функции y.

и, конечно, строка, которая будет добавлена, должна быть добавлена ​​с правильным отступом. 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 - мне нужно посмотреть, выполняется ли условие if во время выполнения 47 тестовых случаев. Другими словами, мне нужно сделать покрытие кода. Сложность в том, что я работаю с стимулом Кокотба для проверки RTL. В результате не существует прямого способа управлять стимулом, поэтому я не вижу простого способа использования стандартного способа cover.py для тестирования покрытия. Есть ли способ проверить покрытие, так по-другому? Я чувствую, что что-то упустил.

2 ответа

Если вы действительно не можете использовать cover.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!

У меня есть около 1200 строк кода Python с примерно 180 условиями if - мне нужно проверить, выполняется ли каждое условие if во время выполнения 47 тестовых случаев. Другими словами, мне нужно сделать покрытие кода. Сложность в том, что я работаю с стимулом Кокотба для проверки RTL.

Cocotb имеет встроенную поддержку покрытия ( документы)

export COVERAGE=1
# run cocotb however you currently invoke it
Другие вопросы по тегам