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

Posted

技术标签:

【中文标题】使用 Python 对 C 代码进行单元测试的最简单方法【英文标题】:Easiest way of unit testing C code with Python 【发布时间】:2010-03-20 07:12:47 【问题描述】:

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

一些想法包括:

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

有这样做的规范方法吗?我将经常使用不同的 C 模块来做这件事,所以我想找到一种最省力的方法。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

如果您有很多(即数千个)测试用例,那会不会很慢(尤其是在 Windows 上)?甚至数百?【参考方案2】:

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

但是,有时需要在 C 代码和测试 Python 代码之间进行更彻底的交互。然后,最好将它作为一个扩展进行挂钩,对于这个扩展,SWIG 是一个非常好的工具,它可以自动处理你会发现该过程中的大多数无聊的事情。

【讨论】:

以上是关于使用 Python 对 C 代码进行单元测试的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

使用本机单元测试项目在 Visual Studio 2017 中对 C 代码进行单元测试

如何在C#中对单元测试性能优化进行单元测试?

禅道的最简使用

iOS单元测试的那些事儿

对内核模块代码进行单元测试是不是可行?

对 Python GUI 应用程序进行单元测试的推荐方法是啥?