автордың кітабын онлайн тегін оқу Тестирование JavaScript
Переводчик С. Черников
Лукас да Коста
Тестирование JavaScript. — СПб.: Питер, 2023.
ISBN 978-5-4461-3913-2
© ООО Издательство "Питер", 2023
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
В память о моей бабушке Марли Тейшейре да Коста, которая всегда делала все возможное для того, чтобы я достиг успеха.
Предисловие
«Тестирование JavaScript» — книга о тестировании, которую я хотел бы иметь у себя под рукой шесть лет назад. В то время я был стажером отдела обеспечения качества (quality assurance, QA) — приобретал свой первый опыт в индустрии программного обеспечения (ПО). К сожалению, от меня не требовалось того, что я любил больше всего: колдовать на клавиатуре. Вместо этого мне приходилось просматривать большое количество информации, нажимать кнопки, заполнять формы и следить за тем, чтобы программное обеспечение, которое мы создавали, работало как следует.
«Наверняка можно придумать что-то получше», — думал я. Поэтому и начал изобретать способы переложить всю рутинную работу на компьютеры, чтобы в освободившееся время совершенствовать свои творческие навыки.
Спустя 18 месяцев мне показалось, что с этой задачей я в основном справился. К тому времени я автоматизировал свои обязанности по обеспечению качества и превратился в разработчика ПО.
Как только я начал писать приложения, у меня появилось еще больше вопросов. Работая в сфере QA довольно продолжительное время, я не хотел зависеть от других в создании работающего программного обеспечения. Но и возвращаться к заполнению форм и щелканью по кнопкам, жертвуя драгоценным временем, отведенным для творчества, мне также не хотелось.
И снова я подумал, что «должен быть способ получше». Именно тогда я начал больше читать о тестировании. Теперь, когда мне был доступен исходный код, я обнаружил, что могу создавать программное обеспечение более уверенно и за меньшее время. Кроме того, могу освободить своих товарищей по QA для выполнения более творческой работы, вместо того чтобы перебрасывать им код для ручного тестирования.
Сложнее всего было найти нужную информацию. Иногда в интернете попадались полезные статьи, но большинство из них уже устарели или освещали какую-то одну небольшую часть процесса.
Собрать фрагментарные знания в единое целое стало для меня самым трудным делом. Всегда ли разработчикам следует писать тесты? Если да, то какие, для чего и в каких количествах? Как разработка программного обеспечения и QA дополняют друг друга?
В те годы у нас не было единого источника с ответами на все вопросы. Книги, которую я хотел прочитать, не существовало. Поэтому я решил ее написать.
И хотя по интернету разбросано много хорошего материала, большая часть из того, что мне хотелось видеть, попросту отсутствовала. Авторы библиотек тестирования, предназначенных для всеобщего использования, так и не структурировали процесс написания и применения тестов.
Эта книга объединяет в себе разные фрагменты информации в доступной форме. Здесь я собрал то, чему мне удалось научиться за годы чтения и профессиональной работы, а также то, что я открыл для себя, занимаясь поддержкой библиотек тестирования, таких как Chai и Sinon, которыми пользуются миллионы.
Я уверен, что надежные методы тестирования являются залогом успеха для любого программного проекта, так как помогают писать более качественное ПО за меньшее время и с меньшими денежными затратами. Самое главное — они освобождают нас, людей, от рутинной работы и позволяют заниматься тем, что у нас получается лучше всего — созданием программ, — а это для меня по-прежнему сродни магии.
Благодарности
Мамин будильник, как и мой, всегда срабатывает до шести утра. Не знаю, как без этого мне удалось бы написать около 500 страниц, которые вам предстоит прочитать: большая часть из них писалась, пока все еще спали. Мама научила меня ценить дисциплину и тяжелый труд, за что я ей крайне признателен.
Вместе с ней благодарности заслуживают и многие другие люди: за помощь и преподанные мне уроки.
В первую очередь я хотел бы поблагодарить свою семью, которая подбадривала меня с другого берега Атлантического океана: моего отца Эрсилиу, обещавшего всегда поддерживать меня, сестру Луизу, самого доброго человека из всех, кого я знаю, мою маму Патрицию, чей тяжелый труд я превознес в самом первом абзаце.
Помимо них, я должен поблагодарить бабушку и дедушку: они присматривали за мной, пока родители были на работе. Особое спасибо бабушке Марли Тейшейре да Коста, которой я посвятил эту книгу.
Какой бы трудной ни была наша жизнь в Бразилии, бабушка всегда старалась создать мне все условия для работы, от книг до компьютеров. В рабочие дни она готовила мне обед и разрешала ночевать в ее доме рядом с университетом, чтобы я мог получше отдохнуть и быть более внимательным на занятиях.
Помимо моей семьи, есть еще несколько людей, без которых я не смог бы закончить эту работу: Дуглас Мело и Лоренцо Гариботти показали мне, что такое настоящая дружба, а Ана Зардо — что мир больше, чем я думал; Алекс Монк, мой психотерапевт, помог сориентироваться в изменчивой жизни и совладать с моими частыми экзистенциальными кризисами; Гидеон Фаррелл когда-то пригласил меня в Лондон и продолжает доверять сейчас, помогая мне демонстрировать свои лучшие профессиональные качества.
Не могу не поблагодарить всех участников сообщества открытого кода на JavaScript за все, чему они меня научили за эти годы: Лукаса Виейру, моего приятеля по колледжу, одного из самых талантливых известных мне инженеров; Карла-Эрика Копсенга, который пригласил меня в проект Sinon.js и с которым мне посчастливилось работать в 2017 году; Кита Сиркела, предложившего мне стать основным разработчиком Chai.js, — он всегда был надежным другом и помог удержаться на плаву, когда я переехал в Англию три года назад. Я рад, что интернет связал меня с такими замечательными людьми!
Хочу сказать спасибо всем рецензентам: Серджио Арбео, Джереми Чен, Джузеппе Де Марко, Лучиану Энаке, Фостеру Хайнсу, Джампьеру Гранателле, Ли Хардингу, Джоанне Купис, Чарльзу Ламу, Бонни Малеку, Брайану Милеру, Барнаби Норману, Прабхути Пракашу, Деннису Рейлу, Сатейю Саху, Лизе Сесслер, Раулю Сайлсу, Эзре Симелоффу, Денизу Вехби, Ричарду Б. Уорду и Родни Уэйсу. Ваши советы помогли сделать эту книгу лучше!
В завершение хотел бы поблагодарить моих редакторов и сотрудников издательства Manning Хелен Стергиус, Денниса Селлингера и Шрихари Шридхарана за то, что вычитали каждую страницу и терпеливо отвечали на многочисленные вопросы, которые у меня возникали в процессе.
Obrigado.
О книге
Книга на практических примерах научит вас тестировать код на языке JavaScript и расскажет, что необходимо учитывать при принятии решения о том, какие тесты и когда следует писать.
Помимо обзора наиболее популярных средств тестирования для JavaScript и рекомендуемых методов написания тестов, в книге вы найдете информацию, как тесты разных типов дополняют друг друга и как их можно внедрить в процесс разработки. Все это поможет создать лучшее ПО за меньшее время, с меньшим количеством ошибок и с большей уверенностью в его качестве.
Кому следует прочитать эту книгу
Книга «Тестирование JavaScript» в основном написана для младших разработчиков и для инженеров в сфере программного обеспечения, которым кажется, что «должен существовать лучший способ» создания рабочего ПО, но которые еще не знают, как это сделать.
Предполагается, что читатели уже умеют писать код, однако никаких предварительных знаний о тестировании программного обеспечения не требуется.
В дополнение к практическим аспектам написания тестов в книге объясняется, почему тестирование играет важную роль и как оно влияет на разрабатываемые проекты, что позволит принимать оптимальные решения в вашем контексте.
Структура издания: дорожная карта
Эта книга состоит из 12 глав, сгруппированных в три части.
В части I объясняется, что такое автоматизированные тесты, почему они важны, на какие типы делятся и как каждый из типов влияет на проекты.
• В главе 1 речь идет о том, что такое автоматизированные тесты и какую пользу приносит их написание.
• В главе 2 перечисляются различные типы автоматизированных тестов, а также преимущества и недостатки каждого из них. Вы узнаете, на что следует обращать внимание при принятии решения о написании теста. Здесь также представлены основополагающие шаблоны проектирования, которые можно применять к тестам любого рода.
В части II приводятся конкретные примеры, чтобы вы научились писать разные типы тестов из первой части.
• Глава 3 охватывает методы тестирования, которые помогают сделать тесты максимально эффективными. Здесь вы узнаете, как группировать тесты в наборы для получения точных результатов, как писать более совершенные утверждения, чтобы отлавливать больше ошибок, и какие части вашего кода следует изолировать на время тестирования. Кроме того, в этой главе объясняется, что такое покрытие кода, как его измерить и насколько обманчивым иногда бывает данный показатель.
• В главе 4 показано, как писать тесты для серверных приложений. Здесь говорится об основных факторах, которые необходимо учитывать, чтобы сделать приложение тестируемым, обсуждается тестирование маршрутов сервера и его промежуточного слоя, а также демонстрируется, что делать с внешними зависимостями наподобие баз данных или сторонних API.
• В главе 5 представлены методы, которые должны помочь удешевить тесты для серверного кода, сделать их более быстрыми и надежными. В этой связи вы узнаете, как избавляться от непредсказуемых тестов, как выполнять тесты параллельно и как избегать их дублирования.
• В главе 6 описывается процесс тестирования стандартного клиентского приложения на JavaScript. Здесь вы узнаете, как симулировать браузерное окружение внутри своей платформы тестирования и как писать тесты, которые взаимодействуют с интерфейсом приложения, обращаются к API браузера и работают с протоколами HTTP и WebSocket.
• Глава 7 посвящена экосистеме тестирования React: в ней объясняется, как работают тесты для приложений React. Материал главы опирается на то, что вы уже усвоили в предыдущих главах. Здесь дается краткий обзор разных инструментов, которые можно использовать для тестирования приложений React, и демонстрируется, как начать писать тесты для кода на основе данной библиотеки. Дополнительно вы получите советы о том, как применять похожие методики к другим библиотекам и платформам на языке JavaScript.
• В главе 8 более подробно рассматриваются практические аспекты тестирования приложений React. Я объясняю, как тестировать компоненты, взаимодействующие друг с другом, как тестировать стили компонента, что такое тестирование снимков и как определить, следует его применять или нет. Вы также узнаете о важности приемочного тестирования на уровне компонентов и о том, как оно может помочь в создании более качественных приложений React за меньшее время.
• В главе 9 речь идет о разработке через тестирование (test-driven development, TDD). Вы узнаете, как применять этот метод разработки ПО, чем полезно его внедрение и когда его следует применять. Помимо практических аспектов TDD, мы обсудим то, как данный подход влияет на команды разработчиков и как создать условия для его успешного использования. Здесь также рассматривается связь TDD с методом под названием «разработка через поведение», который может улучшить взаимопонимание между заинтересованными сторонами и повысить качество программного обеспечения.
• В главе 10 описываются сквозные тесты на основе пользовательского интерфейса и их роль в проекте. Здесь вы узнаете, чем этот тип тестов отличается от других и как определить, когда их следует писать.
• Глава 11 посвящена практическим аспектам тестов на основе пользовательского интерфейса. Вы напишете свои первые сквозные тесты на основе пользовательского интерфейса, научитесь делать их надежными и устойчивыми к изменениям, а также узнаете, как выполнять их в разных браузерах. Кроме того, здесь объясняется, как внедрить в тесты визуальное регрессионное тестирование и чем этот новый вид тестов может быть полезен.
Часть III охватывает дополнительные методы, позволяющие усилить положительное влияние тестов на проект.
• В главе 12 описываются непрерывные интеграция и доставка и объясняется, как они могут пригодиться. Здесь также перечисляются основные факты, которые следует знать, чтобы применять эти методики в проектах.
• В главе 13 обсуждаются технологии, инструменты и методы, которые дополняют тесты. Здесь вы узнаете, как система типов помогает отлавливать ошибки и делает ваши тесты более эффективными, как обзор кода повышает его качество и какую роль в создании рабочего ПО играют документация и мониторинг. Здесь также показано, как сделать процесс отладки кода более быстрым и надежным.
Советую прочитать три первые главы последовательно и уже потом переходить к остальному тексту. В первых главах изложены основополагающие концепции тестирования и то, как они соотносятся друг с другом. Очень важно, чтобы чтение начиналось с этого материала, так как без него вы не сможете извлечь максимальную пользу из последующих глав.
Дальше можете переходить к любой интересующей вас главе, в зависимости от того, какого рода ПО вы собираетесь тестировать.
К главам 12 и 13 в идеале следует переходить только тогда, когда вы уже подготовили все необходимые тесты и хотите понять, как дополнить свои методики и инфраструктуру тестирования.
О коде
Книга содержит множество практических примеров. Все они доступны онлайн в репозитории книги на GitHub, который читатели могут найти по адресу https://github.com/lucasfcosta/testing-javascript-applications. В репозитории примеры разделены по главам — у каждой главы своя папка. Внутри папок примеры сгруппированы по разделам.
Внутристрочный код и отдельные листинги отформатированы с использованием такого моноширинного шрифта, чтобы его можно было отличить от обычного текста. Если код изменился по сравнению с предыдущими шагами в той же главе (например, при появлении чего-то нового в имеющейся строчке кода), он выделен жирным шрифтом.
Зачастую оригинальный исходный код переформатирован: мы добавили переводы строк и переделали отступы, чтобы лучше использовать место на страницах печатного издания. Кроме того, когда код описывается в тексте, из него обычно убираются комментарии. Многие листинги содержат примечания, акцентирующие внимание на важных идеях.
Я предусмотрел примечания для всех существенных примеров, чтобы выделить важные участки и объяснить читателям, что делает каждый фрагмент кода.
Коды представленных здесь примеров также доступны для загрузки на сайте Manning по адресу www.manning.com/books/testing-javascript-applications.
Системные требования
Все примеры кода в этой книге были написаны и проверены в macOS Catalina. Тем не менее они должны работать на любых платформах, включая Linux и Windows.
Единственные изменения, которые могут потребоваться, связаны с тем, как устанавливаются переменные окружения в вашей конкретной командной оболочке и операционной системе. Например, если вы используете PowerShell на компьютере с Windows, вы не можете установить значение переменной окружения, указав ИМЯ_ПЕРЕМЕННОЙ=значение перед командой.
Для выполнения примеров на вашем компьютере должны быть установлены Node.js и NPM. Эти два пакета обычно поставляются вместе. При установке Node.js вы, как правило, получаете NPM в придачу. Чтобы загрузить и установить оба программных компонента, можете воспользоваться инструкциями на странице https://nodejs.org/ru/download/. При создании примеров использовались Node.js 12.18 и NPM 6.14.
От издательства
Ваши замечания, предложения, вопросы отправляйте по адресу comp@piter.com (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.
Об авторе
Лукас да Коста — разработчик программного обеспечения, автор статей и известный спикер. Являясь активным участником опенсорс-сообщества, он входит в число основных разработчиков двух популярнейших библиотек тестирования для JavaScript: Chai и Sinon. Кроме того, он внес свой вклад в развитие множества других проектов, включая Jest и NodeSchool.
За последние несколько лет Лукас выступал на многочисленных конференциях по разработке ПО более чем в десяти странах.
Его презентации переведены энтузиастами на многие языки, включая русский, китайский, французский, португальский и испанский, и используются по всему миру в качестве справочного пособия во множестве курсов по программированию.
Лукасу нравятся книги, красивый код, командная строка и Vim. На самом деле его любовь к Vim настолько сильна, что у него на щиколотке есть татуировка с командой :w.
Иллюстрация на обложке
Изображение на обложке называется Bourgeois de Paris («Буржуа Парижа»). Иллюстрация позаимствована из книги Costumes civils de actuals de toue les peuples connus («Гражданские костюмы всех известных народов мира»), опубликованной во Франции в 1788 году, — коллекции костюмов Жака Грассе де Сен-Совера (1757—1810). Каждая гравюра тщательно нарисована и раскрашена от руки. Богатое разнообразие этой коллекции служит ярким напоминанием о том, насколько разнились культуры городков и регионов мира всего 200 лет назад. Изолированные друг от друга, люди разговаривали на разных диалектах и языках. Будь то городские улицы или сельская местность, место жительства человека и его ремесло вместе с положением в обществе легко можно было определить по одежде.
С тех пор мы начали одеваться по-другому, а региональные отличия, которые в то время были такими значимыми, постепенно сошли на нет. В наши дни зачастую бывает сложно отличить друг от друга жителей разных континентов, не говоря уже о разных городах, регионах или странах. Возможно, взамен культурного многообразия мы получили более разнообразную личную жизнь и уж точно более разнообразную и динамичную ее технологическую составляющую.
В то время как большинство компьютерных изданий сложно отличить друг от друга, компания Manning выбирает для своих книг обложки, основанные на богатом региональном разнообразии, которое Грассе де Сен-Совер воплотил в своих иллюстрациях два столетия назад. Это ода находчивости и инициативности современной компьютерной индустрии.
Часть I. Тестирование приложений на JavaScript
Что бы вы ни разрабатывали — сайт для кондитерской своего дяди или платформу для торговли ценными бумагами, самой важной характеристикой вашего кода является его работоспособность. Клиенты дяди, несомненно, будут активнее заказывать его творожные десерты, если вы создадите понятный и красиво оформленный сайт. Точно так же брокеры на Уолл-стрит смогут больше заработать, если у вашей платформы будут высокая скорость и быстрая реакция. Тем не менее пользователи попросту проигнорируют все ваши усилия, направленные на производительность и внешний вид, если код окажется ненадежным.
Если программа не работает, то неважно, насколько она быстрая и красивая. В конечном счете детям хочется больше сладкого, а брокерам хочется работать с бˆольшим количеством акций. Ни те ни другие не хотят «больше программного обеспечения».
В части I объясняется, как автоматизированные тесты помогают давать людям то, чего они хотят: программное обеспечение, которое работает. Кроме того, здесь вы научитесь доставлять ПО с большей надежностью и за меньшее время.
В главе 1 я расскажу о том, что такое автоматизированные тесты и чем они могут помочь вам и вашей команде.
В главе 2 представлено несколько типов автоматизированных тестов. В ней вы узнаете, когда следует использовать тот или иной тип тестирования и какие у каждого из типов преимущества и недостатки. Вы также изучите основополагающие методы, которые будут применяться на протяжении всей книги.
