Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该如何对SWIG生成的python包装进行单元测试_Python_Swig_Python Extensions - Fatal编程技术网

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

我应该如何对SWIG生成的python包装进行单元测试,python,swig,python-extensions,Python,Swig,Python Extensions,我需要使用SWIG为库创建python包装器,并为其编写单元测试。我不知道怎么做。我对这个问题的第一个理解是使用与我正在编写包装器的库相同的接口来模拟动态库。这个模拟库可以记录每个调用或返回一些生成的数据。单元测试可以检查这些日志和生成的数据。我有很多情况,我使用SWIG生成的包装器对库进行单元测试,但我猜您要求的是对包装器本身进行单元测试 我测试包装器的方法,比如说mylib本身,如下所示: Properties:对于每个类,比如MyClass,在属性公开的情况下,我使用MyClass.\u

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

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

我测试包装器的方法,比如说
mylib
本身,如下所示:

Properties:对于每个类,比如
MyClass
,在属性公开的情况下,我使用
MyClass.\u swig\u getmethods\uuuuu
列出所有可以修改的属性。我验证是否有适当数量的属性可用,并且它们是否按预期工作

# 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))
#过滤掉内置函数类型
getmethods={k:v代表k,在mylib.MyClass中为v。_swig_getmethods__uuu.iteritems(),如果type(v)!=types.BuiltinFunctionType}
#过滤掉lambda函数(构造函数)
getmethods={k:v代表k,如果v.func_name!=''}.keys()中的v是getmethods.iteritems()中的v
nGetSuccess=0
testMe=set()
m=mylib.MyClass()
对于getmethods中的方法:
尝试:
值=评估('m.+方法)
nGetSuccess=nGetSuccess+1
例外情况除外,如e:
打印(电子邮件)
self.assertEqual(nGetSuccess,len(getmethods))
静态方法


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

我绝对建议对包装的代码进行一些基本测试。甚至一些基本的“我可以实例化我的对象”测试也非常有用;当您发现问题区域时,您总是可以编写更多的测试

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

如果你的对象很有趣,很可能会混淆SWIG。也很容易意外地跳过包装,或者包装器使用不同于您所希望的类型映射