LikeaDuck🦆 – Telegram
LikeaDuck🦆
1.46K subscribers
65 photos
3 videos
97 links
Дима Тучс (https://news.1rj.ru/str/dtuchs). QA директор в DODO, спикер и программный комиттёр на конфах, создатель авторского курса QA.GURU Advanced. Здесь будет об IT, QA, менеджменте и немного обо мне.
Download Telegram
#graphql

Как известно, спецификация graphql предусматривает информирование об ошибке одновременно с возвратом той части данных, которые удалось получить. И, в связи с этим, референсная frontend библиотека apollo даже имеет три стратегии обработки таких ответов:

1️⃣ игнорировать errors, если пришло хоть что-то в data
2️⃣ игнорировать data, если пришло хоть что-то в errors
3️⃣ не игнорировать ничего (и data и errors предлагается обрабатывать самостоятельно как вы хотите)

Глядя на эти политики, меня не покидает ощущение, что варианты 1️⃣ и 2️⃣ как будто сужают спецификацию, что для меня бы, как гипотетического бэкендера, выглядело странно: почему ты игнорируешь то, что я старательно тебе вернул? 😁

А вариант 3️⃣ представлен красивым примерчиком frontend-кода:
function ShowingSomeErrors() {
const { loading, error, data } = useQuery(MY_QUERY, { errorPolicy: "all" });

if (loading) return <span>loading...</span>;
return (
<div>
<h2>Good: {data.goodField}</h2>
<pre>
Bad:{" "}
{error.graphQLErrors.map(({ message }, i) => (
<span key={i}>{message}</span>
))}
</pre>
</div>
);
}


Внимание вопрос
: если вы работаете с GraphQL, то какая стратегия обработки ошибок используется у вас?
И, если это 3️⃣ (не игнорировать ничего), то весь ваш фронтенд действительно обмазан и обработкой data, и обработкой error для всех запросов, где есть nullable fields?
😁2👍1
Копаясь в вещах случайно обнаружил завалявшуюся часть своих бэйджиков с конференций.

Моей первой крупной конференцией, не считая митапов, был Heisenbug весной 2018 года, где я сразу занял почетное 8 место 😁 из 30+ докладов.

Сейчас за спиной уже около 20 конференций, три программных комитета (прямо сейчас мы готовим QA секцию Codefest.15, пишите, если интересно выступить✍️ ), но, сил делать доклады сейчас почти не осталось. Всю свою энергию рассказывать и делиться я трачу на запись ~50 видосов своего авторского курса. Записывать приходится по вечерам и ночам, вид у меня (как говорят) - усталый, но, таким образом я оцифровываю весь свой технический QA опыт, который неизбежно будет таять с этим менджерством, в котором я уже 4-й год. Об этом, кстати, ни разу не жалею🤘

Предлагаю в треде делиться своими любимыми спикерами и докладами, на любые IT темы. Свой список тоже напишу ⬇️
👍18🔥106
Баг или фича IDEA? Не могу понять 🫤
Раз уж выяснилось, что треды к постам работают как-то странно, то дублирую отдельным постом мой топ спикеров, которых рекомендую к просмотру 📺

Итак, мой топ спикеров (в случайном порядке, со ссылками на некоторые доклады):

Андрей Солнцев - доклады из серии WTF {что-то} - простыми словами про тредпулы, конекшнпулы, архитектуру и кучу всего еще. Доклады про TDD, крутые воркшопы для начинающих;

Владимир Ситников - любые технические доклады про JVM мир. Один из топовых инженеров, кто регулярно делится экспертизой;

Алексей Шипилёв - самое понятное объяснение действительно сложных нюансов JVM - тут про GC, про устройство стринга под капотом и прочие виртуальные потоки;

Егор Бугаенко - если вы считаете его доклады бредом, то вы - это я лет 8-10 назад. Пересматривая его доклады сейчас, я думаю что это ценнейший материал для того, что бы перосмыслить свой код, свои привычки, свой менджмент и это один из тех, ради кого бы персонально я пошел бы и купил билет на конфу;

Евгений Борисов - тут просто топ-1 спикер на русском про Spring, но и не только о нем есть его доклады;

Вячеслав Смирнов - любой доклад технически грамотен, выверен и интересен. Особенно запомнились доклады про JMeter, websocket;

Никита Липский - не самое простое, но интереснейшее погружение в JVM и не только;

Тагир Валеев - тот у кого вы можете бесплатно учиться Java, и автор очень интересных докладов про фичи JDK (и если лень читать релиз ноутсы), тонкости Stream API ;

Евгений Пешков - один из немногих в моем списке совсем не джавист, интересно про перформанс С# и не только;

Иван Пономарёв - очень приятно слушать, темы интересные (есть доклады про testcontainers, про Java и Kotlin)

Роман Елизаров - перед тем, как читать Java Concurrency in Practice, посмотрите его видео про теорию многопоточного программирования, и скорее всего - вы не сможете остановиться
🔥61👍1062
LikeaDuck🦆 pinned «Раз уж выяснилось, что треды к постам работают как-то странно, то дублирую отдельным постом мой топ спикеров, которых рекомендую к просмотру 📺 Итак, мой топ спикеров (в случайном порядке, со ссылками на некоторые доклады): Андрей Солнцев - доклады из серии…»
Писать ли тесты на том языке, на котором сделан продукт

Этот вопрос все еще иногда мелькает в обсуждениях. И даже вызывает холивары🙂

Есть три обстоятельства, которые помогают найти нам ответы на этот вопрос:

1) Мобильная автоматизация уже отменила этот выбор де-факто, апиум умрет, у него нет выбора. Поэтому тут только Kotlin и Swift, и если вы работаете или планируете работать с мобилками - уже можно и нужно приучаться к одному языку со своим проектом. Но, что если вам не нужна мобилка или вы почему-то имеете аргументы в пользу appium?

