Вопрос

Мне поручено написать модульные тесты для набора сетевого программного обеспечения, написанного на 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()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top