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

17

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

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

    
задан dr. evil 12.04.2009 в 18:12
источник

8 ответов

9

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

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

    
ответ дан Darren Clark 12.04.2009 в 18:20
источник
17

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

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

    
ответ дан Jon Skeet 12.04.2009 в 18:22
источник
  • Хороший момент, он должен абстрагироваться как синтаксический анализ пакетов, так и логический и поместить модульные тесты вокруг обоих. Использование интерфейса для бизнес-логики, а затем издевательская библиотека позволяет изолировать код синтаксического анализа. –  Darren Clark 13.04.2009 в 07:32
4

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

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

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

    
ответ дан Srikar Doddi 12.04.2009 в 18:17
источник
  • Какой инструмент вы рекомендуете? Я планирую получить лицензию на TypeMock, но я не совсем уверен, поддерживает ли она ее. –  dr. evil 12.04.2009 в 18:19
  • Для этого вам нужно использовать некоторые другие инструменты, такие как netscantools.com/nstpro_packet_generator_tcp.html –  Srikar Doddi 12.04.2009 в 18:23
4

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

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

    
ответ дан Christopher Smith 12.04.2009 в 18:27
источник
  • +1: Клиентская библиотека, протестированная с помощью макетного сервера, является одним из усилий. Фактический сервер затем может быть протестирован через клиентскую библиотеку. Вот как мы это делаем. –  S.Lott 13.04.2009 в 22:06
2

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

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

    
ответ дан Tom 12.04.2009 в 18:19
источник
2

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

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

    
ответ дан Marcel Jackwerth 12.04.2009 в 18:21
источник
2

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

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

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

    
ответ дан Codebrain 12.04.2009 в 18:23
источник
2

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

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

ответ дан anon 12.04.2009 в 18:24
источник