我应该如何对SWIG生成的python包装器进行单元测试

时间:2015-02-16 14:04:15

标签: python swig python-extensions

我需要使用SWIG为库创建python包装器并为其编写单元测试。我不知道该怎么做。我对这个问题的第一个看法是使用与我正在编写包装器的库相同的接口来模拟动态库。此模拟库可以记录每个调用或返回一些生成的数据。可以通过单元测试来检查此日志和生成的数据。

2 个答案:

答案 0 :(得分:0)

我有很多情况,我使用SWIG生成的包装器对库进行单元测试,但我想你要求的是对包装器进行单元测试。

我一直在测试包装器的方式,比如说mylib本身如下:

属性:对于每个类都说MyClass已公开属性,我使用MyClass._swig_getmethods__列出所有可以修改的属性。我验证了正确数量的属性是否可用并且它们按预期工作

# Filter out builtin_function_type
getmethods = {k: v for k,v in mylib.MyClass.__swig_getmethods__.iteritems() if type(v) != types.BuiltinFunctionType}
# Filter out lambda functions (constructors)
getmethods = {k: v for k,v in getmethods.iteritems() if v.func_name != '<lambda>'}.keys()

nGetSuccess = 0
testMe = set()
m = mylib.MyClass()
for method in getmethods:
    try:
      value = eval('m.'+method)
      nGetSuccess = nGetSuccess + 1
    except Exception as e:
      print(e.message)
self.assertEqual(nGetSuccess,len(getmethods))

静态方法

对于静态方法,我已按名称建立了预期函数列表,并在mylib.__dict__中搜索它们的存在并调用它们。对于某些方法,我使用了我在这里找到的技巧,用于将C struct参数转换为Python中的字典,并暴露了创建默认结构的可能性,可以用于测试。

答案 1 :(得分:0)

我绝对建议对包装后的代码进行一些基本测试。即使是一些基本的“我可以实例化我的对象”测试也很有帮助;找到问题区域后,您随时可以编写更多测试。

基本上,您要测试的是SWIG接口文件的准确性-这是您在项目中编写的代码!

如果您的对象很有趣,很可能会混淆SWIG。意外跳过包装内容也很容易,或者包装程序使用比您期望的不同的类型映射。