Самый легкий способ поблочного тестирования C кодирует с Python

У меня есть груда кода C, который я хотел бы к модульному тесту, пользующемуся unittest библиотекой Python (в Windows), но я пытаюсь разработать лучший способ соединить интерфейсом с кодом C так, чтобы Python мог выполнить его (и вернуть результаты). У кого-либо есть опыт самым легким способом сделать это?

Некоторые идеи включают:

  • Обертывание кода как расширение Python C использование API Python
  • Перенесите код C с помощью БОЛЬШОГО ГЛОТКА
  • Добавьте обертку DLL к коду C и загрузите его в Python с помощью ctypes
  • Добавьте маленький сервер XML-RPC к c-коду и назовите его с помощью xmlrpclib (да, я знаю, что это кажется немного далеким!)

Существует ли канонический способ сделать это? Я собираюсь быть выполнением этого довольно много с различными модулями C, таким образом, я хотел бы найти путь, который является наименьшим количеством усилия.

20
задан Jon Mills 20 March 2010 в 07:12
поделиться

2 ответа

Я думаю, что точное решение зависит от вашего кода. Не все библиотеки легко можно обернуть в виде DLL. Если да, то ctypes , безусловно, самый простой способ - просто создайте DLL из своей библиотеки, а затем протестируйте ее с помощью ctypes . Дополнительным бонусом является то, что теперь у вас есть ваша библиотека, удобно обернутая как отдельная DLL, которая помогает отделить ваше приложение.

Иногда, однако, требуется более тщательное взаимодействие между вашим кодом C и тестируемым кодом Python. Тогда, вероятно, лучше всего подключить его как расширение, для чего SWIG - довольно хороший инструмент, который автоматизирует большинство вещей, которые вам покажутся скучными в процессе.

5
ответ дан 30 November 2019 в 01:24
поделиться

Использование ctypes было бы моим первым побуждением, хотя я должен признать, что если бы я тестировал код C, который изначально не собирался взаимодействовать с Python, я бы просто использовал check . Проверка имеет сильное преимущество в том, что она может правильно сообщать тестовые случаи, когда происходит ошибка segfault. Это потому, что он запускает каждый тестовый пример в отдельном процессе.

Теперь, если вы все равно собираетесь создать оболочку python для кода C, я бы просто протестировал ее. В дополнение к методам, которые вы перечислили выше, вы также можете использовать Cython для написания такой оболочки с кодом, подобным python, а затем выполнить ее модульное тестирование с Python.

9
ответ дан 30 November 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: