All streams
Search
Write a publication
Pull to refresh
5
0.2
Send message
Тестирование — отдельная большая тема. Чаще всего под этим подразумевается т.н. юнит-тестирование. Суть идеи легко понять на простом примере. Создавая тест вы пишете некую обёртку, которая выполнит одну из ваших функций и проверит ожидаемый результат. Затем, когда вы поменяете что-либо в другой функции, от которой зависит первая функция, чтобы проверить, что изменение ничего не сломало — вам достаточно запустить созданные ранее тесты. Надеюсь понятно, насколько это может быть полезно в большом проекте.

Кажется, здесь немного искажено понятие юнит-теста. Его суть в проверке одной конкретной функции, на которую пишется тест. Если у этой функции есть другие зависимости, то вместо них желательно «подсунуть» фэйковые реализации — мок или стаб.
Под описание в статье больше подпадает интеграционный тест.
Первых двух ошибок, скорее всего, удалось бы избежать, если бы использовалась общепринятая для C# конвенция по именам:
  • приватные поля в camelCase и начинаются со знака подчеркивания (например, private string _privateField),
  • публичные свойства — в PascalCase (например, public int PublicProperty { get; set; }),
  • локальные переменные и аргументы функций — в camelCase (например, int localVariable)

Кроме того, следование таким соглашениям улучшает читабельность кода, особенно для новых людей на проекте
В защиту Решарпера могу сказать, что он подсвечивает сбоку рекурсивный вызов:
Recursive call


Кроме того, при запуске теста в том же Решарпере в режиме дебага он приостанавливает исполнение, как на обычном эксепшне:
Выброс исключения на дебаге
image

Да и студия при запуске тестов сама предлагает подебажить:
Сообщение от Visual Studio
image
Нет, стэктрейса не было… но как-то сомневаюсь, что выводить его разумно в случае ухода в бесконечную рекурсию — это ж какой объем у него будет. Если по умолчанию максимальный размер стека в 64-битной системе 4 МБ (или 1 МБ для 32-битной системы), и весь этот объем — повторяющийся вызов одной и той же функции.
Тем не менее, в сессии видно, какой именно из тестов упал, в сообщении явно указано про Stack overflow exception — что скорее всего подразумевает рекурсию. В большинстве случаев, на мой взгляд, этого вполне достаточно, чтобы локализовать проблему. Если нет — то видимо, есть проблемы с архитектурой в целом, ИМХО.
Запустил сессию с двумя тестами. В первом — вызов бесконечной рекурсии. Появляется MessageBox с ошибкой «Stack overflow exception occurred in test. Test run is aborted.», соответственно по нему статус Aborted, по второму тесту — Inconclusive (то есть текущая сессия не продолжается). Ничего не упало, решарпер и студия работают стабильно.
Все-таки он не «успешно упал», а «успешно поймал» (catch) =)
Самому стало любопытно — проверил. Решарпер успешно поймал исключение и выдал ошибку «Stack overflow exception occurred in test. Test run is aborted.». Если запускал в Test Explorer самой студии (Visual Studio 2015 Enterprise), она тоже удачно справилась и выдала в Output «The test execution process crashed while running the tests.», предложив подебажить с файлом .dmp
12 ...
22

Information

Rating
2,879-th
Registered
Activity