Агрегат-тест проходит в отладке, но зависает при запуске

StackOverflow https://stackoverflow.com/questions/3282154

Вопрос

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

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

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

Это autoresetevent, который висит систему. Он должен быть предоставлен кодом в модульном тесте. Но мой вопрос, как это проходит в режиме отладки? Есть ли что-то особенное в режиме отладки, в соответствии с которыми AutoResetevents автоматически устанавливаются Visual Studio?

Редактировать

Это было действительно состояние гонки. Я добавил задержку в коде после моего отключения кода, и он работает сейчас. Но это все еще ударяет меня так странным, как начнется состояние гонки. Позвольте мне уточнить, вставляя некоторые из кода.

Это тестовый код:

MySystem.FindEquipment(new List<string>(1) { "192.1.1.243:28000" });
MySystem.ConstructSystem();
MySystem.IsConstructedFlag.WaitOne();
Assert.AreEqual(1, MySystem.CommunicationController.HardwareIPList.Count);

PFFrame frame1 = MySystem.Frames["0.x.x"];

Assert.IsTrue(frame1.Disconnect());
Thread.Sleep(100);
Assert.IsTrue(frame1.Connect());
.

Причина этого поражает меня, состоит в том, что я жду возврата в код Diconnect, прежде чем вызывать код подключения. Последняя часть кода разъединения выглядит так:

lclSocket.Shutdown(SocketShutdown.Both);
lclSocket.Close();
OnSocketDisconnected(new PFSocketConnectionEventArgs(ipEp));
return true;
.

Это потому, что Socket.shutdown (), и / или Socket.Close () Методы пропускают его нити? Таким образом, даже если я возвращаю значение из моего отключающего кода, сокет на самом деле не по-настоящему отключен?

Это было полезно?

Решение

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

Конечно, не видя кода, мы действительно не можем вам очень помочь.

Другие советы

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

Но используйте инструменты + прикрепить к процессу первым.Debug + Break All, Debug + Windows + Threads и посмотрите на стеки вызовов потоков.Вы можете увидеть причину гонки или тупика.

имел аналогичную проблему один раз, когда я сравнил два дата, и ожидал одну дату после другого, но потому что она была выполнена, что они были быстрыми, они получили тот же временную метку.

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

Причина, по которой я говорю, это то, что, если розетка фактически отключает 123,251 раз <100 мсексов, но 123,252-й раз отключение времени занимает 101 мсек.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top