Как интерфейсное модульное тестирование превратилось для меня из увлечения в настоящую вещь
Прямо сейчас. Просто так.
Трудно обойти слово тестирование, если вы собираетесь стать профессиональным программистом. Конечно, я читал об этом и даже потратил несколько часов на написание тестов и решение искусственных задач с помощью разработки через тестирование. Но у меня не было возможности применить полученные знания в повседневной жизни кодирования. Это просто не в моей работе. Мы не пишем тесты (пока что я хочу это изменить), поэтому долгое время все, что я знал о тестировании, касалось скорее академического уровня.
Как началась интрижка
Проекты домашних животных спешат на помощь!
Мне посчастливилось работать над несколькими любимыми проектами с опытными программистами. Самое важное, что я узнал из этих проектов, - это новые или другие рабочие процессы, лучшие практики и шаблоны. В проекте, над которым я сейчас работаю, я наконец написал настоящие тесты в реальной среде. Черт, как я повеселился!
Во всяком случае, я все еще чертовски новичок, когда дело касается модульного тестирования. Но теперь я наконец увидел и почувствовал все преимущества, о которых только читал раньше. И да, я немного влюбился!
Уже несколько дней я работаю над текстом о тестировании во фронтенде с примером из указанного любимого проекта. Это помогает мне больше узнать о тестировании. В то же время я пытаюсь создать простой рабочий процесс для тестирования моего кода в не тестируемой среде, чтобы я мог предлагать более стабильные решения. Мои вновь обретенные чувства к тестированию присутствуют, но я не совсем уверен, будут ли они работать в моей работе и как это делать.
Реальный мир догоняет - TIFU
Сегодня я получил сообщение об ошибке. Для простой функции Javascript я написал несколько месяцев назад. Я увидел описание билета, взглянул на код и пришел в ярость. Я сразу увидел свою ошибку, и это было глупо.
Справочная информация: сценарий должен принимать целое число и возвращать число, отформатированное в формате евро - точка в качестве разделителя тысяч, если необходимо, и «евро» в конце.
Вот как выглядел мой сценарий:
function formatSum(sum) { var sumNum = sum.toString().split(''); var sumFormatted = []; for (var i = 0; i < sumNum.length; i++) { var currNum = sumNum[i]; if (i != 0 && i % 3 == 0) { sumFormatted.push('.'); } sumFormatted.push(currNum); } if (sumFormatted.length > 0) { sumFormatted.push(' Euro'); } return sumFormatted.join(''); }
Я написал это почти 4 месяца назад и действительно не горжусь. Долгое время никто не замечал ошибку, потому что функция использовалась для форматирования целых чисел, доставляемых API, и - по совпадению - все они какое-то время были шестизначными.
- Моя первая мысль: Блин, ты дурак.
- Моя вторая мысль: Блин, ты такой дурацкий, что проверил свой скрипт только на живом сайте. Ты неправильно проверил свой чертов код!
- Моя третья мысль: Ага. Сейчас ты умнее, чем тогда.
Я и тестирование: становлюсь серьезным
Вот что я сделал, чтобы исправить ошибку: написал тесты. Сценарий не трогал, ничего не менял. Я открыл свой редактор и I. Написал. Файл. Бля. Тесты.
function assertEqual(actual, expected) { if (expected === actual) { console.info('[SUCCESS] Is ' + expected); } else { console.error('[ERROR] Expected ' + actual + ' to be ' + expected); } } function tests() { console.log('Test results'); assertEqual(formatSum(1), '1 Euro'); assertEqual(formatSum(12), '12 Euro'); assertEqual(formatSum(123), '123 Euro'); assertEqual(formatSum(1234), '1.234 Euro'); assertEqual(formatSum(12345), '12.345 Euro'); assertEqual(formatSum(123456), '123.456 Euro'); assertEqual(formatSum(1234567), '1.234.567 Euro'); }
Я провел тесты.
В сообщении об ошибке сообщалось о ложном формате с 5-значным числом, и тест воспроизвел это - 123.45 Euro
вместо 12.345 Euro
Я поправил свой сценарий.
function formatSum(sum) { var sumNum = sum.toString().split('').reverse(); var sumFormatted = []; for (var i = 0; i < sumNum.length; i++) { var currNum = sumNum[i]; if (i != 0 && i % 3 == 0) { sumFormatted.push('.'); } sumFormatted.push(currNum); } if (sumFormatted.length > 0) { sumFormatted.reverse(); sumFormatted.push(' Euro'); } return sumFormatted.join(''); }
Примечание. В остальном я его не трогал. Я не делал рефакторинга, я не делал его лучше, я не делал его красивее - я просто исправлял свою ошибку.
Я снова провела свой тест.
Все сделано. Я мог бы продвинуть это изменение. Мне потребовалось около 10 минут, чтобы проклясть меня ненадолго, написать тесты и исправить свой скрипт. Вот и все! Теперь есть тесты для моей функции. Я мог бы провести рефакторинг ist, написать новый - что угодно. Пока тестирую.
Что я узнал сегодня
- Мне очень нравится тестирование. Мы сейчас вроде как серьезно!
- Мне нужно узнать так много всего о тестировании, и я с нетерпением жду этого.
- Мне не нужно ждать, пока кто-нибудь или что-нибудь напишет тесты. Да, было бы лучше работать со 100% покрытием кода и тестировать все, но даже один небольшой тест может улучшить мой код и сделать меня лучшим программистом в долгосрочной перспективе. А эй, я перфекционист, стремлюсь к совершенствованию;)
- Тестирование не должно занимать много времени и, следовательно, дорого! Напротив: если бы я в первую очередь написал правильные тесты, второй тикет об ошибке никогда бы не появился.
- Сегодня я пишу код лучше, чем три месяца назад.
- Принятие (иногда даже написание) кода без тестов теперь похоже на вождение без ремня безопасности.