Грамота от Кузьмича – Telegram
Грамота от Кузьмича
214 subscribers
54 photos
1 video
20 links
🍵Java.
🤖Автотестирование.
😆Мемасы.

Я - Александр Кузьмичев. Просто и с юмором рассказываю об IT, а еще веду свою школу "Java + Автотестирование"

Ссылки на все соц. сети:
https://devray.taplink.ws/

TG: @NeonAether
Download Telegram
Зимой распускаются не только подснежники🌼.

Мой план - стартовать экспресс-курс по продвинутой Java + автоматизации. Эдакая ступенька для роста с Junior в Middle. Сейчас определяю состав тем и технологий. Курс будет в записи, но первый поток - проведу в живую в zoom, единственный раз. Так что успевайте вписаться на рок-перфоманс🤘

Голосовалка за интересующие темы тут - https://forms.gle/Z3HSL3GhLJSkkc3G9 - топ тем из голосования войдут в курс.

Запись в список ожидания - в телегу @NeonAether. О старте продаж узнаете первыми и в личку. И следите за обновлениями в канале - об открытии набора, утвержденной программе курса и дате старта - инфа появится вот прям здесь, в этом канале🎯
🔥6👍3
“Инстанцио!” - быстро выкрикнул Гарри Поттер, взмахнув палочкой и добавив в pom.xml новую зависимость.💫

В нашем арсенале волшебника разработчика должно быть достаточно заклинаний библиотек, что бы разрабатывать быстро и не изобретать велосипеды. Добавим себе в копилку еще одну.

Instancio - библиотека про генерацию тестовых данных. https://github.com/instancio/instancio

“Но а как же Faker?” - спросите вы. А я поясню.
Faker (com.github.javafaker) в первую очередь генерирует отдельное атомарное значение, кусочек данных. Телефонный номер, email-адрес, строку ФИО, GPS-координату.
Instancio - предназначен для создания сложных структур данных, т.е. объектов с полями, с уровнями вложенности.

Просто для сравнения - как бы мы генерировали объект класса Person(firstName, lastName, age, phoneNumber) со случайными значениями полей с использованием faker и с использованием instancio:

🔴Faker

Faker faker = Faker.instance();

Person person = new Person();
person.setFirstName(faker.name().firstName());
person.setLastName(faker.name().lastName());
person.setAge(faker.number().randomDigit());
person.setPhoneNumber(faker.phoneNumber().phoneNumber());

🔵Instancio
Person person = Instancio.create(Person.class);


Конечно не обойдется без нюансов. По умолчанию Instancio будет заполнять поля объекта полностью рандомными данными, в то время как с Faker мы будем получать данные, более похожие на реальные, живые. Для примера - как будут выглядеть объекты Person, сгенерированные двумя способами выше:

Person{firstName='Haydee', lastName='Kertzmann', age=4, phoneNumber='067.506.7057'} //для faker
Person{firstName='HRDYGWQP', lastName='UYEOXLEO', age=8229, phoneNumber='BBCCSDU'} //для instancio

Но каждому инструменту - свое применение. Резюмирая: Faker - про генерацию фейковых данных (но реалистично выглядящих). Instancio - про создание объектов, с полями, забитыми случайными данными (что может быть более актуально в unit-тестировании).

Саму зависимость Instancio можно найти здесь: https://mvnrepository.com/artifact/org.instancio/instancio
Дополнительно почитать про возможности и настройку библиотеки - тут: https://www.instancio.org/user-guide/#creating-objects (боже храни людей которые пишут документацию).
👍6🔥31
Что на картинке? Монитор центра управления полетами на Байконуре?🚀
Упс, это вкладка Performance в Chrome DevTools. По сути - история процесса построения и отрисовки страницы.

Сегодня заглянем во внутрянку как браузер превращает прилетевший текст HTML, CSS, JS - в сочную картинку. Упрощенно, шаги такие:

1. сборка DOM-дерева на базе HTML - строим объекты на базе каждого узла.
2. сборка CSSOM-дерева на базе CSS - строим объекты на базе каждого правила.
3. Render Tree - сборка дерева рендеринга. По сути это применение стилей к объектам DOM, т.е. объединение DOM + CSSOM
4. Layout - расчет размеров элементов, их расположения и взаимного размещения.
5. Paint - подготовка и прорисовка моделей элементов в растровые картинки.
6. Compositing - группировка полученных картинок в слои и отображение этих слоев на экран.

И еще - мы взаимодействуем со страницей, а не просто любуемся. Поэтому тык на любую кнопку может привести к перерисовке страницы и повторению всех шагов выше.

Так что тыкайте кнопки экономно, берегите ваш CPU😜
1🔥81👍1
Разминаем мозги, они нам нужны что бы скролить ленту с мемами и котиками!🐈🐈‍⬛
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);
Что будет результатом выполнения кода выше?
Anonymous Quiz
28%
2
20%
3
28%
0, 2, 4
4%
4
20%
2, 4
🔥3
Подъехали сладкие темы!🍪🍭🍫

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

Очень упрощенно, кука содержит:
1. Данные - имя свойства и его значение. В терминах Java можно думать об этом как о строковой переменной у которой есть имя и значения.
2. Адрес сайта к которому эта кука относится
3. Срок действия куки

Что может храниться в куки? Да любая дичь😄 Это просто строка в которой могут быть любые символы. Но самые частые кейсы данных в куки такие:

- 🧑кто ты такой (может хранить session id, токен, или еще какой удостоверяющий документ)
- ⚙️какие настройки сайта используешь (язык, светлая/темная тема)
- 📝какое состояние сайта у тебя сейчас (например в корзине покупок лежит три шерстяных носка)