2) Рынок труда. Заколебешься искать QA auto с чем-то, кроме питона, джавы или JS/TS. Почему? Ну, а) курсы и б) джуны пишут свой первый автотест в компании синьеров, которые тоже учили питон, джаву или JS/TS. И смотрят на них. Короче, замкнутый круг, и если у нас продукт на GO, Rust или даже очень распространенных PHP и C# - то экономически и менеджерски может быть выгодно тупо писать тесты на чем-то другом. Мы так и делали в PropellerAds: сервисы на Go и что-то на PHP, тесты - на Java. Но это именно менеджерское и экономическое решение, а не потому, что питон или джава созданы всевышним для автотестов.

3) Польза для компании, улучшение dev experience, итоговое качество продукта - на мой взгляд растет, если QA и разработчики буквально общаются на одном языке. Если QA ставит свой апрув на PR разработчика и наоборот. Именно QA инженер должен влезать в код разработчика, а не разработчик "якобы поможет нам с тестами". Чуете разницу? Аргументация "выберем язык бекенда, нам помогут написать автотест" - в большинстве случаев ложная, разработчику своих дел хватает. А вот "освоим язык и платформу своего продукта что бы глубоко разобраться как он работает" - крутая аргументация, у нее только один недостаток - QA инженеру приходится не сидеть на жопе ровно с питоном или джавой, а изучать постоянно что-то новое 😁

А вы как думаете?
👍374🔥4
Опять рубрика "Баг или Фича" в IDEA:

1) Имеем JUnit Extension, который кладет в context List<CategoryJson> :
final List<CategoryJson> result = new ArrayList<>();
context.getStore(NAMESPACE).put(
context.getUniqueId(),
result
);


2) Имеем желание прокинуть этот List<T> через ParameterResolver в виде массива в аргументы теста:
  @Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return parameterContext.getParameter().getType().isAssignableFrom(CategoryJson[].class);
}

@Override
@SuppressWarnings("unchecked")
public CategoryJson[] resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return (CategoryJson[]) extensionContext.getStore(NAMESPACE).get(extensionContext.getUniqueId(), List.class)
.stream()
.toArray(CategoryJson[]::new);
}


