использование pyunit в сетевом потоке
-
19-09-2019 - |
Вопрос
Мне поручено написать модульные тесты для набора сетевого программного обеспечения, написанного на python.Написание модулей для построения сообщений и других статических методов очень просто, но я уперся в стену, когда дело доходит до написания тестов для сетевых потоков с циклическим подключением.
Например:Сервер, к которому он подключается, может находиться на любом порту, и я хочу иметь возможность протестировать возможность подключения к многочисленным портам (последовательно, а не параллельно) без фактической необходимости запускать множество серверов.Каков хороший способ подойти к этому?Возможно, сделать создание и уничтожение сервера частью теста?Что-то подсказывает мне, что должен быть более простой ответ, который ускользает от меня.
Я должен представить, что существуют методы модульного тестирования сетевых потоков, но, похоже, я не могу найти ни одного.
Решение
Я бы попытался внедрить factory в ваш существующий код, предназначенный для создания объектов сокетов.Затем в тестовом проходе на макетной фабрике, которая создает макетные сокеты, которые просто притворяются, что они подключились к серверу (или нет для случаев ошибок, которые вы также хотите протестировать, не так ли?) и регистрируют трафик сообщений, чтобы доказать, что ваш код использовал правильные порты для подключения к правильным типам серверов.
Старайтесь пока не использовать потоки, чтобы упростить тестирование.
Другие советы
Это зависит от того, насколько многоуровнево ваше сетевое программное обеспечение и насколько подробными вы хотите сделать свои тесты, но в некоторых сценариях, безусловно, возможно сделать настройку сервера и демонтаж частью теста.Например, когда я работал над пакетом ведения журнала Python (до того, как он стал частью Python), у меня был тест (я не использовал pyunit
/unittest
- это был просто специальный скрипт), который запустил (в одном тестировании) четыре сервера для прослушивания портов TCP, UDP, HTTP и HTTP / SOAP, а затем отправил на них сетевой трафик.Если вам интересно, дистрибутив - это здесь и соответствующий тестовый скрипт в архиве, на который нужно посмотреть, - это log_test.py
.Пакет ведения журнала Python, конечно, прошел некоторый путь с тех пор, но старый пакет все еще доступен для использования с версиями Python < 2.3 и >= 1.5.2.
У меня есть несколько тестовых примеров, которые запускают сервер в программе установки и закрывают его при демонтаже.Я не знаю, очень ли это элегантный способ сделать это, но у меня это работает.
Я счастлив, что у меня это есть, и это мне очень помогает.
Если инициализация сервера занимает очень много времени, альтернативой было бы автоматизировать ее с помощью ant.ant запустил бы / остановил сервер до / после выполнения тестов.
Видишь здесь для очень интересного туториала о ant и python
Вам нужно было бы создать фиктивные сокеты.Точный способ сделать это будет зависеть от того, как вы создаете сокеты, и создание генератора сокетов было бы хорошей идеей.Вы также можете использовать издевательскую библиотеку, такую как пимокс чтобы облегчить вашу жизнь.Возможно, это также избавит от необходимости создавать генератор сокетов только с единственной целью тестирования.
Используя pymox, вы могли бы сделать что-то вроде этого:
def test_connect(self):
m = mox.Mox()
m.StubOutWithMock(socket, 'socket')
socket_mock = m.MockAnything()
m.socket.socket(socket.AF_INET, socket.SOCK_STREAM).AndReturn(socket_mock)
socket_mock.connect(('test_server1', 80))
socket_mock.connect(('test_server2', 81))
socket_mock.connect(('test_server3', 82))
m.ReplayAll()
code_to_be_tested()
m.VerifyAll()
m.UnsetStubs()