Чем больше я программирую, тем больше убеждаюсь, что тестирование — один из самых полезных инструментов, имеющихся в распоряжении программистов. Я не знаю никого, кто бы тестировал правильно, кто бы с этим не согласился. Автоматизированное тестирование экономит время, деньги, уменьшает количество ошибок, помогает в проектировании, помогает рассуждать о программном обеспечении, позволяет более безопасно устранить технический долг и даже служит формальной спецификацией требований к программному обеспечению.
Что такое тест?
Представьте, что вы только что написали кусок кода… Как вы узнаете, что он работает?
Откуда вы знаете, что он работает? Откуда вы знаете, что он делает то, что от него ожидают?
Большинство людей ответят, что знают, потому что проверяли это. Потому что они открыли браузер, перешли в определенный раздел приложения, заполнили ввод, нажали на кнопку и обнаружили, что приложение правильно реагирует на это взаимодействие пользователя.
Наверняка вы сами ставили console.log
, чтобы как-то проверить, что функция делает то, что вы от нее ожидаете. Особенно если функция не имеет связанного с ней графического интерфейса, например, написание функции, которая складывает два числа.
function sum(a, b) {
return a + b
}
В таких случаях большинство разработчиков в конечном итоге используют консоль для проверки правильности работы функции:
console.log( sum( 1, 2) ) // 3
console.log( sum( 2, 2) ) // 4
Давайте проанализируем эти процессы… как в первом, где разработчик вручную тестирует приложение из браузера, так и в логах консоли повторяются некоторые общие паттерны:
- Определяется функциональность, подлежащая тестированию.
- Программное обеспечение, содержащее эту функциональность, выполняется в контролируемых условиях.
- Убедитесь, что полученный результат равен ожидаемому.
Я уверен, что не один из вас сможет определить такое поведение, если да, то поздравляю, вы уже тестируете, следующий шаг — преобразовать эти ручные тесты в автоматические.
Автоматические тесты
Вопрос на миллион долларов заключается в следующем: можем ли мы написать программное обеспечение, которое проверяет правильность работы другого программного обеспечения?
Поначалу может показаться безумием писать код, который автоматически тестирует другой код. Однако по мере роста программного обеспечения преимущества автоматического тестирования становятся очевидными:
- Они помогают легко обнаружить ошибки.
- Они служат в качестве документации.
- Они помогают нам рассуждать о коде и улучшать дизайн.
Тестовые бегуны
Предположим, что мы убеждены в необходимости проведения автоматических тестов. Первое, что нам понадобится, это так называемый «бегунок тестов». Если говорить простым языком, то бегунок тестов — это инструмент, который позволяет нам определять и выполнять наши автоматические тесты. В мире фронтенда наиболее известными являются jest и mocha.
Эти фреймворки предлагают, среди прочего, функцию test, которая позволяет нам называть, определять и выполнять тесты простым способом, или функцию expect для проверки того, что полученные значения соответствуют ожидаемым требованиям.
test('LA DESCRIPCION DEL TEST VA AQUI', () => {
// La implementación del test va aquí
});
Тестовые прогоны также помогают нам выполнять тесты и генерировать отчет о том, сколько тестов дали ожидаемый результат и сколько из них провалились.
Простой пример: функция replace
Строки JavaScript наследуют от своего прототипа функцию replace, которая принимает два параметра: строку для замены и строку, которая ее заменит.
Как бы вы его проверили?
Ответ всегда один и тот же: делайте то же самое, что вы бы делали, если бы вам пришлось тестировать вручную.
В этом случае вы, вероятно, определите строку, вызовете метод replace и проверите (через console.log), что итоговая строка соответствует ожидаемой. В случае с автоматическими тестами процесс аналогичен:
// Utilizamos la funcion "test" para dar nombre a la prueba e implementarla
test('should replace a string with the new given string', () => {
// Creamos un string conocido para ejecutar nuestra prueba
const template = 'hello world';
// Ejecutamos la función que queremos probar pasándole unos parámetros conocidos
const actual = template.replace('world', 'testing');
// Comprobamos que el resultado es el esperado
expect(actual).toEqual('hello testing');
});
и все! Мы написали наш первый тест.
Очевидно, что это лишь небольшое введение, но суть всегда одна и та же — попытаться автоматизировать процесс, который мы бы выполняли для тестирования функции вручную.
Выводы
- Неосознанно программисты проводят тесты вручную.
- Эти тесты можно автоматизировать.
- Автоматизированное тестирование — один из лучших инструментов на сегодняшний день.