Проверять или не издеваться при тестировании кода, основанного на сторонних библиотеках - PullRequest
0 голосов
/ 20 января 2012

Я написал функцию, которая в основном скрывает сложность использования библиотеки pySnmp для отправки сообщения SNMP, и она выглядит следующим образом:

snmpWalk(host,oid):
    from pysnmp.entity.rfc3413.oneliner import cmdgen
    cg = cmdgen.CommandGenerator()
    comm_data = cmdgen.CommunityData('my-manager','public')
    transport = cmdgen.UdpTransportTarget((host,161))
    variables = oid
    return cg.nextCmd(comm_data,transport,variables)

Я новичок в модульном тестировании, и я пытался написать модульный тест для этого кода в качестве doctest с использованием minimock, и вот что я придумал:

#Setup the mocks
>>> from minimock import mock, Mock
>>> cmdgen.CommandGenerator = Mock('cmdgen.CommandGenerator')
>>> cmdgen.CommunityData = Mock('cmdgen.CommunityData')
>>> cmdgen.UdpTransportTarget = Mock('cmdgen.UdpTransportTarget')
>>> cgMock = Mock('cgMock')
>>> cmdgen.CommandGenerator.mock_returns = cgMock
>>> cmdgen.CommunityData.mock_returns = 1
>>> cmdgen.UdpTransportTarget.mock_returns = 2
>>> cgMock.nextCmd.mock_returns = (1,2,3,4)
#run the test
>>> PrinterMonitor.SnmpWalk('192.0.0.1','1.1.1.1.1.1.1') 
Called cmdgen.CommandGenerator()
Called cmdgen.CommunityData('my-manager', 'public')
Called cmdgen.UdpTransportTarget(('192.0.0.1', 161))
Called cgMock.nextCmd(1, 2, (1, 1, 1, 1, 1, 1, 1))
(1, 2, 3, 4)

Итак, я запускаю этот тест, и он работает нормально, но мой вопрос: действительно ли мне нужно приложить все усилия, чтобы высмеивать каждый аспект сторонней библиотеки ? По моему мнению, минимум, который мне нужно было бы смоделировать, это последняя строка cg.nextCmd(comm_data,transport,variables), потому что я на самом деле не хочу запускать сообщения для принтеров в своих модульных тестах, но другие вызовы кода библиотеки должны дать мне согласованные результаты в зависимости от того, что я передаю им. Я могу убедиться, что мой код соответствующим образом взаимодействует с библиотекой (т.е. убедитесь, что он правильно передает аргумент хоста в транспортную переменную, утверждая это на объекте, передаваемом поддельному cg.nextCmd(...) вызову?

1 Ответ

0 голосов
/ 24 января 2012

Тебе нужно пройти через все эти усилия?Нет.

Чтобы проверить код, который использует вашу snmpWalk() функцию, было бы лучше смоделировать класс, содержащий функцию.Я не знаю терминов Python, но в терминах Java я бы поместил snmpWalk() в интерфейс, затем имел бы реализацию pySnmp и любое количество реализаций макетов / тестов.Код, вызывающий snmpWalk(), не должен заботиться о каких-либо внутренних деталях, он просто заботится о возвращаемом значении, так что это тот уровень, который вы хотите высмеять.

Чтобы протестировать сам класс реализации pySnmp, вы может макетировать вызовы библиотеки, но это большая работа и рискованно, учитывая, что ваши макеты должны очень близко эмулировать библиотеку.Я бы просто придерживался реальных звонков.Если это означает запуск реальных запросов на принтер, не запускайте этот тест очень часто - или посмотрите, есть ли способ настроить библиотеку для печати на виртуальных / поддельных принтерах.

...