Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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