Comments 25
Если я пишу код на Go, мне не нужно писать тесты.
Правда? Или, может быть, все-таки "мне не нужно писать некоторые тексты"?
Так и есть. В оригинале:
If I am writing Go code, there is a small mountain of tests that I will never have to write.
Не "мне не нужно писать тесты", а "некоторые тесты мне никогда не придется писать".
Маленькое уточнение. Это предложение переводится как — Если я пишу код на Go, то из тестов, которые мне не придётся писать можно сложить небольшую гору.
Является эта небольшая гора всеми тестами, или только некоторыми можно понять только из контекста. И из контекста ясно, что речь идёт о некоторых тестах, а не обо всех.
Нам необходимо проверить, что наш код работает корректно, а не что если мы напишем некорректный код — он будет работать корректно. Вот и стоит писать тесты на приложение. И негативные тесты только там, где реально может прийти что-либо неожидаемое. Должны упасть если неправильный ввод пользователя или недостаточно данных? Окей. Но проверять, что функция
analyzeString()
будет падать, если передать в нее массив, объект, число или яблоки — моветон. Все-равно свалятся более высокоуровневые тесты кода, который так странно использует эту функцию.Зачем писать юнит-тест на неправильное использование чего-либо?
Чтобы удостовериться, что при неправильном использовании система не пожирает галактику.
Не стремящееся к бесконечности, а ровно бесконечность. Но на то и существуют классы эквивалентности, чтобы сократить число подобных вариантов к минимуму.
Ну офигеть, а то мы не знали преимуществ статической типизации.
А ведь вместо написания статей, автор мог бы научится нормально писать юнит-тесты.
Вы слышали про такого человека, как Роберт Мартин? Он же дядя Боб. Вот он утверждает, что если к динамичекому коду добавить юнит тесты, то у статистически типизированного кода не будет преимуществ перед динамически типизированным кодом.
Вот тут главное не забывать, что стопроцентное покрытие кода тестами в реальном проекте недостижимо за приемлемое время, да к тому же само по себе ничего не гарантирует с точки зрения работоспособности программы.
Роберт Мартин вот утверждает, что 100% это как раз реальные цифры. И что отсутствие стопроцентного покрытия гарантирует проблемы.
Роберт Мартин вот утверждает, что 100% это как раз реальные цифрыЦитату можно?
И что отсутствие стопроцентного покрытия гарантирует проблемы.Каким образом?
Цитату можно. Вот она.
Am I suggesting 100% test coverage? No, I’m demanding it. Every single line of code that you write should be tested. Period.
Что касается того, каким образом отсутствие стопроцентного покрытия гарантирует проблемы — у Мартина вообще много про это. Книги Clean Code и Clean Coder этого касаются. Наверное можно вот эту статью почитать.
Цитату можно. Вот она.Так он не говорит, что это реальные цифры. Он говорит что настаивает на их достижении. На практике мало кому это удается.
Что касается того, каким образом отсутствие стопроцентного покрытия гарантирует проблемы — у Мартина вообще много про это.Не знаю что там у Мартина, но по законам формальной логики отсутствие проверки не может гарантировать наличие ошибки. А кроме того стопроцентное покрытие не гарантирует отсутствие проблем (а лишь отсекает их часть).
Собственно, тесты и определяют «работоспособность».
Тут фишка заключается в том, что если заказчик дает вам задания не в виде формальных спецификаций (это те, которые трактуются однозначно), то вы должны их написать сами или не писать код вовсе.
А код, написанный без таких требований это интуитивная попытка угадать их, не формализуя, а вернее формализуя где-то в подсознании. Отсюда и все последующие проблемы — «не угадал», «угадал, но немного не так». Обобщая, вы становитесь «частью заказчика».
у статистически типизированного кода не будет преимуществ перед динамически типизированным кодом.
Я вот не могу согласиться. Кроме тестирования это ещё локальная самопроверяющаяся документация и хорошая поддержка ИДЕ. Это кое-как можно сделать через всякие там JSDoc, но это не так удобно и не так хорошо поддерживается.
Да, под автором я понимаю именно автора, а не переводчика, которому спасибо)
В случае же интерпретируемых языков всё не так радужно. Используете всего пару функций из jQuery? Ваш проект поправится на полный объём этой библиотеки. Используете всего 5% тех возможностей, которые предоставляет AngularJS? Ваш проект неминуемо вырастет сразу на полметра. И так может дойти до того, что простенькая страничка тянет за собой 10Мб зависимостей, из которых реально выполняется порядка 40Кб. Ну не бред ли?
Когда юнит-тестирование действительно необходимо