Понимание того, как работают модули покрытия - PullRequest
1 голос
/ 25 мая 2020

Я столкнулся с новым языком c Dynami. Я хотел бы создать инструмент покрытия для этого языка. Я начал читать исходный код модулей покрытия Perl 5 и Python, но это усложнилось. Это язык сценариев Dynami c, поэтому я полагаю, что исходный код языков stati c (например, Java и C ++) мне здесь не поможет. Кроме того, насколько я понимаю, каждый язык был построен по-своему, и одни и те же идеи не работают. Но большие концепции могут быть похожими.

У меня такой вопрос: как мне «атаковать» эту задачу? Какой рабочий процесс мне нужно соблюдать? Что мне нужно исследовать? Могу ли я прочитать какие-нибудь книги или блоги на эту тему?

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

В дополнение к ответу Иры существует третий механизм сбора информации: языковая реализация обеспечивает обратный вызов, который может информировать вас о программных событиях. Например, Python имеет sys.settrace: вы предоставляете ему функцию, а Python вызывает вашу функцию для каждой вызываемой или возвращаемой функции и каждой выполненной строки.

0 голосов
/ 25 мая 2020

Существует два типа механизмов сбора покрытия:

1) Выборка программного счетчика в реальном времени, обычно с помощью часов, работающих с интервалом 1-10 мс. Трудности: а) сопоставление фактического значения P C с исходной строкой, б) выборка означает, что вы можете не увидеть выполнения редко используемого фрагмента кода, поэтому ваши отчеты о покрытии неточны. Из-за этих проблем этот подход используется не очень часто.

2) Инструментирование программы таким образом, чтобы она собирала покрытие во время выполнения. Это сложно сделать с объектным кодом ... а) вам нужно декодировать инструкции, чтобы увидеть, где разместить зонды, и это может быть очень сложно сделать правильно, б) вы исправили исходный код, чтобы включить зонды (это может быть действительно неудобным: «зонд» может состоять из 5-байтового вызова подпрограммы, но зонд заменяет однобайтовую инструкцию). c) вам все еще нужно выяснить, как сопоставить местоположение зонда со строкой исходного кода. Более эффективный способ - инструментировать исходный код, что требует довольно сложного оборудования для чтения исходного кода, создания пробных исправлений и регенерации инструментального кода для выполнения / компиляции.

Мой технический документ Охват ветвей для произвольных Упрощенные языки предоставляет подробные сведения о том, как это сделать в общих чертах. Моя компания создала коммерческие инструменты покрытия тестов для самых разных языков (C, Python, PHP, COBOL, Java, C ++, C#, Pro C, ....), используя этот подход. Это охватывает большинство языков stati c и Dynami c. Некоторые механизмы Dynami c чрезвычайно сложно инструментировать, например eval (), но это верно для любого подхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...