2010-03-20 13 views
19

Mam stos kodu C, który chciałbym przetestować w jednostce przy użyciu biblioteki Unittest Pythona (w Windows), ale staram się wypracować najlepszy sposób połączenie kodu C, aby Python mógł go wykonać (i uzyskać wyniki z powrotem). Czy ktokolwiek ma doświadczenie w najprostszy sposób to zrobić?Najprostszy sposób testowania kodu jednostkowego z Pythonem

Niektóre pomysły to:

  • Owijanie kod jako rozszerzenie Python C używając API Pythona
  • zawinąć kod C przy użyciu SWIG
  • Dodaj otoki DLL do kodu C i załadować je do Python przy użyciu ctypes
  • Dodać niewielką serwer XML-RPC do c-kodu i nazywają go za pomocą xmlrpclib (tak, wiem, że to wydaje się trochę daleko out!)

Czy istnieje kanoniczny sposób robienia tego? Mam zamiar robić to całkiem sporo, z różnymi modułami C, więc chciałbym znaleźć sposób, który jest najmniejszym wysiłkiem.

Odpowiedz

5

Myślę, że dokładne rozwiązanie zależy od kodu. Nie wszystkie biblioteki są łatwo przystosowane do zawijania jako DLL. Jeśli tak, to z pewnością najłatwiejszy sposób to: ctypes - po prostu wyślij bibliotekę DLL z biblioteki, a następnie przetestuj ją pod numerem ctypes. Dodatkową korzyścią jest to, że biblioteka jest wygodnie zapakowana jako samodzielna biblioteka DLL, która pomaga oddzielić aplikację.

Czasami konieczna jest bardziej szczegółowa interakcja między twoim kodem C a testowym kodem Pythona. Wtedy prawdopodobnie najlepiej jest podłączyć go jako rozszerzenie, dla którego SWIG jest całkiem dobrym narzędziem, które zautomatyzuje większość rzeczy, które nudzą ci proces.

9

Używanie ctypów byłoby moim pierwszym instynktem, choć muszę przyznać, że gdybym testował kod C, który nie byłby połączony z Pythonem, po prostu użyłbym check. Check ma tę mocną zaletę, że jest w stanie odpowiednio zgłosić przypadki testowe na segfault. Dzieje się tak dlatego, że uruchamia on każdy przypadek testowy w oddzielnym procesie.

Teraz, jeśli masz zamiar stworzyć opakowanie Pythona dla kodu C, to po prostu przestawiłbym pakowacz. Oprócz metod wymienionych powyżej, możesz również użyć Cythona do napisania takiego opakowania za pomocą kodu podobnego do Pythona, a następnie anulować go z Pythona.

+0

Czy nie byłoby to powolne (szczególnie w przypadku okien), jeśli masz wiele (np. Tysiące) przypadków testowych? Nawet setki? – Arafangion

+0

Zaktualizowany link sprawdzający: https://libcheck.github.io/check/ –

Powiązane problemy