ar
Feedback
Грамота от Кузьмича

Грамота от Кузьмича

الذهاب إلى القناة على Telegram

🍵Java. 🤖Автотестирование. 😆Мемасы. Я - Александр Кузьмичев. Просто и с юмором рассказываю об IT, а еще веду свою школу "Java + Автотестирование" Ссылки на все соц. сети: https://devray.taplink.ws/ TG: @NeonAether

إظهار المزيد
218
المشتركون
لا توجد بيانات24 ساعات
لا توجد بيانات7 أيام
لا توجد بيانات30 أيام
أرشيف المشاركات
Ударим некачественным кодом по психике ревьюеров!💪🏻 #мемасы
Ударим некачественным кодом по психике ревьюеров!💪🏻 #мемасы

JSON-документы можно встретить при тестировании почти любого слоя приложения - и в юнитах, и в API, и в UI. Их дофига и они в
JSON-документы можно встретить при тестировании почти любого слоя приложения - и в юнитах, и в API, и в UI. Их дофига и они вездесущи. Так как же работать с JSON-ами не обжигая руки и пятую точку?🔥 Делюсь парочкой полезных инструментов. 📊 1. Визуализация JSON - JSONCrack Как увидеть вместо json-простыни на 1000 строк вменяемое и понятное человеческому глазу представление данных, со всеми уровнями вложенности? На странице по ссылке в левой части есть текстовый редактор - вставляем в него свои json-данные. Справа - окошко в котором наслаждаемся результатом и получившейся диаграммой. Минутка информационной безопасности! Не забывайте что это сторонний сервис и JSON-ы которые вы туда вставляете - лучше предварительно очищать от всяких секретностей, кредов и урлов. От греха подальше. 🏭 2. Конвертер JSON в POJO-класс Дано: JSON. Что надо: создать на его основе POJO-класс, модель для данных, со всем тем набором, именами и типами полей что есть у входного JSON. Мы - избалованные Java-бояре и вариант набирать класс ручками выбрасываем, что остается? Есть сайты где это можно сделать онлайн. В одно поле вставили, нажали кнопку, из другого забрали результат: Например тут. Или тут. А еще есть плагин для идеи если бегать между окнами браузера и идеи не вариант. После установки плагина в проектном дереве кликаем ПКМ - New - Generate POJO from JSON. В окошке выбираем картошку напитки соусы нужные нам при генерации классов опции. 🛠 3. Генерация JSON-схемы на базе POJO. Схема - это документ с набором правил для json данных. Схема позволяет быстро провалидировать JSON-документ - соответствует он правилам схемы или нет. В схеме можно описать структуру документа, имена обязательных полей документа, уровни вложенности, типы данных и многое другое. Так вот - есть сайт что бы на лету создать JSON-схему из твоих JSON данных. Сайт визуально очень похож на приведенные выше - окошко для вставки JSON, волшебная кнопка заставляющая цифровых гномов работать и окошко результата откуда можно забрать сгенеренный документ JSON-схемы. Если знаешь еще что-то крутое из таких инструментов - шепни на ухо в комментах😉 #java #ui #api #web #автотесты

Какими могут быть результаты выполнения этого кода? (возможен один или несколько вариантов) Ответ будет опубликован позднее в комментах.
Anonymous voting

📅 12 сентября. 🖥 256й день года. 👨🏼‍💻 День программиста! Желаю тебе: health++; //побольше здоровья happiness++; //поболь
📅 12 сентября. 🖥 256й день года. 👨🏼‍💻 День программиста! Желаю тебе:
health++; //побольше здоровья
happiness++; //побольше счастья
compileAndRuntimeErrors--; //поменьше проблем с кодом
По случаю праздника - JVM и компиляторы свалили на выходной. А тебе оставили подарок🎁. Код-загадка на картинке. Её придется решить без их помощи. Но ведь тебя и твой острый аналитический ум это не остановит? Голосуй за правильные ответы в опроснике ниже. #java #quiz

В понедельник бывает нелегко. Поэтому начни день с приятного - ткни случайную картинку и узнай какой ты кот🐈🐈‍⬛ #мемасы
+8
В понедельник бывает нелегко. Поэтому начни день с приятного - ткни случайную картинку и узнай какой ты кот🐈🐈‍⬛ #мемасы

