Подтвердить что ты не робот

Как вы тестируете TCP-сервер? Это даже стоит?

Я разрабатываю небольшой TCP-сервер, который обрабатывает некоторые TCP-пакеты и ведет себя по-разному на основе запроса.

Как я могу написать unit test для этого? Если это действительно сложно написать, это даже стоит усилий?

4b9b3361

Ответ 1

Первое, что нужно сделать, - отделить поведение от входящих пакетов TCP. Сообщите это в таблицу рассылки или другую такую ​​вещь.

Затем записывайте единичные тесты для каждого поведения, независимо от того, как они были вызваны. Вы можете протестировать окончательный уровень поведения TCP → с помощью тестового инструмента, который вы пишете или занимаете. Этот слой должен быть почти тривиальным, если код правильно упорядочен.

Ответ 2

Я попытаюсь извлечь бит, специфичный для TCP, из бит обработки. Является ли ваш протокол действительно основанным на пакетах или основан на потоке? Если он основан на потоке, вы можете просто заставить обрабатывающую часть принять поток (или, возможно, пару потоков, один для ввода и один для вывода) и подать его либо с помощью MemoryStream, либо с помощью вашей собственной подобной реализации потока, дающей немного больше контроль.

В любом случае, вы в основном хотите издеваться над сетевой стороной вещей, чтобы вы могли протестировать реальную логику, не вовлекая ее в работу. Тестирование сетевого уровня (т.е. Тонкая часть логики между кластерными сетевыми классами и логикой обработки) может быть немного сложнее, но если вы можете сделать его достаточно тонким, не должно быть много испытаний.

Ответ 3

Это того стоит.

Число единичных тестов должно совпадать с типом запросов (по-разному). Это будет полезно, если вы внесете изменения и убедитесь, что это повлияло или не повлияло на другие части TCP-сервера.

Вы можете имитировать отправку пакетов TCP с помощью нескольких доступных инструментов. Дайте мне знать, как это происходит.

Ответ 4

Если вы пишете TCP-сервер, вы также должны писать клиентскую библиотеку. Если вы ничего не делаете, вы можете просто запускать пакеты через loopback-адаптер между вашим unit test и заглушкой. Вам нужно только проверить, правильно ли вы выполняете TCP с этими тестами, так как остальные ваши тесты должны, в правильном стиле unit test, заглушить/пропустить логику TCP/сокета и перейти прямо к отдельному тестируемому устройству.

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

Ответ 5

Я ничего не знаю о .net, но могу рассказать вам об модульном тестировании.

Вам нужно учитывать все. Например, ваш сервер может работать в потоке и выполнять некоторую работу. Там, где он должен работать, внутри функции. Вероятно, у вас тоже есть объект запроса. Сделать "работу" tcp-сервера "взять объект запроса в качестве параметра". Затем unit test, как обычно: в начале теста настройте запрос и передайте его на объект "tcp server" "work function". На самом деле у вас нет открытых сокетов сервера или чего-то еще. Вы просто тестируете методы, которые выполняют эту работу, и проверяете только обработку запроса. Вы не тестируете сокеты или надежность сети или что-то в этом роде. Вам нужно проверить это по-другому.

Ответ 6

Вы можете взглянуть на NMock, насмешливую библиотеку для .NET. Если в единичном тесте участвуют две стороны, всегда полезно просто "высмеять" одну сторону (ту, которую вы не тестируете, в этом случае Клиент).

Однако это потребует некоторых изменений в вашем коде, но поверьте мне, это того стоит.

Ответ 7

Я не могу дать вам конкретных помощников, так как ваш вопрос довольно открытый.

Однако, похоже, вы хотите написать макет-сервер/клиент в зависимости от ваших потребностей. Стоит посмотреть Rhino Mocks.

Вы также можете взглянуть на Oren проект NMemCached, который реализует кеш-сервер с использованием пользовательской реализации TCP/IP. В этом проекте есть некоторые интересные тесты на единицу/интеграцию, написанные с использованием Rhino Mocks.

Ответ 8

Это, безусловно, стоит усилий. То, что я купил для приложения с малым сервером HTTP, на котором я работаю, имеет aseries скриптов, которые запускают запросы на сервере с помощью wget. Затем я использовал diff, чтобы сравнить сохраненный вывод wget с тем, что я ожидал получить, и сообщить о любых ограничениях. Я запускаю этот кучу скриптов каждый раз, когда я меняю сервер, и он обнаружил много ошибок.

Очевидно, что это работает только для HTTP-серверов, но вам стоит записать небольшое приложение, которое может запускать TCP-запросы на вашем сервере и сохранять результаты.