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

… И вы, вероятно, можете придумать миллион «но» относительно того, почему так много людей (включая меня) отложили тестирование.

Это скучно. На это уходит много времени. Я сам проверю. Список можно продолжать. Однако для меня причина отсрочки тестирования была проста… ЕСТЬ ТАК МНОГО ДРУГОГО, ЧЕМ Я ХОТЕЛ УЧИТЬСЯ ПЕРВЫМ!

Однако, потратив первые три недели на изучение тонкостей тестирования, позвольте мне НАСТОЯТЕЛЬНО порекомендовать (без спроса) не предпринимать никаких новых приключений в программировании до тех пор, пока вы не поймете концов / выходов тестирования.

Почему я люблю тестирование

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

Пример этого произошел со мной на днях. У меня было полностью рабочее приложение, в котором не было ошибок (о которых я знаю)! Однако после написания некоторых тестов для покрытия приложения я обнаружил, что «да», мой код работает, но «нет», он работает не так, как я на самом деле думал.

class SearchForm extends Component {
 handleClick() {
  this.setState((prevState) => !prevState.toggle))
    const filteredResults = [...arr].sort((a,b) => {
      return this.state.toggle ? (a < b) : (b > a)
    }
 }
  ...<button onClick={this.handleClick}>Search</button>
}

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

В моем реальном примере я проверил его в браузере и увидел, что он работает так, как я хотел. Однако когда я пошел писать тестовый пример для функциональности, все не удалось. * Подсказка: это произошло не потому, что я что-то неправильно реализовал в своем тестовом примере или даже в своем коде. Проблема заключалась исключительно в непонимании того, что происходит с моим кодом. БЛАГОДАРЯ ТЕСТИРОВАНИЮ, Я ОТКРЫЛ ИСТИНУ, И ПОНИМАТЬ МОЙ КОД НАМНОГО ЛЕГЧЕ ДЛЯ РАБОТЫ С ДВИЖЕНИЕМ ВПЕРЕД.

Вот и был мой момент AH. Мое состояние переключения действительно обновлялось правильно. Однако состояние не обновляется до повторного рендеринга компонента. В приведенном выше примере sort () запускается ДО фактического повторного рендеринга состояния; поэтому состояние переключения, которое проверяла моя функция сортировки, было полной противоположностью тому, что я думал. Итак, да, код работал. НО ПО ПОЛНОЙ ПРОТИВОПОЛОЖНОЙ ПРИЧИНЕ Я ДУМАЛ. После того, как мой тест помог мне обнаружить проблему, я смог реорганизовать свой код таким образом, чтобы он имел больше смысла, и теперь, двигаясь вперед, я лучше понимаю этот компонент (и состояние настройки в целом). Вот мой отредактированный код ...

class SearchForm extends Component {
 handleClick() {
 
    const filteredResults = [...arr].sort((a,b) => {
      return this.state.toggle ? (a > b) : (b < a)
    }
  }  
  this.setState((prevState) => !prevState.toggle))
}

Я просто переключил операторы больше / меньше, а затем установил состояние после метода сортировки. Магия!

Во-вторых, умение хорошо тестировать поможет вам лучше организовать и структурировать код. Во-первых, тестирование не всегда легко. Беспорядочная база кода иногда становится практически невозможной для успешного тестирования. В подобной ситуации, возможно, пора остановиться и подумать: «Может быть, есть лучший способ, которым я должен писать свой код, чем тот, который я делаю». Однако помимо этого тестирование заставляет вас замедлиться и ДУМАТЬ о том, чего вы на самом деле пытаетесь достичь. Когда все сделано правильно, почти невозможно думать или слишком далеко опередить себя. В долгосрочной перспективе это отличный способ убедиться, что ваш код остается чистым и организованным.

Теперь о том, почему я НЕНАВИЖУ тестирование

В каком-то смысле обучение эффективному тестированию заставляет вас «заново учиться» тому, как вы кодируете. Поскольку тестирование иногда может стать трудным, вы обнаружите, что пишете код определенным образом просто потому, что так будет легче тестировать. Я не обязательно говорю, что код нужно писать худшим образом, но иногда просто по-другому. По этой причине я пришел на тестирование HATE.

Да, БОЛЬШАЯ часть этого просто потому, что я изучаю основы тестирования и все еще сильно борюсь с областями. Однако я не могу сказать вам, сколько раз я реорганизовывал «рабочий» код просто потому, что не мог понять, как его протестировать так, как я его написал.

Однако, опять же, именно поэтому я рекомендую всем, кто учится программировать, НЕМЕДЛЕННО начать обучение, чтобы научиться тестировать. Поскольку тестирование заставит вас по-другому думать о своем коде и о том, как именно его структурировать, имеет смысл начать изучение процесса раньше, чем позже.

Заключение

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