UnreachableBrowserException, SessionNotCreatedException, WebDriverException, NoSuchSessionException, TimeoutException... Кажд
UnreachableBrowserException, SessionNotCreatedException, WebDriverException, NoSuchSessionException, TimeoutException...
Каждое из этих исключений приходит так же редко и внезапно, как и спам-письмо с завещанием миллионов долларов от нигерийского принца. Правда в отличии от нигерийского принца этим ребятам нужен не номер и CVC код твоей банковской карты. Им нужны твои нервы и человекодни потраченного времени на отладку и выяснение причин их возникновения. Я собрал первую версию памятки того, как следует отлаживать такого рода инфраструктурные проблемы. В выполнении UI-автотестов задействовано множество слоев и множество нюансов, поэтому я постарался свести их в цельную картинку. За скобками на этой схеме остается всякая тривиальщина типа неправильных локаторов и ожиданий и NoSuchElementException - с этим исключением я думаю ты прекрасно знаешь как бороться. Поэтому обязательно пиши в комментах свои мысли, кейсы, дополнения и предложения к этой схемке! А еще лучше - поделись с другом или репостни🔉. Вместе мы соберем самый кайфовый гайд по решению таких проблем🤘🏻 А я с удовольствием доработаю и перерисую эту карту с учетом всех предложений чтобы ты (вот да, именно ты) смог ее припрятать в сохраненках на черный день. #java #ui #web #автотесты #selenium #selenide

...и основа пирамиды тестирования :3 :3 :3 #мемасы
...и основа пирамиды тестирования :3 :3 :3 #мемасы

В детстве ты наверняка собирал вкладыши из жвачки, типа турбо или love is. Или играл в настолки где можно собрать себе колоду
В детстве ты наверняка собирал вкладыши из жвачки, типа турбо или love is. Или играл в настолки где можно собрать себе колоду карт самых мощных и дерзких персонажей. Но ура - теперь ты взрослый! Пришло время собрать колоду дерзких паттернов проектирования😄 Ими тоже можно играть, просто временами будет не так весело🥲 Начну серию постов и выложу первую карту - 6♦️ - паттерн Utility-класс. 🛠Utility-класс - это класс который содержит набор статических методов. Создание объектов такого класса запрещено. 🎯Задача такого класса - сгруппировать в кучку методы которые делают что-то общее, например работают с файлами, или парсят строки во что-то более осмысленное, или генерят случайные значения. Одного поля ягоды короче. Такой класс - это типа ящика для инструментов где лежат методы молоток(), гаечный ключ() и пила(). 🗒Правила создания Utility-класса: - private конструктор для невозможности создания объектов класса - только статические методы - нет состояния (нестатических полей) - класс помечен как final - минимум переменных класса, т.е. static-полей (лучше делать их константами через final) Либо можно этот талмуд правил заменить одной аннотацией библиотеки lombok - проставить @UtilityClass над классом - и все нужные модификаторы волшебным образом прибегут в твой класс. Ты стопроц уже сталкивался с такими классами. Их примеры из родного JDK:
java.lang.Math
java.util.Arrays
java.util.Objects
java.nio.file.Files
java.util.Collections
А еще вот эти библиотечные ребята (они следуют _почти_ всем правилам Utility-класса - за исключением отсутствия приватного конструктора):
org.testng.Assert
org.junit.jupiter.api.Assertions
org.assertj.core.api.Assertions
P.S. Кстати, у меня часто было такое что я сначала писал код, а потом узнавал что это оказывается "паттерн"😄 т.е. приходил к правильной структуре кода интуитивно. А ты пользуешься паттерном Utility у себя в коде? Поделись в комментах - что делает твой Utility-класс. #колода_паттернов #паттерн #java

А вы уделяете внимание этим ⚠️🚫✅ ребятам? #мемасы
А вы уделяете внимание этим ⚠️🚫✅ ребятам? #мемасы