3) А теперь самое интересное 🙂 Этот код - работает, но IDEA его подсвечивает: Can be replaced with Collection.toArray(). Соглашаемся, и наш метод resolveParameter принимает вид:


1️⃣было :
    return (CategoryJson[]) extensionContext.getStore(NAMESPACE).get(extensionContext.getUniqueId(), List.class)
.stream()
.toArray(CategoryJson[]::new);

2️⃣стало :
return (CategoryJson[]) extensionContext.getStore(NAMESPACE).get(extensionContext.getUniqueId(), List.class).toArray();


И тест с таким кодом не запускается, мы имеем ошибку:

java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [...model.CategoryJson; ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; [...model.CategoryJson; is in unnamed module of loader 'app')


C точки зрения моего понимания - все ок, мы действительно потеряли Method Reference CategoryJson[]::new и теперь наш массив имеет тип Object[] (хотя под капотом там на самом деле CategoryJson[] 🥲), но, потеряли-то мы его просто согласившись через ALT + ENTER с подсказкой IDEA. При этом весь контекст (в виде type casting), казалось бы, есть - ну убери просто лишний stream(), зачем убирать CategoryJson[]::new ?
🤔21
Ребят, если есть пара минут, пройдите, пожалуйста, опрос от нашего ДОДО-шного QA Mobile лида, на предмет - интересно ли вам что-то поизучать по специфике Mobile тестирования, быть может, сделаем что-то крутое по итогу 🙌
👌3
Forwarded from iOS Automation Testing
Ребята, всем привет!

Появилось желание создать курс по мобильной автоматизации, и хочется собрать информацию о том, что сейчас наиболее востребовано. Для этого я подготовил небольшой опросник, чтобы понять, на какую тему сделать курс: нативная мобильная автоматизация, кроссплатформенная или всё вместе.

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

Если вам тоже интересно, что сейчас происходит на рынке мобильной автоматизации, поддержите инициативу — делайте репост!

Спасибо всем! 🚀
🔥32
Предлагаю угадать целиком заголовок слайда с одного из online занятий Дмитрия. Или тему занятия. В качестве приза - экскурсия по офису Додо (Алматы, Москва или Питер, о дате и времени договоримся) и пиво за мой счет 🍺
😁2
Итак, определить справеделивого победителя предыдущего соревнования не удалось (а на кону - экскурсия в офис ДОДО в Мск / Спб / Алматы и пиво за мой счет после этого в баре), поэтому, я написал класс Konyagi. Там все, кто отметился в комментариях. Завтра в 15-00 по московскому времени будем разыгрывать в прямом эфире 🚀
🎉21😁11🔥7😱3
А тем временем, у нас открыта вакансия Senior Backend QA 🚀- в самый высоконагруженный и важный для бизнеса сервис - MAPI (бэкенд нашего мобильного приложения Dodo Pizza).

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

Что хотим?

Внедрить и бдить процесс canary релизов, плотнее интегрировать имеющиеся тесты в релизный цикл мобильного приложения, следить за изменениями, контрактами, кволити гейтами. В общем, нужно иметь не только технические скиллы, но и понимать процессы, быть в известной мере самостоятельным бойцом.

Рассматриваем хороших инженеров и без опыта в C#, но готовых получить этот опыт у нас. Если интересно и есть вопросы - пишите в тред или в ЛС.
🔥118
Итак, в 17.00 по Москве начнем в прямом эфире розыгрыш экскурсии и пива для коняг 😈
😈4👌1
Live stream scheduled for
Live stream started
Live stream finished (3 minutes)
Возникла идея 💡

У меня давно есть мысль: написать немного кода в Allure (переписать свой же PR по gRPC), и в Retrofit - создать SOAP Converter. Без подготовки, с нуля, с дебагом, запусками перезапусками, с юниттетстами и вот этим всем. Ниже будет опрос, интересно ли вам было бы посмотреть на такое в прямом эфире? Послушать что я делаю, как мыслю, как дебажу, как тестами покрываю? Может быть, вы даже не против немного донатить на такие трансляции?
🔥56