Мне нужно создать оболочку python для библиотеки с помощью SWIG и написать для нее единичные тесты. Я не знаю, как это сделать. Мое первое взятие этой проблемы состоит в том, чтобы имитировать динамическую библиотеку с тем же интерфейсом, что и те библиотеки, для которых я пишу обертку. Эта макетная библиотека может регистрировать каждый вызов или возвращать некоторые сгенерированные данные. Эти журналы и сгенерированные данные могут быть проверены модульными тестами.Как я должен выполнить единичную проверку оболочки python, сгенерированной SWIG
ответ
У меня есть много ситуаций, когда я использую 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 и раскрытия возможности создания структуры по умолчанию, которая может быть использована для тестирования.