"Что лежит в его мерзких грязных карманцах?" (с) Голлум, Властелин колец Пороемся в карманах у браузера - где и что он хранит
"Что лежит в его мерзких грязных карманцах?" (с) Голлум, Властелин колец
Пороемся в карманах у браузера - где и что он хранит - и разберем cookies, sessionStorage & localStorage. Про куки мы уже говорили в одном из постов выше. Вкратце - это небольшие файлы, которые сервер подкладывает в наш браузер что бы помнить кто ты, что ты, и какие настройки используешь. Куки отправляются сайту с каждым запросом к этому сайту. 📦localStorage - долгосрочное хранилище данных. Данные из localStorage доступны из любого окна/вкладки и хранятся до тех пор пока ты сам или веб приложение их не удалит. Т.е. localStorage похож на браузерный кеш - только хранит не скрипты, стили и картинки - а данные. 🖼Пример из жизни - Youtube хранит уровень громкости видео в localStorage (по ключу yt-player-volume), а раз localStorage доступен для всех вкладок и окон - то поэтому по умолчанию каждое новое открытое окно ютюба будет иметь одинаково выставленный уровень громкости. 🔒Доступ - через DevTools (вкладка Application) или через JS:
localStorage.setItem('имяКлюча', 'значение'); //запись
localStorage.getItem('имяКлюча'); //чтение
📦sessionStorage - временное хранилище данных. Данные хранятся только пока ты находишься на конкретном сайте в конкретной вкладке. Как только ты покинешь сайт или закроешь вкладку - пиши пропало. Это типа буфера обмена, или временных заметок на полях для веб-приложений. 🖼Пример из жизни - Amazon при оформлении заказа может хранить данные из заполненных форм именно тут - что бы если пользаку после заполнения адреса доставки вдруг приспичило вернуться на предыдущий шаг - данные уже заполненного адреса не оказались потеряны. А Netflix - сохранит в sessionStorage текущую отметку времени просмотра видоса, так что при обновлении страницы ты не упадешь в самое начало серии а продолжишь просмотр оттуда где прервался. А еще с помощью sessionStorage запомнит что показывал те или иные рекомендации что бы не бесить по 10 раз подряд всплывашкой с рекомендацией одного и того же сериала. 🔒Доступ - через DevTools (вкладка Application) или через JS:
sessionStorage.setItem('имяКлюча', 'значение'); //запись
sessionStorage.getItem('имяКлюча'); //чтение
В основе sessionStorage & localStorage так же как и у кук - лежит доменная модель. Т.е. каждому сайту - свой огород, свое пространство. Поэтому не удивляйся когда увидишь во вкладке дев тулов Local storage и Session storage по несколько хранилищ каждого из типов - каждый из сайтов будет иметь свое и в то же время не будет иметь доступа к "чужим" хранилищам, хранилищам других сайтов. 📦Для особо тяжелых (ресурсоемких) случаев - есть еще и IndexedDB - встроенная в браузер база данных (присутствует и в Chrome, и в Firefox, и в Safari). Там размер не фиксирован 5 или 10 мегабайтами и может достигать до 20% от свободного дискового пространства, а иногда и больше. 🖼Пример из жизни - та же гугл почта или гугл доки будут хранить копию данных в indexedDB, что позволит продолжить с ними работу даже при потере интернет-соединения. А при возврате коннекта - локально внесенные изменения в indexedDB тут же подтянутся на сервер, в облако. ___ P.S. огоньки🔥, сердечки❤️ и репосты📩 очень помогают каналу и заряжают мою батарейку на дальнейшее творчество и контент😉😇

Тебе открытка! Да-да, именно тебе по ту сторону экрана🤗 А еще можешь отправить это коллеге, который этого заслуживает. Мы ме
Тебе открытка! Да-да, именно тебе по ту сторону экрана🤗 А еще можешь отправить это коллеге, который этого заслуживает. Мы месяцами и годами работаем бок о бок с профессионалами своего дела, но иногда в потоке работы забываем поделиться простым человеческим теплом в виде похвалы🤍

Иногда проще прочитать код чем документацию #мемасы
Иногда проще прочитать код чем документацию #мемасы

Про работу Maven с локальным и удаленным репозиторием. Все то же самое что на картинке - но языком аналогий. Представь что ты
Про работу Maven с локальным и удаленным репозиторием. Все то же самое что на картинке - но языком аналогий. Представь что ты готовишь кесадилью (ага, открываем сезон мексиканских блюд). И по рецепту (pom.xml) для твоего Проекта Кесадилья тебе нужны ингредиенты - зависимости:
<dependencies>
  <dependency>🌮тортилья</dependency>
  <dependency>🧀сыр</dependency>
  <dependency>🥩мясо</dependency>
  <dependency>🍅помидор</dependency>
  <dependency>🧅лук</dependency>
  <dependency>🌶перец</dependency>
