用Python对C代码进行单元测试的最简便方法

27 投票
2 回答
17154 浏览
提问于 2025-04-15 20:38

我有一堆C语言的代码,想用Python的unittest库来进行单元测试(在Windows上),但我在想怎么才能让Python调用这些C代码并获取结果。有没有人有简单的方法可以做到这一点?

这里有一些想法:

  • 使用Python的API把代码包装成一个Python C扩展
  • 用SWIG来包装C代码
  • 给C代码加一个DLL包装,然后用ctypes在Python中加载它
  • 在C代码中加一个小的XML-RPC服务器,然后用xmlrpclib来调用(是的,我知道这听起来有点奇怪!)

有没有一种标准的方法可以做到这一点?我会经常这样做,涉及不同的C模块,所以我想找一种最省事的方法。

2 个回答

12

我首先会想到用ctypes,不过我得承认,如果我是在测试一些根本不打算和Python交互的C代码,我会直接使用checkCheck的一个大优点是,它能很好地报告那些导致程序崩溃的测试案例。这是因为它会在一个单独的进程中运行每个测试案例。

如果你打算为C代码创建一个Python的包装器,那我会直接对这个包装器进行单元测试。除了你上面提到的方法,你还可以使用Cython来用类似Python的代码编写这个包装器,然后从Python中对它进行单元测试。

8

我觉得具体的解决方案要看你的代码。并不是所有的库都能很容易地做成DLL(动态链接库)。如果你的库可以的话,使用ctypes绝对是最简单的方法——只需要把你的库做成一个DLL,然后用ctypes来测试它。额外的好处是,这样你就把库方便地包装成了一个独立的DLL,这样可以让你的应用程序和库之间的关系更松散。

不过,有时候你的C代码和测试用的Python代码之间需要更深入的互动。这种情况下,最好把它作为一个扩展来处理,SWIG就是一个很不错的工具,它可以自动化处理大部分你可能觉得无聊的步骤。

撰写回答