Жми 🔥 что бы разжечь пожар, в котором родится видос с подробным разбором темы😉
🔥17👍2
🔺Люди с древних времен обожают строить пирамиды - пирамида Хеопса, пирамида Маслоу, пирамида тестирования. Сегодня о последней - как протестировать код автотестов? Ведь никаких API и UI слоев там нет.

Компилятор - первый рубеж обороны. Мы забываем про этот уровень проверок, но именно компилятор спасает прод от самых глупых и частых ошибок - когда ругает нас за отсутствие ';' или за присвоение переменной неправильного типа данных. Т.е. - тут же отфутболивает нерабочий код.

Статический анализ - находит баги, антипаттерны, проблемы со стилем кода. Пример - встроенные проверки Intellij IDEA - подсветка нескольких идентичных копипастнутых фрагментов кода, или потенциально бесконечного цикла. Эти проверки можно настроить под себя. А можно подключить Checkstyle-плагин и написать свои собственные. Об этом в отдельном посте.

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

В итоге как бы ни выглядела пирамида, ее золотое правило одинаково:
Чем быстрее (ниже по уровню пирамиды) найдена ошибка - тем дешевле ее устранить.
🔥9👍31
- Нееет, ты не можешь описать различия между абстрактным классом и интерфейсом одной картинкой!
- Могу, если на ней будет текст😄
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍3😁2🙏1
Хорошей пятницы и пусть ситуация с картинки сегодня обойдет тебя стороной😅🤗

#мемасы
😁123
Про работу Maven с локальным и удаленным репозиторием.
Все то же самое что на картинке - но языком аналогий.

Представь что ты готовишь кесадилью (ага, открываем сезон мексиканских блюд).

И по рецепту (pom.xml) для твоего Проекта Кесадилья тебе нужны ингредиенты - зависимости:

<dependencies>
<dependency>🌮тортилья</dependency>
<dependency>🧀сыр</dependency>
<dependency>🥩мясо</dependency>
<dependency>🍅помидор</dependency>
<dependency>🧅лук</dependency>
<dependency>🌶перец</dependency>
</dependencies>


Где их искать? Можно порыться у себя в холодильнике (❄️локальный репозиторий). А если в холодильнике нет сыра? Идем за сыром в супермаркет (🛒удаленный репозиторий).

И приготовив кесадилью - остатки - например сыр - мы кладем обратно в холодильник, т.е. он у нас остается про запас в ❄️локальном репозитории.

Прелесть библиотеки в том что она не испортится в холодильнике (❄️локальном репозитории) и не закончится - ее для сборок можно использовать сколько угодно раз. И если она есть у нас локально - в сеть за ней мы уже не пойдем.

Т.е. в отличии от реального мира - в мире Maven достаточно "купить" сыр один раз что бы он всегда был и никогда не закончился🥲🥲🥲*звуки зависти
🔥8👍61😁1
Иногда проще прочитать код чем документацию

#мемасы
😁12👍3🔥21
Тебе открытка! Да-да, именно тебе по ту сторону экрана🤗


А еще можешь отправить это коллеге, который этого заслуживает.

Мы месяцами и годами работаем бок о бок с профессионалами своего дела, но иногда в потоке работы забываем поделиться простым человеческим теплом в виде похвалы🤍
🔥94
"Что лежит в его мерзких грязных карманцах?"
(с) Голлум, Властелин колец


Пороемся в карманах у браузера - где и что он хранит - и разберем 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. огоньки🔥, сердечки❤️ и репосты📩 очень помогают каналу и заряжают мою батарейку на дальнейшее творчество и контент😉😇
4🔥166👍1🙏1
А вы уделяете внимание этим ⚠️🚫 ребятам?

#мемасы
1😁10🔥3👍1💯1
В детстве ты наверняка собирал вкладыши из жвачки, типа турбо или 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
2👍7🔥41
...и основа пирамиды тестирования :3 :3 :3

#мемасы
4😁52🔥2
UnreachableBrowserException, SessionNotCreatedException, WebDriverException, NoSuchSessionException, TimeoutException...


Каждое из этих исключений приходит так же редко и внезапно, как и спам-письмо с завещанием миллионов долларов от нигерийского принца. Правда в отличии от нигерийского принца этим ребятам нужен не номер и CVC код твоей банковской карты. Им нужны твои нервы и человекодни потраченного времени на отладку и выяснение причин их возникновения.

Я собрал первую версию памятки того, как следует отлаживать такого рода инфраструктурные проблемы. В выполнении UI-автотестов задействовано множество слоев и множество нюансов, поэтому я постарался свести их в цельную картинку. За скобками на этой схеме остается всякая тривиальщина типа неправильных локаторов и ожиданий и NoSuchElementException - с этим исключением я думаю ты прекрасно знаешь как бороться.

Поэтому обязательно пиши в комментах свои мысли, кейсы, дополнения и предложения к этой схемке! А еще лучше - поделись с другом или репостни🔉. Вместе мы соберем самый кайфовый гайд по решению таких проблем🤘🏻 А я с удовольствием доработаю и перерисую эту карту с учетом всех предложений чтобы ты (вот да, именно ты) смог ее припрятать в сохраненках на черный день.

#java #ui #web #автотесты #selenium #selenide
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍8🔥31
В понедельник бывает нелегко.
Поэтому начни день с приятного - ткни случайную картинку и узнай какой ты кот🐈🐈‍⬛

#мемасы
😁104🔥1