Тихо и почти буднично мы вчера поставили рекорды по выручке и числу заказов в минуту.
Рекорд заказов в минуту - 735
Это Dodo Pizza России. Dodo Brands Worldwide: 835 в минуту (Здесь, кстати, на конкретном соотношении цифр видно, как важна наша цель стать пиццерией #1 в Турции и Дубае, масштабировать бизнес на зарубежных рынках).
Выручка в России за 1 день 534 млн рублей🔥В Евразии - 776 млн рублей📈
Трудно переоценить роль QA функции в том, что рекордный по нагрузке день прошел без сучка и задоринки в техническом плане💻
Рекорд заказов в минуту - 735
Это Dodo Pizza России. Dodo Brands Worldwide: 835 в минуту (Здесь, кстати, на конкретном соотношении цифр видно, как важна наша цель стать пиццерией #1 в Турции и Дубае, масштабировать бизнес на зарубежных рынках).
Выручка в России за 1 день 534 млн рублей🔥В Евразии - 776 млн рублей
Трудно переоценить роль QA функции в том, что рекордный по нагрузке день прошел без сучка и задоринки в техническом плане
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🔥20❤7🍾6
#java #frameworks
Selenide - крутой.
Я думаю, что большинство из вас в этом и так не сильно сомневается (список пользователей говорит сам за себя), но вот пару дней назад произошло маленькое событие, которое могло бы вообще пройти незамеченным для меня, но не прошло: я обновил в одном из своих проектов Selenide c 6.х до последней версии 7.2.1. И у меня перестал компилироваться код🙂 Казалось бы, первая мысль поругаться, но я, наоборот, пишу пост похвалы.
А дело все в том, что разработчики Selenide радикально упростили жизнь всем, кто писал или планирует написать свои кастомные CollectionCondition. Если раньше надо было переопределять 3 метода:
Причем, что делает второй и для чего он нужен технически я даже не понимал и просто писал
А еще, надо было писать свои классы исключений:
А теперь все стало радикально просто, надо переопределить один метод :
Назначение и сигнатура которого понятны даже если вообще в первый раз слышать про
Респект всем библиотекам и фреймворкам, которые упрощают свои API и делают их чистыми для понимания и написания кода. Selenide с каждым релизом, обрастая все новым функционалом, становится проще для понимания и расширения. И это хорошо.
Selenide - крутой.
Selenide - крутой.
Я думаю, что большинство из вас в этом и так не сильно сомневается (список пользователей говорит сам за себя), но вот пару дней назад произошло маленькое событие, которое могло бы вообще пройти незамеченным для меня, но не прошло: я обновил в одном из своих проектов Selenide c 6.х до последней версии 7.2.1. И у меня перестал компилироваться код🙂 Казалось бы, первая мысль поругаться, но я, наоборот, пишу пост похвалы.
А дело все в том, что разработчики Selenide радикально упростили жизнь всем, кто писал или планирует написать свои кастомные CollectionCondition. Если раньше надо было переопределять 3 метода:
@Override
public void fail(CollectionSource collection, List<WebElement> elements, Exception lastError, long timeoutMs)
@Override
public boolean missingElementSatisfiesCondition()
@Override
public boolean test(List<WebElement> elements)
Причем, что делает второй и для чего он нужен технически я даже не понимал и просто писал
return false;🥲А еще, надо было писать свои классы исключений:
public class SpendsMismatch extends UIAssertionError А теперь все стало радикально просто, надо переопределить один метод :
@Override
public CheckResult check(Driver driver, List<WebElement> elements)
Назначение и сигнатура которого понятны даже если вообще в первый раз слышать про
CollectionCondition.Респект всем библиотекам и фреймворкам, которые упрощают свои API и делают их чистыми для понимания и написания кода. Selenide с каждым релизом, обрастая все новым функционалом, становится проще для понимания и расширения. И это хорошо.
Selenide - крутой.
selenide.org
Selenide users
🔥44🥰8👍1
The art of JUnit extensions 2 - быть!
Есть ощущение, что я делаю важную вещь для кого-то, кто только начинает свой путь в AQA.
Кажется, что после просмотра обеих частей хотя бы кто-то решит построить свой "фреймворк" (тьфу три раза) на красивых экстеншенах, а не на портянке статических методов и классов на 500 строк.
А я буду этому рад.
Есть ощущение, что я делаю важную вещь для кого-то, кто только начинает свой путь в AQA.
Кажется, что после просмотра обеих частей хотя бы кто-то решит построить свой "фреймворк" (тьфу три раза) на красивых экстеншенах, а не на портянке статических методов и классов на 500 строк.
А я буду этому рад.
Heisenbug 2024 Spring. Конференция по тестированию не только для тестировщиков
The art of JUnit extensions 2 | Доклад на Heisenbug 2024 Spring
Продолжение воркшопа The art of JUnit extensions с Heisenbug 2023 Autumn.
🔥53👍13❤11
Media is too big
VIEW IN TELEGRAM
Об одной из главных проблем автоматизации тестирования с одной из моих лекций QA.GURU Advanced.
👍30💯10❤5🔥1🤩1😎1
Еще из приколов моего любимого Gradle: Кто сходу увидит здесь ошибку? Я пропустил двоеточие в одной из зависимостей, и на мой взгляд - это делает "адрес" зависимости невалидным, и было бы здорово, если бы Gradle сказал мне "could not resolve dependencies, bro". Но Gradle совершенно ничего не говорит в таком случае по нажатию кнопки "Reload gradle project" (та самая "обновить"). И я сижу и не понимаю - ну почему у меня не импортируются классы из этой библиотеки? Сижу смотрю граф зависимостей, действительно не нахожу там нужную мне
spring-data-commons и недоумеваю. Я пошел дальше и написал testImplementation "org.springframework.data:spring-data-commonsываывавыdsfvsfd:${springDataCommonsVersion}" и даже тут не увидел ошибки. Хотя может быть во всем виновата IDEA со своей кнопкой, а Gradle не при чем. Но кто-то точно не прав 🙂😁13👍7🤔4
Скоро я выступаю на конференции Heisenbug 2024 Spring с очередным воркшопом про JUnit Extensions, который будет продолжением первой части. Буду рассказывать, внезапно, про JUnit)) А если серьезно, я надеюсь что получившийся проект пригодится очень многим новичкам в Java AQA для построения действительно изящной тестовой инфры. Будет интересно!
Приходите на конфу, там найдется много интересного помимо меня😀
Конференция пройдет 16.04 и 22-23.04 сначала в online, а потом и в offline формате.
Думаю, многим из вас билет оплатит компания. Но, если не срастется, а послушать доклады и задать вопросы все равно хочется, приходите в личку — постараюсь помочь со скидкой на билет. Не только лишь постараюсь, но и помогу😂
Приходите на конфу, там найдется много интересного помимо меня😀
Конференция пройдет 16.04 и 22-23.04 сначала в online, а потом и в offline формате.
Думаю, многим из вас билет оплатит компания. Но, если не срастется, а послушать доклады и задать вопросы все равно хочется, приходите в личку — постараюсь помочь со скидкой на билет. Не только лишь постараюсь, но и помогу😂
YouTube
Дмитрий Тучс — The art of JUnit extensions
Ближайшая конференция — Heisenbug 2025 Autumn, 19—20 октября, Санкт-Петербург + online. Подробности и билеты: https://jrg.su/D6uGC9
— —
В режиме онлайн берем микросервисный проект (Spring Authorization Server, Spring OAuth 2.0 Resource Server) и строим полноценную…
— —
В режиме онлайн берем микросервисный проект (Spring Authorization Server, Spring OAuth 2.0 Resource Server) и строим полноценную…
🔥27❤13👍4❤🔥3
Сегодня иду записывать подкаст на тему ... а сложно сказать, на какую тему🙂. Поговорим о QA, безо всяких JUnit-ов и прочих автоматизаций. Кстати, это уже не первый мой опыт с подкастом, ранее был чуть более хардкорный и технический - Тесты и Пицца от Ufostation. Лайк, шер, предложения тем для будущих подкастов в комменты🙌
Podcast.ru
s02e05 - Тесты и пицца 🍕 – UfoStation podcast – Podcast.ru
Гость выпуска — Дмитрий Тучс (https://t.iss.one/dtuchs), Head of QA at Dodo Engineering; один из преподавателей в https://qa.guru
🔥34❤11😍4👍2
The art of JUnit Extension 2 сегодня состоялся! Спасибо всем, кто смотрел вживую, а код, который мы сегодня писали, будет завтра в репо
И да, мы, наконец, полностью решили проблему параметризации тестов с разными allureId с помощью Extension, будет что разобрать в свои проекты 💯
И да, мы, наконец, полностью решили проблему параметризации тестов с разными allureId с помощью Extension, будет что разобрать в свои проекты 💯
Heisenbug 2024 Spring. Conference on testing not just for testers
The art of JUnit Extensions 2 | Talk at Heisenbug 2024 Spring
Continuation of The art of JUnit extensions workshop from Heisenbug 2023 Autumn.
🔥30❤8👍2
О чем врут тестировщикам.
И тестировщики?
Свой взгляд на большие проблемы в образе мыслей QA инженеров будет в моем offline докладе на Codefest. Приходите, если вы в Новосибирске 🙂
И тестировщики?
Свой взгляд на большие проблемы в образе мыслей QA инженеров будет в моем offline докладе на Codefest. Приходите, если вы в Новосибирске 🙂
🔥14❤13👍2
#java #обучение #qaguru
Вчера провел первое занятие уже 5-го потока своего авторского курса Java Advanced в QA.GURU. Как и все предыдущие, курс будет глубоко погружать в разработку и тестирование вокруг Java.
Если вдруг кто-то из вас желает залететь в уходящий поезд 5-го потока, можете воспользоваться моим персональным промокодом DTUCHS10, который даст вам скидку 10% до 25 апреля включительно. Для активации промокода напишите в QA.GURU-SALES.
Вчера провел первое занятие уже 5-го потока своего авторского курса Java Advanced в QA.GURU. Как и все предыдущие, курс будет глубоко погружать в разработку и тестирование вокруг Java.
Если вдруг кто-то из вас желает залететь в уходящий поезд 5-го потока, можете воспользоваться моим персональным промокодом DTUCHS10, который даст вам скидку 10% до 25 апреля включительно. Для активации промокода напишите в QA.GURU-SALES.
qa.guru
Автоматизированное тестирование на Java для продвинутых | Онлайн-курс по написанию автотестов | QA.GURU
Продвинутый курс по автоматизации тестирования на Java. Курсы повышения квалификации на Java для тестировщиков уровня Middle и выше.
❤10
#gradle
О моем любимом Gradle.
Имеем мы, значит, официальный туториал Spring о том, как настроить генерацию JAXB. Идем по нему, вставляем в наш build.gradle строки из туториала и - все работает 🙂. Строки такие:
И все бы ничего, но
Что может быть проще загуглить на что предлагают заменить
И есть даже пример кода:
было:
стало:
Ну, все просто, но кажется
Собираем проект, и ошибка:
`No such property: layout for class: org.gradle.api.Project
Possible solutions: layout`
ОКЕЙ, пробуем по-другому
и классы генерятся в
Идем дальше
- ну вот это-то должно нам дать строку с путем к папке?
результат опять с таким путем:
КОРОЧЕ ВОПРОС. Кто знает как это прописать чтоб работала
О моем любимом Gradle.
Имеем мы, значит, официальный туториал Spring о том, как настроить генерацию JAXB. Идем по нему, вставляем в наш build.gradle строки из туториала и - все работает 🙂. Строки такие:
task genJaxb {
ext.sourcesDir = "${buildDir}/generated-sources/jaxb"
ext.schema = "src/main/resources/countries.xsd"
...И все бы ничего, но
${buildDir} самим Gradle объявлена deprecated, и здравствуй вечный WARNING при сборке проекта, а в будущем - и невозможность перейти на какой-нибудь Gradle 9 или 10. Сейчас я на 8.6. Что может быть проще загуглить на что предлагают заменить
${buildDir} сами разработчики gradle? И есть официальный док, который дает нам ответы на этот вопрос:Deprecations
Deprecated Project.buildDir is to be replaced by Project.layout.buildDirectory
The Project.buildDir property is deprecated. It uses eager APIs and has ordering issues if the value is read in build logic and then later modified. It could result in outputs ending up in different locations.
It is replaced by a DirectoryProperty found at Project.layout.buildDirectory. See the ProjectLayout interface for details.
И есть даже пример кода:
было:
file("$buildDir/myOutput.txt")стало:
layout.buildDirectory.file("myOutput.txt")Ну, все просто, но кажется
.file в нашем случае лучше заменить .dir. Пишем:tasks.register('genJaxb') {
ext.sourcesDir = "${Project.layout.buildDirectory}/generated-sources/jaxb"
ext.classesDir = "${Project.layout.buildDirectory}/classes/jaxb"
...Собираем проект, и ошибка:
`No such property: layout for class: org.gradle.api.Project
Possible solutions: layout`
ОКЕЙ, пробуем по-другому
ext.sourcesDir = "${layout.buildDirectory}/generated-sources/jaxb"
ext.classesDir = "${layout.buildDirectory}/classes/jaxb"
...и классы генерятся в
niffler-gateway/property(org.gradle.api.file.Directory, fixed(class org.gradle.api.internal.file.DefaultFilePropertyFactory$FixedDirectory, /Users/dmitriitucs/IdeaProjects/qg/niffler/niffler-gateway/build))/generated-sources - уже лучше, есть прогресс, но хотелось то в build/generated-sources🙂Идем дальше
ext.sourcesDir = layout.buildDirectory.dir("generated-sources/jaxb").toString()
ext.classesDir = layout.buildDirectory.dir("classes/jaxb").toString()- ну вот это-то должно нам дать строку с путем к папке?
результат опять с таким путем:
niffler-gateway/map(org.gradle.api.file.Directory property(org.gradle.api.file.Directory, fixed(class org.gradle.api.internal.file.DefaultFilePropertyFactory$FixedDirectory, /Users/dmitriitucs/IdeaProjects/qg/niffler/niffler-gateway/build)) org.gradle.api.internal.file.DefaultFilePropertyFactory$PathToDirectoryTransformer@4fe6e613)/guru/qa/niffler/userdata/wsdlКОРОЧЕ ВОПРОС. Кто знает как это прописать чтоб работала
mkdir и создавала папку тупо build/generated-sources🙂?? Ни чатгпт, ни гугл пока не помогли. Так и живем с Gradle 🙂Getting Started | Producing a SOAP web service
Learn how to create a SOAP-based web service with Spring.
👍1😁1
Среда - день хороших новостей!
Сегодня опубликован подкаст "Гости из IT" с моим участием и тем самым Антоном Комоловым😁
В подкасте никаких JUnit-ов и Gradle-ов не будет, но точно будет много моих мыслей о состоянии дел с QA. Интересно будет всем, залетайте, слушайте, пишите комменты, опровергайте, и будьте крутыми QA 🚀
Сегодня опубликован подкаст "Гости из IT" с моим участием и тем самым Антоном Комоловым😁
В подкасте никаких JUnit-ов и Gradle-ов не будет, но точно будет много моих мыслей о состоянии дел с QA. Интересно будет всем, залетайте, слушайте, пишите комменты, опровергайте, и будьте крутыми QA 🚀
Podcast.ru
Гости из IT – Podcast.ru
Антон Комолов и специалисты Friflex зовут в гости лучших экспертов из IT-индустрии, а они простым языком рассказывают о том, как технические инновации меняют нашу жизнь и работу. Friflex разрабатывает цифровые продукты — мобильные приложения, сайты, высоконагруженные…
🔥26❤7👏4
Анонсирую продолжение Сибирского тура оффлайн выступлений. Вслед за выступлением на Codefest 25 мая я поеду в Омск на небольшую, но обещающую быть ламповой конфу Сибирь.JS 22-23 июня. Буду рад пообщаться offline со всеми 🙌
🔥32
Вернулся из отпуска в Малайзии, Сингапуре и Корее. Так много эмоций, что хочется разбавить канал тревел-блогерством🙂 А пока я ездил в отпуск - пригласили в гости на еще один подкаст QAk-QAk — и в продакшен. Из интересного - будем пробовать записывать прямо во время Codefest, обсуждать будем мой доклад и не только.
🔥49👍4
#automation #patterns
Давненько не писал ничего околотехнического, и сегодня про вопрос с собеседований "А какие паттерны знаешь"?
Что я думаю про PageObject и гордо звучащий PageFactory, про которые вспомнят 9 из 10 на этот вопрос?
Первое - это не "паттерн" в прямом смысле этого слова. В том смысле, что если мы будем делать ООП-программу про зоопарк, там будет обект "Жираф" с полями "
Так вот, Web-тесты на Java (и другом любом ООП языке) - и есть программка про зоопарк (про веб-странички), и PageObject - это просто класс с полями и методами, описывающий предметную область. И если понимать это, то легко понять и точку зрения, например, Андрея Солнцева: "PageObject не всегда и не очень-то и нужен". Ровно в той же степени, как класс (объект) "Жираф" может быть не очень то и нужен, если в нашем зоопарке с ним не так уж и много взаимодействий. И если дизайн этого класса сделан плохо.
А PageFactory - это чтение аннотаций в классе, которому придумали нелепое название. Это не имеет никакого отношения к Factory - который, сам по себе, хороший паттерн и встречается часто.
А еще я встречал точку зрения, что если методы в PageObject возвращают ссылку this, то это PageFactory. Что тут сказать? Я не знаю откуда взялось мнение, что это так называется. В ООП у этого есть вполне конкретное название - Fluent interface.
Поэтому не надо на собеседовании говорить, что вы знаете паттерны PageObject и PageFactory.
На такой вопрос лучше ответить так:
И рассказать 🙂
Давненько не писал ничего околотехнического, и сегодня про вопрос с собеседований "А какие паттерны знаешь"?
Что я думаю про PageObject и гордо звучащий PageFactory, про которые вспомнят 9 из 10 на этот вопрос?
Первое - это не "паттерн" в прямом смысле этого слова. В том смысле, что если мы будем делать ООП-программу про зоопарк, там будет обект "Жираф" с полями "
private вес" и "private рост" и методами "поесть()" / "поспать()". Так же будет объект "Зебра" и объект "Вомбат". Можно ли сказать, что мы изобрели паттерн "ЗверьОбжект"? В нашей системе каждый зверек это объект. в котором есть свойства (поля) и методы, через которые мы взаимодействуем с ним.Так вот, Web-тесты на Java (и другом любом ООП языке) - и есть программка про зоопарк (про веб-странички), и PageObject - это просто класс с полями и методами, описывающий предметную область. И если понимать это, то легко понять и точку зрения, например, Андрея Солнцева: "PageObject не всегда и не очень-то и нужен". Ровно в той же степени, как класс (объект) "Жираф" может быть не очень то и нужен, если в нашем зоопарке с ним не так уж и много взаимодействий. И если дизайн этого класса сделан плохо.
А PageFactory - это чтение аннотаций в классе, которому придумали нелепое название. Это не имеет никакого отношения к Factory - который, сам по себе, хороший паттерн и встречается часто.
А еще я встречал точку зрения, что если методы в PageObject возвращают ссылку this, то это PageFactory. Что тут сказать? Я не знаю откуда взялось мнение, что это так называется. В ООП у этого есть вполне конкретное название - Fluent interface.
Поэтому не надо на собеседовании говорить, что вы знаете паттерны PageObject и PageFactory.
На такой вопрос лучше ответить так:
Если вы меня спрашиваете про "паттерны тестировщиков" и хотите послушать про PageObject - я вам расскажу, но если вас интересует понимаю ли я, что такое Decorator, Singleton, Proxy, Factory (настоящую) - то сейчас я вам расскажу про них.
И рассказать 🙂
Telegram
LikeaDuck🦆
#automation #этоневажно
Ввожу новый хэштег - #этоневажно. Дело в том, что я уже годы наблюдаю упертое желание потешить свое ЧСВ казалось бы важными постулатами в автоматизации, но большинство из них на самом деле не важны.
Сегодня рассмотрим классику …
Ввожу новый хэштег - #этоневажно. Дело в том, что я уже годы наблюдаю упертое желание потешить свое ЧСВ казалось бы важными постулатами в автоматизации, но большинство из них на самом деле не важны.
Сегодня рассмотрим классику …
❤29👍14🔥6👎1
Codefest #14 сегодня закончился.
Хочу рассказать про свою работу в программном комитете этой конференции (в котором я уже три года подряд).
Я точно не самый ответственный ПК-шник, особенно пару последних лет, когда перешёл в ДОДО и стал иногда сходить с ума от созвонов и дел на работе. Я вел мало докладчиков в этом году.
И все же, знаете, я испытываю гордость за те немногие доклады (их было всего три), к которым я действительно приложил руку. Я иногда сам себе кажусь "злым полицейским" на прогонах: увеличь текст! Слишком много текста! Слишком много кода! Слишком мало кода! С какой главной мыслью человек уйдет из зала?
Но после, я вижу как сами спикеры кайфуют на сцене от получившегося результата. Как люди увлеченно смотрят, слушают, записывают...
Мне уже почти 35, мне больше хочется радоваться за чужие доклады, а не за свои.
А ещё сегодня был лучший закрывающий keynote , который я видел в жизни.
Перформанс (нет, это было больше, чем доклад, именно - перформанс) от Александра Кирсанова, на котором люди были растроганы до слез в конце. До настоящих слез, а не просто ради красивой фразы.
Посмотрите его когда-нибудь после.
Хочу рассказать про свою работу в программном комитете этой конференции (в котором я уже три года подряд).
Я точно не самый ответственный ПК-шник, особенно пару последних лет, когда перешёл в ДОДО и стал иногда сходить с ума от созвонов и дел на работе. Я вел мало докладчиков в этом году.
И все же, знаете, я испытываю гордость за те немногие доклады (их было всего три), к которым я действительно приложил руку. Я иногда сам себе кажусь "злым полицейским" на прогонах: увеличь текст! Слишком много текста! Слишком много кода! Слишком мало кода! С какой главной мыслью человек уйдет из зала?
Но после, я вижу как сами спикеры кайфуют на сцене от получившегося результата. Как люди увлеченно смотрят, слушают, записывают...
Мне уже почти 35, мне больше хочется радоваться за чужие доклады, а не за свои.
А ещё сегодня был лучший закрывающий keynote , который я видел в жизни.
Перформанс (нет, это было больше, чем доклад, именно - перформанс) от Александра Кирсанова, на котором люди были растроганы до слез в конце. До настоящих слез, а не просто ради красивой фразы.
Посмотрите его когда-нибудь после.
❤29🔥10👍4
Об интересных багах, обнаруживаемых прямо в ресторане;
Есть у нас телевизоры, показывающие статус заказа. И есть возможность завести себе длинное имя в приложении - например, в честь советского журнала "Юный натуралист". И в результате имеем очень загадочного юного натурала...
Как бы вы предложили это пофиксить?
И какие еще можете придумать имена, которые будут забавно обрезаться по маске {12 символов}{3 точки}? 😁
Есть у нас телевизоры, показывающие статус заказа. И есть возможность завести себе длинное имя в приложении - например, в честь советского журнала "Юный натуралист". И в результате имеем очень загадочного юного натурала...
Как бы вы предложили это пофиксить?
И какие еще можете придумать имена, которые будут забавно обрезаться по маске {12 символов}{3 точки}? 😁
😁42🤣1