Когда писать Unit тесты

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

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

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

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

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

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

Если тесты поддерживать постоянно в рабочем состоянии, то они реально помогают. Меня уже много раз спасали тесты, когда видишь NullException баг и думаешь, что его так просто исправить, просто добавив значение по умолчанию. А потом запускаешь тесты, а оказывается, что где-то есть логика, завязанная на Null значение и эта логика сломана. 

Тесты реально помогают тестировать, и если вы будете подходить к этому вопросу так же, то вы полюбите, как удобно с помощью кода тестировать свой код. Ведь вы же тестируете свой код руками? В случае с сайтами вы вынуждены запускать его, выполнять какие-то действия и так далее. А некоторые баги ведь требуют только определенного сценария, например, срабатывают только на новом пользователе. Чтобы воспроизвести баг нужно руками создать пользователя, потом выполнить действия, которые приводят к багу. Когда ошибку удалось воспроизвести, ее начинаешь дебагить и снова нужно повторять шаги с регистрацией, воспроизведением ошибки. А если с первого раза не удалось определить причину бага, то шаги опять приходится повторять. А когда баг починили нужно еще раз повторять руками процесс регистрации пользователя и нужно убедиться, что баг исправлен. 

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

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

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

Не откладывайте тесты на потом. Если что-то отложить на завтра, то это не будет сделано никогда. 


Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым


Комментарии

Леонид

21 Мая 2018

согласен, тоже так делаю


chizhov

21 Мая 2018

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


KastorDriver

21 Мая 2018

Тут важно понимать, что TDD это методология разработки, а не тестирования. Покрытие кода тестами при TDD это скорее приятный бонус. Советую всем почитать книгу Kent Beck "Test Driven Development".

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

А как вы тогда сам код пишите при неясной картине? Я это заблуждение слышу напостой когда рассказываю людям про TDD. Тесты покрывают поведение приложения, а не сам код.

Ведь вы же тестируете свой код руками?

Бывает, но в эти моменты нужно убедиться, что дети уже ушли спать. Ручное тестирование говорит только о том, что разработчик не знает как правильно написать интеграционный, системный и UI-тест.

Ручное тестирование это путь в никуда. С каждым релизом оно будет занимать все больше времени и удорожать стоимость продукта. Представь, что ты заказал прорабу ремонт кухни и он сделал его. А потом ты просишь его поменять раковину в душевой. И прораб говорит: "Не вопрос! Только мне нужно еще N-баксов и одна неделя на ретест кухни. Мало ли что там отвалится."


Михаил Фленов

21 Мая 2018

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


KastorDriver

21 Мая 2018

Одну и ту же задачу можно решить Х способами и когда я начинаю, очень часто вижу, что надо решить, но не всегда видно с первого захода решение

Опять же нужно тестировать поведение, а не реализацию. Представим что ты пишешь калькулятор. Тебе нужно протестировать, что при передаче в функцию умножения чисел 4 и 2 результатом будет 8. А то как будет реализовано умножение уже не важно с точки зрения тестов. Можно хоть 4 представить как 111 и сделать побитовый сдвиг влево и получить  1111, что та же 8 в десятичной.

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


Михаил Фленов

21 Мая 2018

Я описал то, как я это делаю. Если ты хочешь делать по другому, Билл Гейтс тебе судья. Я же не говорю, что это неверно, это правильно, но я так не делаю. Да, тесты проверяют поведение, которое требует бизнес и если его написать до, во время или после это все еще все тот же самый тест.  Ты же не напишешь тест, который будет проверять умножение 4 и 2 с результатом 9 в конце разработки или во время. Так что если тебе удобнее писать заранее, делай так, как удобнее.


Добавить Комментарий

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

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

Обратная связь

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

Пишите мне