2016-08-11 12 views
2

У меня есть проект, который включает в себя некоторые (довольно простые) генерации C-кода в составе системы сборки. В сущности, у меня есть информация о версии, связанная с проектом (встроенный C), который я хочу открыть в своем двоичном формате, так что я могу легко определить, какая версия прошивки была запрограммирована для определенного устройства для целей отладки.Единичный тест C-генерирующий код python

Я пишу некоторые упрощенные инструменты python для этого, и я хочу убедиться, что они тщательно протестированы. В общем, это было довольно просто, но я не уверен, какая лучшая стратегия для части кода. По сути, я хочу, чтобы убедиться, что сгенерированные файлы как:

  • синтаксически правильно
  • содержат необходимую информацию

Во-вторых, я могу (я считаю) достичь в достаточной степени с регулярное выражение. Первое, однако, является чем-то большим. Я мог бы, вероятно, использовать что-то вроде pycparser и исследовать полученный АСТ для достижения обеих целей, но это похоже на излишне тяжелое решение.

Edit: блок-схема моей иерархии построения

dataflow diagram

+2

regex не является ответом. –

+1

Не могли бы вы [изменить свой вопрос] (https: // stackoverflow.com/posts/38905560/edit), чтобы включить диаграмму потока данных о том, как части C/Python/binary/codegen совпадают друг с другом, и точно, какой результат этапа вы пытаетесь проверить? Кроме того, пытаетесь ли вы полностью проверить какой-либо аспект вашего процесса сборки или пытаетесь ли вы проверить, прежде чем записывать на Flash, что образ, который вы собираетесь записать, должен содержать информацию, которая должна быть основана на источнике C или Python? (Или что-то еще?) Спасибо! – cxw

+0

@cxw Добавлена ​​основная диаграмма. Это всего лишь единичный тест для генерации кода, поэтому все, о чем я забочусь, это то, что требуемая информация существует в паре заголовка/исходного файла и что пара действительна C (сама по себе не приведет к сбою сборки) –

ответ

2

Спасибо за диаграмму! Поскольку вы не тестируете покрытие, если бы это был я, я бы просто скомпилировал сгенерированный C-код и посмотрел, работает ли он :). Вы не указали свою инструментальную цепочку, но в среде, подобной Unix, должно быть достаточно gcc <whatever build flags> -c generated-file.c || echo 'Oops!'.

Теперь может случиться так, что сгенерированный код не является автономным модулем компиляции. Там нет проблем: напишите прокладку. Пример shim.c:

#include <stdio.h> 
#include "generated-file.c" 
main() { 
    printf("%s\n", GENERATED_VERSION); //or whatever is in generated-file.c 
} 

Тогда gcc -o shim shim.c && diff <(./shim) "name of a file holding the expected output" || echo 'Oops!' должно дать вам базовый тест. (<() - bash process substitution.) Файл с ожидаемыми результатами может уже находиться в вашем репозитории git, или вы можете использовать свою подпрограмму Python для записи на диск где-нибудь.

Редактировать 2 Этот подход может работать, даже если ваша фактическая инструментальная цепочка не поддается автоматизации. Чтобы проверить синтаксическую достоверность кода, вы можете использовать gcc, даже если вы используете другой компилятор для вашего целевого процессора. Например, компиляция с gcc -ansi отключит несколько расширений GNU, что означает, что код, который компилируется с gcc -ansi, с большей вероятностью будет скомпилирован в другом компиляторе, чем код, который компилируется с полным расширением, GNU-extended gcc. См. Страницу gcc на "C Dialect Options" для всех различных вкусов, которые вы можете использовать (ditto C++).

Редактировать Кстати, это тот же самый подход GNU autoconf использует: написать небольшую тестовую программу на диск (Autoconf называет его conftest.c), скомпилировать его, и посмотреть, если компиляция удалось. Тест-программа (желательно) является минимальным, необходимым для проверки, если все в порядке. В зависимости от того, насколько сложным является ваш Python, вы можете протестировать несколько различных аспектов вашего сгенерированного кода с помощью соответствующих разных прокладок.