Самый простой способ модульного тестирования кода C с Python - PullRequest
20 голосов
/ 20 марта 2010

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 20 марта 2010

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

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

5 голосов
/ 22 марта 2010

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

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

...