2013-09-30 2 views
1

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

+0

Вы хотите проверить что-то в глобальной сети, не тестируя ее в глобальной сети? – Dukeling

+0

Просто FYI, определить локально?Если вы используете localhost, вы ничего не тестируете - если вы используете IP-адрес машины, на которой размещена игра, вы золотой. Вы можете даже протестировать на той же машине. Но, по крайней мере, используйте две машины в своей локальной сети. – KevinDTimm

ответ

0

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

  1. латентности (важно для игры)
  2. NAT (частая причина проблем в зависимости от вашей игры архитектуры - тем более, если P2P)
  3. безопасности
  4. ошибки соединения (WIFI/3G прерывистые потери)
0

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

  • Всевозможные задержки могут произойти, и это может привести к некоторым неблагоприятным предположениям в вашем коде.
  • Поток TCP может зависеть от управления потоком TCP (когда окно TCP заполняет отправитель, он прекратит отправку и сообщит об этом вам (или, возможно, не сообщит об этом, если вы используете асинхронные API)).
  • TCP считывает, что возвращает «полные сообщения» на локальном хосте, и ваша собственная сеть может начать возвращать фрагменты сообщения.
  • UDP-датаграммы могут пропадать без вести и никогда не прибудут или могут прибыть несколько раз или в любой последовательности.

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

Один из подходов заключается в создании специального тестового клиента, который отправляет известную игру и проверяет, что она получает ожидаемые ответы (насколько это сложно зависит от вашего протокола и вашей игры). После того, как у вас есть эта работа, у вас есть тестовый клиент, намеренно отправляющий данные таким образом, чтобы проверяемые элементы были протестированы. Таким образом, если вы используете UDP, вы можете поместить некоторый код в свой тестовый клиент, чтобы он иногда не потрудился отправлять дейтаграмму UDP. Клиент должен подумать, что он отправил его. Сетевой уровень просто перегружает его. Это проверяет ваш протокол UDP на отсутствие дейтаграмм. Затем несколько раз отправляйте несколько дейтаграмм, затем отправляйте некоторые из последовательности и т. Д. Для задержек TCP добавьте логические «сообщения» в отдельные сетевые сообщения с большими задержками между ними; в идеале отправляйте каждый отдельный тип сообщения в виде последовательности одиночных байтов, чтобы проверить, правильно ли работает код накопления сообщений сервера.

После того, как вы сделали это, вы должны сделать то же самое для вашего кода клиента, возможно, добавив опцию «Fuzzing» к сетевому коду вашего сервера, чтобы сделать такую ​​же вещь ...

Лично я, как правило, попытаться сделать шаг назад и сделать как можно больше в специальных «модульных тестах» (я знаю, что некоторые люди скажут, что это не модульные тесты, назовите их, что вам нравится, просто напишите их!). Эти тесты используют ваш сетевой уровень, используя реальную сеть (разговаривая с фиктивным сервером/клиентом, который создает тест) и проверяют ужасные случаи.

Смежные вопросы