Как интерфейсное модульное тестирование превратилось для меня из увлечения в настоящую вещь

Прямо сейчас. Просто так.

Трудно обойти слово тестирование, если вы собираетесь стать профессиональным программистом. Конечно, я читал об этом и даже потратил несколько часов на написание тестов и решение искусственных задач с помощью разработки через тестирование. Но у меня не было возможности применить полученные знания в повседневной жизни кодирования. Это просто не в моей работе. Мы не пишем тесты (пока что я хочу это изменить), поэтому долгое время все, что я знал о тестировании, касалось скорее академического уровня.

Как началась интрижка

Проекты домашних животных спешат на помощь!

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

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

Уже несколько дней я работаю над текстом о тестировании во фронтенде с примером из указанного любимого проекта. Это помогает мне больше узнать о тестировании. В то же время я пытаюсь создать простой рабочий процесс для тестирования моего кода в не тестируемой среде, чтобы я мог предлагать более стабильные решения. Мои вновь обретенные чувства к тестированию присутствуют, но я не совсем уверен, будут ли они работать в моей работе и как это делать.

Реальный мир догоняет - 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% покрытием кода и тестировать все, но даже один небольшой тест может улучшить мой код и сделать меня лучшим программистом в долгосрочной перспективе. А эй, я перфекционист, стремлюсь к совершенствованию;)
  • Тестирование не должно занимать много времени и, следовательно, дорого! Напротив: если бы я в первую очередь написал правильные тесты, второй тикет об ошибке никогда бы не появился.
  • Сегодня я пишу код лучше, чем три месяца назад.
  • Принятие (иногда даже написание) кода без тестов теперь похоже на вождение без ремня безопасности.