пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ Asterisk
Слишком длинный поисковый запрос.
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
Любое крупное приложение должно сопровождаться несколькими наборами тестов, с помощью которых можно проверить его стабильность и производительность.
Существует большое количество различных тестов, каждый из которых имеет свое назначение и охватывает определенные аспекты приложения. Именно поэтому, когда вы тестируете свое приложение, вы должны убедиться, что ваш набор тестов сбалансирован и охватывает все аспекты.
Однако есть один тип тестов, который разработчики часто предпочитают другим, и поэтому им часто злоупотребляют. Этот «сквозное тестирование» (E2E - end-to-end testing).
Что такое сквозное тестирование?
Для тех, кто только начал штурмовать мир тестирования программного обеспечения, E2E-тестирование - это проверка вашего приложения от начала до конца вместе со всеми его зависимостями.
При проведении E2E-тестировании вы создаете среду, которая будет идентична той, которую будут использовать реальные пользователи приложения. А затем вы тестируете все действия, которые могут выполнять пользователи в вашем приложении.
С помощью сквозного тестирования вы проверяете весь рабочий поток целиком, например, вход на веб-сайт или покупку товара в интернет-магазине.
Если вы будете злоупотреблять E2Е-тестирование, то вы перевернете пирамиду тестирования. Я в такой ситуации был. В одном из своих проектов я планировал охватить большую часть приложения Е2Е-тестами или, что еще хуже, воспользоваться лишь один Е2Е-тест. К счастью, я передумал. Так вот, теперь я хочу поделиться с вами тем, что заставило меня передумать.
Почему не нужно пренебрегать пирамидой тестирования?
Хаотично написанные тесты сначала могут показаться вполне пригодными, но в конце концов они таковыми не окажутся.
Мы пишем тесты для того, чтобы выиграть больше времени, и мы делаем это с помощью методы и средства автоматизации тестирования. Конечно, можно было бы самостоятельно открывать приложения и тестировать их вручную. Если бы это нужно было сделать однократно, то проблем не было бы. Но так бывает крайне редко.
Программное обеспечение постоянно обновляется. Поэтому необходимо проводить регулярные тестирования для того, чтобы оставаться в курсе последних событий. Вы, конечно, можете ежедневно запускать все тесты вручную при каждом обновлении приложения. Но если вы один раз напишите набор тестов, а затем будете его запускать каждый раз, когда нужно будет протестировать какой-то из аспектов приложения, то вы сэкономите много времени.
У каждого теста есть свое назначение. Если вы будете использовать их не по назначению, то они могут вам больше навредить, чем помочь. Это связано с тем, что в итоге вы потратите больше времени на то, чтобы написать эти тесты, и на их сопровождение, чем на разработку самого приложения. Иными словами, вы останетесь без одного из самых больших преимуществ автоматизированного тестирования.
Хорошее начало – придерживаться пирамиды тестирования. Она поможет вам определить правильный баланс в тестированиях. Эта пирамида является отраслевым стандартом и используется с середины 2000-х годов по сей день, так как все еще считается эффективной.
Значит ли это, что разработчики никогда не пренебрегают этой пирамидой? Не совсем. Иногда пирамида бывает перевернутой, где большую часть тестов составляют Е2Е, а иногда она бывает похожа на песочные часы, где очень много юнит- и Е2Е-тестов, но с очень мало интеграционных тестов.
Три уровня пирамиды тестирования
Как правило, пирамида тестирования имеет три уровня: юнит-тесты, интеграционные тесты и сквозные тесты.
Юнит-тесты
Юнит-тесты, или модульные тесты, делают акцент на самых маленьких единицах кода, таких как функции и классы.
Они короткие и не зависят ни от каких-либо внешних пакетов, библиотек и классов. В противном случае, в ход идет имитированная реализация.
Если юнит-тест дает сбой, то найти причину проблемы не так сложно. Они также имеют небольшой диапазон тестирования, что делает их простыми в написании, быстрыми в работе и легкими в сопровождении.
Интеграционные тесты
Интеграционные тесты делают акцент на взаимодействии между двумя отдельными объектами. Как правило, они работают медленнее, потому что они требуют более серьезной настройки.
Если интеграционные тесты проваливаются, то найти проблему немного сложнее, так как диапазон ошибок больше.
Они также более сложные в написании и сопровождении, в основном потому, что они требуют более продвинутое имитирование и расширенную область тестирования.
Сквозные тесты
И наконец, сквозные тесты, или E2E-тесты. Они делают акцент на рабочих потоках, от самых простых до самых сложных. Эти тесты можно рассматривать как многоэтапные интеграционные тесты.
Они самые медленные, потому что они подразумевают сборку, развертывание, запуск браузера и выполнение действий внутри приложения.
Если сквозные тесты проваливаются, то найти проблему часто бывает очень сложно, потому что диапазон ошибок увеличивается до всего приложения. В принципе, по пути могло сломаться все что угодно.
Это, безоговорочно, самый сложный тип тестов для написания и сопровождения (из трех типов, которые рассмотрели здесь) из-за огромного диапазона тестирования и из-за того, что они охватывают все приложение.
Надеюсь, теперь вы понимаете, почему пирамида тестирования была спроектирована именно таким образом. Снизу-вверх каждый уровень тестирования говорит о снижении скорости и увеличении диапазона и сложности и усложнении сопровождения.
Именно поэтому важно не забывать о том, что E2E-тестирование не может полностью заменить другие методы – оно лишь предназначено для расширения их возможностей. Назначение Е2Е-тестирования четко определено, и тесты не должны выходить за его границы.
В идеале тесты должны выявлять ошибки настолько близко к корню пирамиды, насколько возможно. Е2Е-тест предназначен для проверки кнопок, форм, изменений, ссылок, внешних процессов и вообще всех функций рабочего потока.
Тестирование с кодом VS codeless-тестирование
В целом, существует два типа тестирования: ручное и автоматизированное тестирование. Это значит, что мы можем проводить тестирования либо вручную, либо с помощью сценариев.
Чаще используют именно второй метод. Но и автоматизированное тестирование можно разделить на две части: тестирование с кодом и codeless-тестирование.
Тестирование с кодом
Когда вы проводите тестирование с кодом, вы используете фреймворки, которые могут автоматизировать браузеры. Один из самых популярных инструментов – это Selenium, но я больше предпочитаю использовать в своих проектах Cypress (только для JavaScript). И тем не менее, работают они практически одинаково.
По сути, с помощью таких инструментов вы моделируете веб-браузеры и даете им указания для выполнения различные действия в вашем целевом приложении. После чего вы проверяете, отреагировало ли ваше приложение на соответствующие действия.
Это простой пример имитации, взятый из документации Cypress. Я привел его, чтобы вы могли лучше понять, как работает этот инструмент:
Давайте посмотрим, что тут происходит:
Допустим, пользователь посещает сайт
https://example.cypress.io
Когда она нажимает на ссылку с пометкой type, URL-адрес должен добавить /commands/actions
Если он вводит «fake@email.com» в поле ввода .action-email, тогда ввод .action-email принимает значение «fake@email.com».
Codeless-тестирование
В ситуации с codeless-тестированием вы используете фреймворки на базе искусственного интеллекта, которые запоминают ваши действия. И основываясь на некоторой дополнительной информации, они проверяют, отвечает ли ваше целевое приложение на действия должным образом.
Эти инструменты часто выглядят как малокодовые платформы для разработки, где вы перемещаете различные панели. Один из таких инструментов – TestCraft, codeless-решение, разработанное на платформе Selenium.
Как правило, эти инструменты стоят дороже из-за того, то такие функции, как создание, сопровождение и запуск тестов выполняются с помощью простого перемещения панелей, а также из-за того, что для проведения тесто не нужно уметь писать программный код. Но я упомянул здесь про TestCraft, потому что у них есть бесплатная версия, которая включает в себя практически все.
Конечно, если речь идет о скорости и деньгах, то codeless-решение может оказаться вам больше по душе, но они все еще достаточно новые. Поэтому они пока не могут иметь ту сложность наборов тестов, которой можно достичь, написав код самостоятельно.
Если в целевом приложении есть очень сложные рабочие потоки, которые включают в себя несколько подвижных частей, то вам больше подойдет классический вариант тестирования. Но если сложных потоков нет, то вы можете воспользоваться codeless-решением.
Подведение итогов
Написание тестов – обязательное требование для любого приложения. Если вы будете следовать всем правилам и писать наборы тестов исходя из их типов, то они только улучшат ваше приложение, а также их будет довольно просто написать и сопровождать.
Использовать сквозные тесты, как и любые другие, следует только для того, для чего они предназначены. Они предназначены для тестирования рабочего потока приложения от начала и до конца путем воспроизведения реальных пользовательских сценариев. Но помните, что большинство ошибок следует выявлять как можно ближе к корню.
Вот оно – слово, которое ненавидят все разработчики, -
конфликт
. Если вы работаете с Git (или с какими-то другими системами контроля версий), то вам никуда не деться от случайных конфликтов слияния.
В процессе общения с разработчиками я часто слышу о том, что тема конфликтов слияния вызывает у них чувство тревоги и беспокойства.
Обстоятельства разрешения конфликтов часто остаются тайными и загадочными. Дело в том, что вы попадаете в не очень хорошую ситуацию и не знаете, как из нее выйти, не усугубляя ее.
Конфликты слияния – это неотъемлемая часть жизни любого разработчика, и поэтому совсем не обязательно беспокоится по этому поводу.
Этой статьей я хочу внести некоторую ясность в эту тему: как и когда возникают конфликты, что они на самом деле из себя представляют и как их можно разрешать.
Когда вы разберетесь во всем этом, вы будете чувствовать себя более спокойно и уверенно.
Как и когда возникают конфликты
Название говорит само за себя – «конфликты слияния» возникают, когда вы объединяете коммиты из разных источников.
Учтите, что под «объединением» я имею в виду не только «слияние веток». Объединение может происходить при обычном или интерактивном перемещении, при выполнении операции копирования или извлечения изменений, или даже при повторном применении команды stash.
Все эти действия выполняют своего рода объединение коммитов, и после любого из них могут возникнуть конфликты слияния.
Конечно, это происходит не всегда (и слава Богу!). В идеале, вы должны сталкиваться с такими ситуациями крайне редко.
Но когда именно возникают конфликты слияния?
На самом деле, самое большое преимущество Git заключается именно в его возможностях слияния. В большинстве случаев вы можете спокойно выполнять слияния веток, поскольку Git, как правило, может сам разрешить все возникающие конфликты.
Но иногда могут возникать ситуации, когда вы внесли слишком противоречивые изменения. В таком случае Git уже не может самостоятельно определить, что правильно, а что нет. Такие ситуации требуют человеческого вмешательства.
Настоящая классика: вы внесли изменения в одну и ту же строку в двух разных коммитов в двух разных ветках, и Git просто не знает, какое из них нужно оставить.
Бывают и другие ситуации, когда вы, например, изменили файл в одной ветке, но при этом удалили его в другой. Но такие ситуации встречаются намного реже.
Настольный графический интерфейс Git «Tower» может отлично визуализировать такие ситуации:
Как узнать, когда произошел конфликт
Можете быть спокойны! Если возникнет конфликт, Git обязательно даст вам об этом знать.
Для начала Git сообщит вам об этом прямо во время «происшествия», например, когда он не сможет выполнить слияние или переместить коммиты из-за конфликта.
$ git merge develop
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
CONFLICT (modify/delete): error.html deleted in HEAD and modified in develop. Version develop of error.html left in tree.
Automatic merge failed; fix conflicts and then commit the result.
Как вы видите, я попытался выполнить слияние, и тем самым создал конфликт. Но Git очень четко и быстро сообщил мне о проблеме:
Конфликт возник в файле «index.html»
Еще один конфликт возник в файле «error.html»
И, как результат, из-за всех этих конфликтов операция слияния не смогла быть выполнена
В таком случае мы должны покопаться в коде самостоятельно и понять, что нам нужно сделать.
Это, конечно, маловероятно, но, если вы вдруг пропустите эти предупреждающие сообщения, Git будет информировать вас об этом каждый раз, когда вы будете запускать команду
git status
.
$ git status
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add/rm ..." as appropriate to mark resolution)
deleted by us: error.html
both modified: index.html
Иными словами, вам не нужно беспокоиться о том, что вы пропустите конфликт. Git сделает все, что вы просто не сможете пройти мимо.
Как отменить конфликт в Git и начать сначала
Конфликты слияния довольно настойчивы. И у них есть на это все основания. Прежде чем продолжить свою работу, вы должны разрешить все конфликты.
Игнорировать их, конечно, нельзя, но «разрешить конфликт слияния» не всегда подразумевает то, что их надо именно разрешить. Вы можете их просто
отменить
!
Возможно, мне стоит это повторить:
вы всегда можете просто отменить конфликт слияния и вернуться к предыдущему состоянию.
Это возможно даже если вы уже начали разрешать этот конфликт, но зашли в тупик.
В таких ситуациях всегда полезно помнить о том, что вы можете начать все сначала и вернуться к тому состоянию, когда конфликта еще не было.
Для этого у большинства команд есть специальный флаг
--abort
, например,
git merge –abort
и
git rebase --abort
:
$ git merge --abort
$ git status
On branch main
nothing to commit, working tree clean
Это должно вселить в вас уверенность в том, что вы просто не можете напортачить. Вы всегда можете остановиться, вернуться к предыдущему состоянию и начать сначала.
Как на самом деле выглядят конфликты в Git
Теперь, когда мы знаем, что мы не можем ничего «сломать», давайте посмотрим на конфликт изнутри. Это поможет нам раскрыть тайну этих маленьких негодников, потерять к ним уважение и обрести уверенность в своих силах.
Давайте в качестве примера возьмем содержимое файла «index.html» (на данный момент это конфликтующий файл):
Git оказался довольно любезным и выделил проблемную область вот в такие вот скобки:
<<<<<<< HEAD
…
>>>>>>> [other/branch/name]
. То, что мы видим сразу после первой скобки, возникло в нашей текущей ветке. Здесь строка
=======
разделяет два конфликтующих изменения.
Как разрешить конфликт в Git
Мы, как разработчики, должны все это исправить, то есть после того, как мы все сделаем, файл должен выглядеть именно так, как мы хотим.
Не исключено, что для этого вам придется поговорить с вашим товарищем по команде, который написал эти «другие» изменения, чтобы решить, какой код все же правильный. Может быть ваш, может его, а может вы придете к выводу, что нужно объединить и то, и другое.
Весь этот процесс не требует никакого волшебства. Вы можете просто открыть текстовый редактор или IDE и начать вносить изменения.
Однако вы можете счесть такой подход не самым эффективным. Тогда вы можете сэкономить свое время и усилия и воспользоваться специальными инструментами:
Инструменты графического пользовательского интерфейса (GUI) Git
. Некоторые GUI могут оказаться полезными при разрешении конфликтов. Например, графический интерфейс Tower предлагает функцию под названием «Conflict Wizard», которая помогает визуализировать сложившуюся ситуацию и разрешить ее:
Специальные инструменты слияния
. В случае более сложных конфликтов полезно будет иметь под рукой специальный инструмент под названием «Diff & Merge Tool». Вы можете его настроить с помощью команды «git config» (более подробную информацию вы можете найти в документации вашего инструмента). Когда возникнет конфликт, вы можете его вызвать, просто набрав команду
git mergetool
. Ниже я привел пример. Это Koleidoscope для macOS:
После того, как вы разрешите конфликт и очистите файл (любым из приведенных способов), вы должны зафиксировать это в Git, как и любое другое изменение:
Когда мы разрешаем конфликт для какого-то (ранее) конфликтующего файла, мы должны ввести команду
git add .
После того, как мы разрешим все конфликты и добавим все необходимое в промежуточную область, мы должны завершить процесс разрешения, то есть зафиксировать все наши изменения.
Как стать более уверенным и продуктивным
Много лет назад, когда я только начинал пользоваться системой контроля версий, я психовал с каждого возникающего конфликта слияния. Я думал, что «сломал» все окончательно.
Только после того, как я нашел время и разобрался, что же у этих конфликтов «под капотом», я научился уверенно и эффективно разрешать их.
То же самое у меня было с ошибками: только после того, как я научился исправлять ошибки с помощью Git, я смог обрести уверенность в своих силах и стать более продуктивным в своей работе.
Онлайн-обучение стало популярным инструментом для того, чтобы освоить новую профессию. Но далеко не каждый курс оправдывает свои ожидания. Чтобы обучение приносило максимум результата, важно подходить к нему осознанно. Собрали для вас советы, которые помогут извлечь реальную пользу из образовательных программ и сделать обучение эффективным.
Сформулируйте чёткую цель
Перед началом обучения ответьте на вопросы: чего вы хотите достичь и как это поможет вам в карьере или жизни? Конкретная цель (например, устроиться на работу в IT или освоить основы дизайна) помогает сосредоточиться на ключевых навыках, а не на общем теоретическом материале. Подход SMART (конкретные, измеримые, достижимые цели) может быть полезным инструментом для определения задач.
Определите свой стиль обучения
Каждый человек усваивает информацию по-разному, и понимание своего стиля обучения может значительно упростить и ускорить процесс обучения. Вот несколько основных стилей, которые помогут вам выбрать подходящий подход:
Если вы относитесь к визуалам, то лучше воспринимаете информацию через зрительные образы. Схемы, графики, видеоуроки и инфографика помогут вам разобраться даже в сложных темах. Например, при изучении программирования вам может быть полезно использовать визуальные среды разработки или смотреть видеоуроки с пошаговым объяснением кода.
Для аудиалов важно слышать информацию. Подкасты, записи лекций или обсуждения с коллегами — идеальный способ запоминать новое. Например, вы можете слушать подкасты о новых технологиях или аудиокурсы по языкам программирования во время дороги.
Кинестетики лучше усваивают материал через практику и активное участие. Интерактивные задания, выполнение практических проектов или участие в хакатонах помогут вам учиться быстрее. Например, создавая простой веб-приложение или решая задачи на платформе вроде LeetCode, вы одновременно тренируете навыки и запоминаете материал.
Уважайте свои силы и интерес
Обучение — это марафон. Переутомление снижает продуктивность и мотивацию. Если вы чувствуете усталость, делайте перерывы. Отдыхайте активно. Например, можно подключить спорт. Движение улучшает кровообращение, что особенно важно для тех, кто много времени проводит за компьютером.
Не стоит заставлять себя изучать материалы, которые вам не подходят. Если книга или курс вызывают скуку, найдите другой источник, даже если они рекомендованы многими.
Учитесь по спирали
Процесс обучения всегда идет от общего к частному. Сначала нужно сформировать общее представление о предмете, затем углубляться в детали.
На начальном этапе подойдут книги и курсы, объясняющие ключевые концепции без сложной информации. Например, если вы изучаете программирование, начните с основ синтаксиса, базовых конструкций языка и принципов работы кода. Курсы или книги, объясняющие ключевые концепции вроде переменных, циклов, функций и основ работы с файлами, будут отличным выбором. Для изучения DevOps можно начать с понимания основ контейнеризации и работы с облачными сервисами.
На среднем этапе переходите к изучению базовых инструментов и алгоритмов, которые применяются в вашей области. Например, в веб-разработке это могут быть основы работы с базами данных, базовые шаблоны проектирования и использование API. Если вы изучаете машинное обучение, сосредоточьтесь на классических алгоритмах, таких как линейная регрессия или деревья решений, и их ключевых принципах, не углубляясь пока в сложную математику.
На продвинутом этапе займитесь разбором тонкостей и сложных концепций. Для разработчиков это может включать оптимизацию производительности кода, освоение фреймворков, глубокое понимание сетевых протоколов. В области искусственного интеллекта начните углубляться в нейронные сети, градиентный спуск и сложные архитектуры моделей.
Начинать сразу с технически сложных курсов или книг, насыщенных узкоспециализированной информацией, неэффективно. Это отнимает много сил, но дает мало знаний.
Делайте заметки
Заводите конспект: записывайте основные мысли, создавайте диаграммы и схемы. Можно использовать разные программы от заметок на телефоне до Notion или OneNote для систематизации знаний.
Установите реалистичные цели и сроки
Разбейте учебный материал на небольшие этапы с конкретными результатами. Например:
Неделя 1: освоить основы.
Неделя 2: выполнить первый проект.
Регулярно отслеживайте прогресс, чтобы видеть, как вы продвигаетесь к цели.
Используйте свои сильные стороны
Поняв, в чем вы уже успешны, свяжите это с изучаемым материалом. Например, если вы хорошо работаете с текстами, начните с теоретических блоков. Это повысит уверенность в себе. Не стоит сразу погружаться в сложные технические материалы. Это может быть тяжело и малоэффективно.
Ищите альтернативы
Добавьте в свое обучение поиск новых методов и инструментов. Например, если вы изучаете веб-разработку с помощью видеокурсов и чувствуете, что прогресс замедлился, попробуйте сменить формат. Как идея — можно работать с учебными проектами на GitHub. Это может дать свежий взгляд на привычные задачи.
Учите английский
Для специалистов в ИТ знание английского — необходимость. Большинство актуальных материалов, включая исследования и курсы, изначально публикуются на английском.
Чтобы развить навыки, начинайте читать англоязычные тексты по своей теме, даже если поначалу это будет трудно. Согласны, это будет медленно и тяжело, но со временем скорость будет расти. Используйте разные приложения, чтобы запоминать ключевых слов.
Продолжайте учиться и расширяйте горизонты
Онлайн-курсы — это только часть саморазвития. Продолжайте изучать новые темы, чтобы оставаться конкурентоспособным и любознательным. И заглядывайте к нам в Академию, чтобы почитать новые статьи :)
