2010-03-20 37 views
19

Tôi có một mã C mà tôi muốn kiểm tra đơn vị bằng thư viện không có của Python (trong Windows), nhưng tôi đang cố gắng tìm ra cách tốt nhất interfacing mã C để Python có thể thực thi nó (và lấy lại kết quả). Có ai có kinh nghiệm nào trong cách dễ nhất để làm điều đó không?Cách đơn giản nhất để kiểm tra đơn vị Mã C bằng Python

Một số ý tưởng bao gồm:

  • Bao bì các mã như một phần mở rộng Python C sử dụng API Python
  • Bọc mã C sử dụng SWIG
  • Thêm một wrapper DLL vào mã C và tải nó vào Python sử dụng ctypes
  • Thêm một máy chủ XML-RPC nhỏ để c-mã và gọi nó bằng cách sử xmlrpclib (vâng, tôi biết điều này có vẻ hơi xa ra!)

Có cách làm kinh điển nào không? Tôi sẽ làm điều này khá nhiều, với các mô-đun C khác nhau, vì vậy tôi muốn tìm một cách ít nỗ lực nhất.

Trả lời

5

Tôi nghĩ rằng giải pháp chính xác tùy thuộc vào mã của bạn. Không phải tất cả các thư viện đều dễ dàng thích hợp để gói như một DLL. Nếu bạn là, sau đó ctypes chắc chắn là cách dễ nhất - chỉ cần thực hiện một DLL ra khỏi thư viện của bạn và sau đó kiểm tra nó với ctypes. Một tiền thưởng thêm là bây giờ bạn có thư viện của bạn thuận tiện bọc như là một DLL độc lập giúp decouple ứng dụng của bạn.

Đôi khi, tuy nhiên, cần có sự tương tác triệt để hơn giữa mã C và mã Python thử nghiệm của bạn. Sau đó, nó có lẽ là tốt nhất để móc nó như là một phần mở rộng, mà SWIG là một công cụ khá tốt sẽ tự động hóa đi hầu hết những điều bạn sẽ thấy nhàm chán về quá trình này.

9

Sử dụng ctypes sẽ là bản năng đầu tiên của tôi, mặc dù tôi phải thừa nhận rằng nếu tôi đang thử nghiệm mã C sẽ không được giao tiếp từ Python ngay từ đầu, tôi sẽ chỉ sử dụng check. Check có lợi thế mạnh mẽ khi có thể báo cáo đúng các trường hợp thử nghiệm phân biệt. Điều này là do nó chạy từng trường hợp thử nghiệm trong một quá trình riêng biệt.

Bây giờ, nếu bạn định tạo trình bao bọc python cho mã C, tôi chỉ đơn giản là hủy bỏ trình bao bọc. Ngoài các phương thức bạn đã liệt kê ở trên, bạn cũng có thể sử dụng Cython để viết một trình bao bọc với mã giống như python và sau đó unittest nó từ Python.

+0

Điều đó sẽ không chậm (trên cửa sổ nói riêng) nếu bạn có rất nhiều (ví dụ, hàng nghìn) trường hợp kiểm tra? Ngay cả hàng trăm? – Arafangion

+0

Cập nhật liên kết kiểm tra: https://libcheck.github.io/check/ –

Các vấn đề liên quan