Поиск всех условий 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