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

时间:2010-03-20 07:12:48

标签: python c unit-testing swig

我有一堆C代码,我想使用Python的unittest库(在Windows中)进行单元测试,但我正在尝试找出连接C代码的最佳方法,以便Python可以执行它(并得到结果)。有没有人以最简单的方式做到这一点?

一些想法包括:

  • 使用Python API将代码包装为Python C扩展
  • 使用SWIG
  • 包装C代码
  • 将一个DLL包装器添加到C代码中,并使用ctypes
  • 将其加载到Python中
  • 将一个小型XML-RPC服务器添加到c代码中并使用xmlrpclib调用它(是的,我知道这看起来有点远!)

有这样的规范方法吗?我将使用不同的C模块进行相当多的操作,所以我想找到一种最省力的方法。

2 个答案:

答案 0 :(得分:9)

使用ctypes将是我的第一直觉,但我必须承认,如果我测试的C代码首先不会从Python接口,我只会使用checkCheck具有能够正确报告段错误的测试用例的强大优势。这是因为它在一个单独的过程中运行每个测试用例。

现在,如果你打算为C代码创建一个python包装器,我只需要对包装器进行单元测试。除了上面列出的方法之外,您还可以使用Cython编写类似python的代码的包装器,然后从Python中对其进行单元测试。

答案 1 :(得分:5)

我认为确切的解决方案取决于您的代码。并非所有库都适合作为DLL包装。如果是,那么ctypes肯定是最简单的方法 - 只需从您的库中创建一个DLL,然后使用ctypes进行测试。另外一个好处是,您现在可以将您的库方便地包装为独立的DLL,这有助于解耦您的应用程序。

但是,有时候,您的C代码和测试Python代码之间需要进行更彻底的交互。然后,最好将它作为一个扩展钩子,对于这个扩展,SWIG是一个非常好的工具,可以自动消除你对这个过程感到无聊的大多数事情。