</dependencies>
Где их искать? Можно порыться у себя в холодильнике (❄️локальный репозиторий). А если в холодильнике нет сыра? Идем за сыром в супермаркет (🛒удаленный репозиторий). И приготовив кесадилью - остатки - например сыр - мы кладем обратно в холодильник, т.е. он у нас остается про запас в ❄️локальном репозитории. Прелесть библиотеки в том что она не испортится в холодильнике (❄️локальном репозитории) и не закончится - ее для сборок можно использовать сколько угодно раз. И если она есть у нас локально - в сеть за ней мы уже не пойдем. Т.е. в отличии от реального мира - в мире Maven достаточно "купить" сыр один раз что бы он всегда был и никогда не закончился🥲🥲🥲*звуки зависти

Хорошей пятницы и пусть ситуация с картинки сегодня обойдет тебя стороной😅🤗 #мемасы
Хорошей пятницы и пусть ситуация с картинки сегодня обойдет тебя стороной😅🤗 #мемасы

- Нееет, ты не можешь описать различия между абстрактным классом и интерфейсом одной картинкой! - Могу, если на ней будет тек
- Нееет, ты не можешь описать различия между абстрактным классом и интерфейсом одной картинкой! - Могу, если на ней будет текст😄

🔺Люди с древних времен обожают строить пирамиды - пирамида Хеопса, пирамида Маслоу, пирамида тестирования. Сегодня о последн
🔺Люди с древних времен обожают строить пирамиды - пирамида Хеопса, пирамида Маслоу, пирамида тестирования. Сегодня о последней - как протестировать код автотестов? Ведь никаких API и UI слоев там нет. Компилятор - первый рубеж обороны. Мы забываем про этот уровень проверок, но именно компилятор спасает прод от самых глупых и частых ошибок - когда ругает нас за отсутствие ';' или за присвоение переменной неправильного типа данных. Т.е. - тут же отфутболивает нерабочий код. Статический анализ - находит баги, антипаттерны, проблемы со стилем кода. Пример - встроенные проверки Intellij IDEA - подсветка нескольких идентичных копипастнутых фрагментов кода, или потенциально бесконечного цикла. Эти проверки можно настроить под себя. А можно подключить Checkstyle-плагин и написать свои собственные. Об этом в отдельном посте. Юнит-тесты на автотестовый фреймворк - важно, но не всегда оправданно. В сложных больших фреймах - нужны. В остальных случаях - считай экономику, считай как часто ты меняешь важные/нагруженные классы проекта, как часто там возникают ошибки. Важно ответить себе - стоит ли овчинка выделки. В итоге как бы ни выглядела пирамида, ее золотое правило одинаково: Чем быстрее (ниже по уровню пирамиды) найдена ошибка - тем дешевле ее устранить.

Подъехали сладкие темы!🍪🍭🍫 Cookie (печенька, кука) - кусочек информации, которую бразузер получает от сервера, и дальше пе
Подъехали сладкие темы!🍪🍭🍫 Cookie (печенька, кука) - кусочек информации, которую бразузер получает от сервера, и дальше передает при любом запросе к этому серверу. Например, сервер может пользуется куками что бы пометить нас как конкретного пользователя и в дальнейшем узнавать, и даже что-то помнить о нас. Типа как дал кликуху во дворе. Очень упрощенно, кука содержит: 1. Данные - имя свойства и его значение. В терминах Java можно думать об этом как о строковой переменной у которой есть имя и значения. 2. Адрес сайта к которому эта кука относится 3. Срок действия куки Что может храниться в куки? Да любая дичь😄 Это просто строка в которой могут быть любые символы. Но самые частые кейсы данных в куки такие: - 🧑кто ты такой (может хранить session id, токен, или еще какой удостоверяющий документ) - ⚙️какие настройки сайта используешь (язык, светлая/темная тема) - 📝какое состояние сайта у тебя сейчас (например в корзине покупок лежит три шерстяных носка) Жми 🔥 что бы разжечь пожар, в котором родится видос с подробным разбором темы😉

Что будет результатом выполнения кода выше?
Anonymous voting

Разминаем мозги, они нам нужны что бы скролить ленту с мемами и котиками!🐈🐈‍⬛ long a = List.of(0,1,2,3,4) .stream() .map(i
Разминаем мозги, они нам нужны что бы скролить ленту с мемами и котиками!🐈🐈‍⬛
long a = List.of(0,1,2,3,4)
.stream()
.map(i -> Integer.valueOf(i++))
.filter(i -> i%2 == 0)
.count();
System.out.println(a);

🎬Ролик про основы работы с Awaitility - на канале! https://youtu.be/1r8_Ect4aYs?si=NGrQB98scpVuHEr0