TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.74K subscribers
Post #891 1.11K
День семьсот двадцать пятый. #Оффтоп
Вы Всё Ещё не Пишете Тесты?
Редкий пост с моими собственными мыслями, без источника. Мысли предельно примитивные, поэтому не ругайте строго.

Я всегда ненавидел писать тесты. Думаю, я далеко не одинок в этом. И на работе у нас не то, чтобы это обязательно (да, я чувствую ваше осуждение). Поэтому тесты пишутся по остаточному принципу, когда есть время (а его почти никогда нет). Кроме того, некоторые читатели моего канала знают, что мне приходится поддерживать ещё классический ASP, а там с тестами примерно никак (хотя, есть мною с нуля написанная система тестов основных функций). Поэтому и практики особой у меня в этом деле не было.

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

1. Тесты помогают найти ошибки
У нас на сайте есть общедоступная статистика. Некоторые отчёты доступны года с 2003го, другие появились позже. Есть несколько предустановленных периодов, которые пользователь может выбрать для удобства, чтобы не устанавливать даты вручную: предыдущая неделя, предыдущий месяц, квартал, год, год-до-текущей-даты и т.п. Собственно, написан метод (не мной), которому передаётся выбранный период (например, предыдущий месяц) и сроки доступности отчёта, а выдаётся дата начала и дата окончания периода. Однако период передаётся в виде 2х параметров: тип периода (день, неделя, месяц, квартал, год) и количество периодов. То есть используется метод всегда с количеством 1 (предыдущий), но теоретически можно передавать и другое число. Кроме того, результирующие даты ограничиваются сроком доступности отчёта. Например, если запрошен отчёт за предыдущие 2 года, а доступен он только за год, то дата начала берётся как первый день доступности отчёта. Аналогично с датой окончания.

Получил тикет, что неверно выбирается предыдущий квартал. Метод написан осенью, а сейчас вылезло, что 4й квартал 2020го начинается не с октября, а с сентября. Простейшая опечатка. В логике поставлен не 10й месяц, а 9й. Остальная логика на первый взгляд казалась правильной, но какой-то странной. Поэтому я решил всё-таки написать серию тестов. Так вот, поскольку метод использовался с количеством периодов равным 1, он чуть ли не в половине случаев неверно рассчитывал даты, если задать другое количество периодов. Я в итоге нашёл 3 или 4 ошибки в расчётах. Даже в такой вроде бы не самой сложной логике!

2. Покрытие тестами реально повышает уверенность в коде
У вас бывало так, что перед релизом вроде всё работает, но всё равно терзает какое-то странное чувство, что что-то не так? Тесты позволяют избавиться от этого чувства. В методе, который я описал выше, я, конечно, изменил не только 9й месяц на 10й. Я исправил примерно четверть его кода. Но из-за наличия тестов я на 100 (хорошо, на 99) процентов уверен, что теперь он работает правильно.
More from @netdeveloperdiary
  1. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
  2. Sep 25, 2026День 2795. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Начало Проблема с позиц…
  3. Sep 24, 2026День 2794. #Оффтоп #Здоровье Сегодня будет необычный пост. Завтра в Москве стартует конфер…
  4. Sep 23, 2026День 2793. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  5. Sep 22, 2026День 2792. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  6. Sep 21, 2026🔍Тестовое собеседование с Senior C# разработчиком уже завтра 22 сентября(уже завтра!) в 1…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →