Валерий | AQA Engineer | Автотестирование на Python | REST, gRPC, GraphQL
رفتن به کانال در Telegram
Сделаю из тебя крутого AQA инженера на Python. • Преподаю лучшие тренинги по автоматизации тестирования API • Senior Python developer | AQA lead, 7 лет в IT
نمایش بیشتر1 505
مشترکین
+224 ساعت
اطلاعاتی وجود ندارد7 روز
-430 روز
آرشیو پست ها
Привет)
Очень долго у меня просили курс по автоматизации тестирования брокеров сообщений, как говорится обещанного 3 года ждут.
Но прошел год так что я еще уложился)
Учитывая мою нагрузку к сожалению получается выдавать не более одного тренинга в год.
Каждый тренинг, это проработка и разбивка материала на атомарные блоки, где каждый логично перетекает из одного в другое. Код в процессе подготовки переписывается по несколько раз, чтобы в процессе были учтены все моменты и видео было четким и лаконичным.
В общем курс готов, осталось немного причесать.
Что будет?
Kafka, RabbitMQ, продюсеры, консюмеры, паттерны (все как я люблю), потоки, тестирование, E2E - всё то, с чем мы регулярно сталкиваемся в реальных проектах.
Сразу обозначу:
это не курс для начинающих. Он рассчитан на тех, кто уже умеет писать код, работал с Python и хочет глубже разобраться, как всё это живёт в реальных системах, а не только в примерах из документации.
Это будет не просто «как отправить сообщение», а:
• зачем вообще нужны брокеры и где их реально применяют
• как с ними работать с точки зрения тестирования.
• работа с многопоточным кодом
• немного паттернов и архитектуры, без академического занудства.
Сейчас допиливаю контент и в ближайшее время сверстаю лендинг с подробной программой и форматом участия.
👉 Старт планируется в феврале.
Делаю курс таким, каким сам хотел бы видеть: практичным, честным и максимально приближенным к продакшену.
Скоро расскажу больше деталей 👀
Всем привет! У кого, как и у меня, работы под конец года подвалило
Я тут с подарочками)
Во-первых, я закончил записывать курс по тестированию брокеров сообщений ✍️.
Знаю, многие ждали - видео полностью готовы (самая сложная часть позади). Осталось залить на платформу и наваять лендинг.
Так же хочу напомнить про свой опенсорс restcodegen.
В последней обнове я выпилил лишние зависимости, переехал на другой парсер, так что пакет стал легче и теперь будет меньше конфликтов.
pbreflect - пофиксил баги, которые были связаны с использованием annotation.proto, и библиотека стала стабильнее.
Выпустил новый релиз e2efast - теперь фикстуры резолвятся автоматически и без багов (по крайней мере пока).
Планирую добавить, чтобы в конфиг автоматически проливался хост, а не руками заполнять.
Но для этого надо поправить парсер в restcodegen, поэтому пока всё по-старинке — хост руками.
Напомню:
• restcodegen - библиотека для генерации клиента к REST API по спецификации OpenAPI 3
• pbreflect - библиотека для получения протофайлов по URL с использованием gRPC-рефлексии и генерации клиентов
• e2efast - фреймворк для быстрого развертывания каркаса автотестов для REST-сервисов (генерация клиентов, фикстур, тестов)
В общем: пользуемся, говорим спасибо 😎 и ждём открытия продаж курса по брокерам!
Будете читать карьерный гороскоп на 2026 или пойдёте на эфир @qa_guru?
Чтобы вы лишний раз не гадали, Стас Васенков — основатель школы — зовёт всех на карьерный вебинар.
Вы проберётесь сквозь чащу трендов и фейлов уходящего года — прямо к прогнозам на 2026.
Ну и по классике — вновь достанется соискателям на позицию QA-инженера. Будет прожарка свежих резюме:
• покажут основные ошибки в составлении,
• объяснят, на что обратит внимание HR,
• вместе с вами разберут, как и что исправить в резюме.
Занимайте место по этой ссылке и зовите коллег 🤩🤩🤩
Repost from 📚 ProTestingInfo 🔷 Канал по тестированию 📚
+1
🎆Сегодня День Рождения телеграмм каналу @protestinginfo!
5️⃣😚☺️😝!
2 декабря был день рождения аккаунту protestinginfo в нельзяграме!
Также присоединяйтесь. 💻
Ровно 5 лет назад я укладывала старшего сына спать (ему было 2 месяца) и думала о работе, скучала. И сейчас скучаю, хотя скоро выхожу на частичную занятость в декрете 🔥
Так вот, я думала, что начинаю забывать основы тестирования, плюс, казалось, что дни становятся однообразными, и я загорелась желанием завести блог по тестированию.
Я начала придумывать, а как же назвать мой аккаунт, первое, что пришло в голову «ND_testing» (ND - Nadezhda Dudnik), потом начала смотреть какие ещё каналы по тестированию есть, и их оказалось много, и, по наблюдению, я придумала «ProTestingInfo»😉.
Затем я начала думать, как же нарисовать мой первый логотип.
Я изначально хотела, чтобы логотип был тёмно-синий - мой любимый цвет.
В оформлении постов мне помогает и поддерживает моя сестра Любочка, и эта картинка с днем рождения оформлена ею.
Я горела желанием собирать любую информацию, помогать себе и другим людям.
Мне нравится придумывать тесты, проводить вебинары, а сейчас есть не только курс по подготовке к собеседованиям и мини-программы, а курсы по тестированию бэкенда, тестированию gRPC API, GraphQL API, и хочется отдельно выразить благодарность Валерию Меньшикову за наше партнерство.
Занимаюсь менторской деятельностью, и более 40 менти получили оффер за 2025г, и до сих пор направляю людей, пока есть возможность.
🩷Хочу выразить благодарность коллегам-блогерам, которые рекомендуют мой блог, мне очень приятно и также ценю.
💚Также я хочу выразить огромную благодарность всем вам, что подписались на мой канал, я это очень ценю!🤗💜
❤️Хочу поблагодарить за то, что вы со мной. Спасибо, что читаете, поддерживаете, крепко всех обнимаю.🥰
Я также буду продолжать заниматься созданием тестов, написанием полезных постов и статей!
Делиться полезной информацией!😎
Спасибо за ваши отзывы.
Люблю свое дело🫶.
Желаю всем вам развития!❄️
Благодарю за ваши реакции, комментарии и обратную связь. Ценю.
А кто недавно на моем канале, предлагаю прочитать пост про знакомство.
Будем дальше закреплять наши знания ⚡️!
Привет ребят, сегодня такой завал, хотелось подвести какие-то, но наверное уже не успею)
По поводу чего спросите вы?
Сегодня у меня День Рождения)
И вы уже сделали мне подарок, наконец-то набралось 1400 человек, ну если хотите сделать еще меня порадовать поделитесь ссылочкой на мой канал со своими коллегами.
А я и дальше смогу делиться с вами хорошим техническим контентом и классными тренингами)
Спасибо что в этот день вы со мной)
Привет!
Как и обещал - зарелизнул первую итерацию своего фреймворка для генерации автотестов.
Что он уже умеет?
Берёшь свою swagger/openapi спеку, одна команда и у тебя готов:
- проект с клиентами
- фикстурами
- тестами
- конфигами.
Без нейросетей, чистый, детерминированный результат.
По факту:
• создает проектную структуру
• пишет фикстуры
• пишет тесты
• пишет конфигурацию
• и всё это одной командой
Погонять можно уже сейчас, фреймворк рабочий.
А как им пользоваться - скоро запишу занятие в ступень Профешнл.
С момента релиза - почти 1000 скачиваний, практически без рекламы.
Если не заброшу (а я вроде не собираюсь) - кто знает, может когда-нибудь станет таким же популярным, как FastAPI. А чего нет?)
Следующая итерация: gRPC + Postgres.
Посмотреть пример проекта, который генерится одной командой - вот тут, достаточно только указать URL сервиса и всё взлетает 🔥
Привет, давненько меня не было.
Так вот, хочу рассказать о чем. Пару лет назад у меня возникла идея разработать опенсорс-фреймворк, что-то типа Django или FastAPI. То есть, что-то, что позволит быстро и удобно разработать автотесты. У меня было несколько подходов, и я даже написал такой фреймворк, который уже есть на PyPI, но не скажу, как он называется.)))
Проблема была в том, что я пытался сделать все и сразу, и было тяжело его развивать. Плюс, у меня был богатый опыт в автоматизации, но именно как разработчика опыта было мало. За последние пару лет я многому научился и разобрался. Я решил действовать более итерационно и делать инструменты так, чтобы они были полезны как тестировщикам, так и разработчикам.
Так появились инструменты restcodegen, который по Swagger-спеке генерирует Python-клиенты. Эта библиотека в отрефакторенном виде сейчас присутствует в нашей Python-платформе, и я знаю, что используется некоторыми людьми в проектах за пределами Ozon.
Вторая важная задача заключалась в удобной кодогенерации для gRPC. Подход к генерации gRPC-кода в виде плагина я подсмотрел в нашей же Python-платформе, но чтобы сделать это open source, разработал механизм для получения proto-файлов через gRPC-рефлексию. Теперь, зная хост или IP-адрес, можно легко получить Python-клиент для выбранного gRPC-сервиса.
Так появился инструмент pbreflect, и доклад про него вы можете посмотреть здесь.
Эти инструменты будут полезны любому Python-разработчику веб-приложений.
Теперь настал этап интеграции этих инструментов в сам фреймворк для разработки автотестов. Уже готова часть для работы с REST API. Сколько он экономит времени, зависит от размера вашего API, ведь по одной спецификации генерируются клиенты, тесты и фикстуры. Пользователю остается только заполнить хост своего сервиса, и дальше все, в принципе, работает. Про сам инструмент расскажу позже. Что меня удивило, так это то, что за неделю количество скачиваний составило больше 600. Пока это рекорд из всех моих библиотек. Некоторым подписчикам я уже даже дал потестить, но прошу здесь не спойлерить, об этом расскажу позже!
+3
Хочу поделиться некоторыми слайдами из своего будущего тренинга по брокерам сообщений.
В частности базовых проблем которые возникают при работе с Kafka в автоматизации тестирования.
А как вы тестируете и какой подход используете?
——————————-
📱 TG-сообщество
📱 Обучение
📱 Отзывы
+6
Как удобно тестировать брокеры сообщений?
Многие тестировщики при тестировании брокеров сообщений создают новое соединение перед каждым тестом. Если топиков в интеграционном тестировании несколько, то тесты выполняются очень долго, и каждое сообщение валидируется отдельно и последовательно в тесте.
Как можно улучшить, чтобы переиспользовать соединение и при этом проводить валидацию моментально при наступлении события? При этом делать это расширяемо и удобно.
Мы можем пойти немного в инженерию.
А что если у нас будет один Kafka listener, который будет вычитывать Kafka топики, и несколько подписчиков, которые при получении события (например, сообщения) будут выполнять свою логику?
Так мы с вами реализуем паттерн Observer.
Сначала реализуем Subject или наш KaflaListener, для простоты там будет один метод publish, который и будет уведомлять подписчиков Observer о наступлении событий.
Этот класс так же имеет метод регистрации подписчиков, которых можно сделать очень много.
class KafkaListener:
def __init__(self):
self._clients: list[Subscriber] = []
self._is_running: bool = False
def start(self):
if self._is_running:
raise RuntimeError("already running")
self._is_running = True
def publish(self, message: str) -> None:
for client in self._clients:
client.read_message(message)
def subscribe(self, client: Subscriber) -> None:
if self._is_running:
raise RuntimeError("already running")
self._clients.append(client)
Дальше опишем интерфейс наших подписчиков.
from typing import Protocol
class Subscriber(Protocol):
def read_message(self, message: str) -> None: ...
Теперь описываем конкретные подписчики, где можем сказать что делать при выполнении read_message, например валидацию или перекладывание в очередь.
class FirstClient:
def read_message(self, message: str) -> None:
print(f"Get message from {self.__class__.__name__}, {message}")
class SecondClient:
def read_message(self, message: str) -> None:
print(f"Get message from {self.__class__.__name__}, {message}")
class ThirdClient:
def read_message(self, message: str) -> None:
print(f"Get message from {self.__class__.__name__}, {message}")
Теперь мы можем увидеть, что при publish от нашего listener, наше сообщение попадет сразу во все подписчики.
kafka = KafkaListener()
kafka.subscribe(FirstClient())
kafka.subscribe(SecondClient())
kafka.subscribe(ThirdClient())
for _ in range(10):
kafka.publish(f"message {_}")
time.sleep(2)
Получим такой результат:
Get message from FirstClient, message 0 Get message from SecondClient, message 0 Get message from ThirdClient, message 0 Get message from FirstClient, message 1 Get message from SecondClient, message 1 Get message from ThirdClient, message 1 ...Использовать такую модель можно и в кейсе с обновлением токенов, где подписчиками будут наши клиенты, и по push-модели там будет обновляться авторизация. Изучение данного паттерна уже включено в курс по брокерам сообщений, который выйдет после Нового года. А пока вы можете изучить другие паттерны, такие как Proxy, Facade, Decorator, в курсе Advanced. 🔥Напоминаю, сегодня последний день скидок!🔥 Промокод:
FRIDAY20Чёрная Пятница уже здесь!
Только до пятницы — скидка 20% на мои авторские курсы по API‑тестированию:
📚 REST API Advanced (4 недели, 28 уроков)
📚 REST API Professional (5 модулей, продвинутый уровень)
🚀 Успей прокачать навыки и внедрить лучшие практики интеграционного и автоматизированного тестирования API.
💳 Промокод: BLACK20
⏳ Действует до 23:59 пятницы.
——————————-
📱 TG-сообщество
📱 Обучение
📱 Отзывы
В чёрной-чёрной комнате,
В чёрную-чёрную пятницу...
👻 Проснулась пугающе большая скидка — 30% на все курсы школы QA-инженеров QA.GURU!
🛍 Только 2 дня (11 и 12 ноября): скидка до 30% на всё ⬇
- Вход в IT
- Java
- Java Advanced
- Python
- JavaScript + Playwright
- Kotlin
🔥 Выбирайте курсы по автоматизации тестирования, пока скидка не растаяла!
Не знаете, что выбрать? Ребята помогут — напишите им здесь!
В чёрной-чёрной комнате,
В чёрную-чёрную пятницу...
👻 Проснулась пугающе большая скидка — 30% на все курсы школы QA-инженеров QA.GURU!
🛍 Только 2 дня (11 и 12 ноября): скидка до 30% на всё ⬇
- Вход в IT
- Java
- Java Advanced
- Python
- JavaScript + Playwright
- Kotlin
🔥 Выбирайте курсы по автоматизации тестирования, пока скидка не растаяла!
Не знаете, что выбрать? Ребята помогут — напишите им здесь!
+6
Как сделать удобно расширяемый http клиент?
Самый частый паттерн при написании логгирующей http обертки в API автотестах:
import httpx
class LogClient(httpx.Client):
def request(self, *args, **kwargs):
print(args, kwargs)
response = super().request(*args, **kwargs)
print(response.content)
return response
Потом добавляем allure степы:
class LogClient(httpx.Client):
def request(self, *args, **kwargs):
with allure.step(f"Request {args}"):
print(args, kwargs)
allure.attach(request, name="Request")
response = super().request(*args, **kwargs)
allure.attach(response, name="Response")
return response
Метод разрастается, мы опять вносим изменения в класс.
Дальше захотим добавить coverage, метрики - опять изменения.
Может быть есть способ не изменяя класс?
Решение 1: Встроенные hooks в httpx
client = httpx.Client(
event_hooks={
'request': [log_request],
'response': [log_response]
}
)
httpx уже поддерживает event hooks.
Можем передать функции, которые вызовутся до/после запроса.
Решение 2: Своя реализация
А что если захотим свой клиент?
Систему хуков можно внедрить в любой клиент - к БД или другому ресурсу.
Рассмотрим на примере httpx, как будто там нет хуков:
from typing import Callable
import httpx
from httpx import Request, Response
class Client:
def __init__(self):
self._on_request_callbacks = []
self._on_response_callbacks = []
self._client = httpx.Client()
def add_request_hook(
self, callback: Callable[[Request], None]
) -> None:
self._on_request_callbacks.append(callback)
def add_response_hook(
self, callback: Callable[[Response], None]
) -> None:
self._on_response_callbacks.append(callback)
def _run_hooks(self, value, hooks):
for hook in hooks:
try:
hook(value)
except Exception as e:
print(f"Hook error: {e}")
def request(self, method, url, **kwargs) -> Response:
request = self._client.build_request(
method=method, url=url, **kwargs
)
self._run_hooks(request, self._on_request_callbacks)
response = self._client.send(request)
self._run_hooks(response, self._on_response_callbacks)
return response
Создаем колбеки:
def log_req(request):
print(f"→ {request.method} {request.url}")
def log_resp(response):
print(f"← {response.status_code}")
def allure_req(request):
allure.attach(str(request), name="Request")
def allure_resp(response):
allure.attach(response.text, name="Response")
Регистрируем и используем:
client = Client()
client.add_request_hook(log_req)
client.add_request_hook(allure_req)
client.add_response_hook(log_resp)
client.add_response_hook(allure_resp)
client.request("GET", "https://httpbin.org/get")
Результат:
→ GET https://httpbin.org/get ← 200Что получается? Мы один раз описали интерфейс для регистрации хуков, и теперь можем добавлять сколько угодно логики, не внося изменений в класс. Код становится более стабильным и расширяемым. ——————————- 📱 TG-сообщество 📱 Обучение 📱 Отзывы
😆От клика до чека — пишем автотест на оформление заказа в Java на вебинаре QA.GURU
6 ноября в 19:00 (МСК)
Участие бесплатное, регистрация обязательна ➡
Вместе с наставником курса Java — Никитой Старковым: напишете тест, который проверяет полный путь пользователя в интернет-магазине — от авторизации до оформления заказа.Узнаете на занятии: - как выстроить логику сквозного теста; - какие ошибки чаще всего встречаются в таких сценариях; - как сделать код чище и тесты надёжнее. Карьерный консультант школы Маргарита Головко расскажет, как усилить резюме, чтобы попасть в топ-компании уже в ближайший сезон найма ⭐ 💃 Прокачайте свои навыки! Регистрация по ссылке 😎
+4
Что делать, если авторизационный токен в тестах протухает очень быстро?
На одном из вебинаров мне задали такой вопрос. Наверняка есть множество вариантов решения этой проблемы, я поделюсь одним из них — не самым технически сложным и вполне понятным для поста в Telegram.
Постановка задачи:
Представим, что у нас есть HTTP-клиент, в котором требуется авторизация:
class HttpClient:
def __init__(self): ...
def send_request(self): ...
Нам необходимо сделать так, чтобы при отправке запроса send_request всегда использовался актуальный токен.
Решение:
Создадим клиент, который отвечает за получение актуального токена.
Он запускает фоновый поток для обновления токена и имеет публичный метод для получения актуального значения:
class AuthClient:
def __init__(self):
self._thread = None
self._future = Future()
self._token = None
threading.Thread(target=self._run, daemon=True).start()
def _run(self):
while True:
# Имитируем получение актуального токена,
# который меняется каждую секунду
self._token = uuid.uuid4().hex
print(f"Updating token, {self._token}")
if not self._future.done():
self._future.set_result(self._token)
time.sleep(1)
def get_token(self, timeout: int = 5):
if not self._future.done():
self._future.result(timeout=timeout)
return self._token
Теперь доработаем наш HTTP-клиент:
class HttpClient:
def __init__(self, auth: AuthClient):
self._auth = auth
def send_request(self):
headers = {"Authorization": f"Bearer {self._auth.get_token()}"}
print(f"Sending request with headers: {headers}")
Чтобы проверить работу, подготовим простой тест:
@pytest.fixture(scope="session")
def auth_client():
return AuthClient()
@pytest.fixture(scope="session")
def client(auth_client):
return HttpClient(auth_client)
def test_update_token(client: HttpClient):
for _ in range(5):
# Каждую секунду обновляется токен
# Каждые две секунды отправляем запрос
client.send_request()
time.sleep(2)
Результат:
test_update_token
Updating token, bab545305cd2489bac157a4e902f70ad
Sending request with headers: {'Authorization': 'Bearer bab545305cd2489bac157a4e902f70ad'}
Updating token, a2e00fa7a37c4717b585e448fc74c336
Sending request with headers: {'Authorization': 'Bearer a2e00fa7a37c4717b585e448fc74c336'}
...
Итого:
Мы создали клиент, который на протяжении всей тестовой сессии актуализирует токен в отдельном потоке, не блокируя выполнение тестов. Доработали HTTP-клиент так, чтобы перед запросом он получал актуальный токен. В итоге наши тесты не развалятся, если токен протухнет в процессе их выполнения.
Ставь реакцию если понравился пост)
——————————-
📱 TG-сообщество
📱 Обучение
📱 ОтзывыВыходные в коде 💻
Каждый расслабляется по-своему. Я провел выходные за любимым делом — доработкой своих open-source проектов.
Что сделано:
✅ Закрыл issue в библиотеке для генерации клиентов по Swagger-спеке
Теперь можно:
• Указывать кастомные пути для генерации кода
• Подключать свои шаблоны
• Гибко настраивать под нужды проекта
✅ Написал новые автотесты для Awesome Tests Project
Это мой демо-проект, где я собираю примеры тестирования всех современных технологий: REST API, gRPC, PostgreSQL, Redis, Kafka. Пока там только REST))
Полезные ссылки:
🔗 Библиотека для генерации REST клиентов
🔗 Библиотека для получения proto файлов генерации gRPC клиентов
🔗 Awesome Tests Project
🔗 Мой GitHub
На моем GitHub вы найдете:
• Готовые примеры тестов
• Библиотеки для генерации клиентов
• Масштабируемую архитектуру для интеграционного тестирования
Да и вообще много можно накопать)
⭐️ Если еще не поставили звездочку — самое время!
——————————-
📱 TG-сообщество
📱 Обучение
📱 Отзывы
QA.GURU проводят финальный вебинар для продвинутых QA-инженеров на Python ⬇️
🎙️ В четверг, 23 октября, в 20:00 по МСК.
На занятии:
– создадиде API с нуля;
– разберёте FastAPI, контейнеризацию и пайплайны.
📎 Не упустите шанс прокачаться до уровня Senior+ в рамках последнего потока курса Python Advanced:
Среди преподавателей опытные автоматизаторы —
Станислав Васенков, Артём Ерошенко, Сергей Хомутинин, Дмитрий Тучс, Александр Котляр, Владислав Зингер, Валерий Меньшиков, Михаил Рубанов.➡️ Вебинар бесплатный, регистрация обязательна!
В LinkedIn встретил интересный пост в стиле "опыт, который у меня есть, но который я не пишу в резюме".
Так вот, прежде чем я стал разработчиком, я успел поработать:
С 11 до 23 лет:
- был грузчиком-экспедитором, таскал коробки и сторожил товар, чтобы его не украли во время выгрузки в магазин
- красил газовые трубы, когда у нас на районе проводили газ в частный сектор
- работал в порту разнорабочим: мыли топливные баки, красили каюты, убирали мусор и прочая работа
- работал на стройке — делали новую крышу Омскому музыкальному театру. Помню, у меня тогда еще успели взять интервью в новостях, где я говорил: "Буду друзьям показывать — видели крышу музыкального театра? Я ремонтировал!" 😄
- был проводником пассажирского поезда, ездил по маршрутам Москва—Омск—Пермь—Тюмень, месяц безвылазно в вагоне
- работал консультантом по винно-водочной продукции в магазине
- один день за 500 рублей был дегустатором пива "Клинское" 🍺
- работал сборщиком на производстве пластиковых окон
- был агентом по согласованию подключения интернета в дома
- был специалистом технической поддержки в интернет-провайдере
С 23 до 35 лет:
- инженером-конструктором на заводе
- тестировщиком
- сейчас разработчик
Очень интересный путь, конечно, у меня был — где только не успел поработать.
Если честно иногда немного завидую людям, которые сразу после университета попали в IT. Но ни капли не жалею о том, что работаю с малых лет. Знаю многие стараются уберечь своих детей, сделать их жизнь лучше, чтобы им не пришлось столько работать сколько их мамки и папки. У меня конечно пока детей нет, но я почему-то считаю работу одним из лучших способов воспитания ответственности и отношения к деньгам.
А что вы думаете поделитесь своим опытом?)
Где успели поработать до IT-шки?)
——————————-
📱 TG-сообщество
📱 Обучение
📱 Отзывы
‼️ 44 000 СТРОК КОДА ‼️
Столько напрограммировал один из моих студентов на одном из своих проектов, с использованием моего подхода к построению фрейморка.
Хороший результат, который подтверждает, что подход работает и приносит свои плоды)
Но, а сейчас уже набралась новая группа и им еще многое предстоит сделать.
Кто не успел - следите за анонсами
✅ НАБОР ЗАКРЫТ
Несколько человек взяли полный пакет REST API Advanced + REST API Professional
5 мест заняли те, кто не откладывал решение на потом.
Для тех, кто не успел:
Я понимаю, что кто-то колебался, кто-то ждал "лучшего момента".
Следующий момент будет в феврале.
Что будет дальше:
🎯 Следующие 2 месяца - интенсивная работа с группой
🎯 44 урока Advanced + Professional, сотни часов практики, персональная обратная связь
🎯 К концу октября у меня будет ещё несколько экспертов уровня SDET
Анонс следующего потока будет только здесь.
Обязательно подпишитесь на уведомления канала 🔔
——————————-
📱 TG-сообщество
📱 Обучение
📱 Отзывы
Привет)
Регистрация уже открыта. Готовы стать архитектором фреймворков?
⏰ Через 2 дня стартует новый поток REST API Advanced и REST API Professional
Когда можно записаться и когда следующий поток?
Отвечаю: записаться можно до понедельника, 23:00 МСК
следующий поток: в ФЕВРАЛЕ!
Что вас ждёт на курсе REST API Advanced:
🎯 5 недель интенсивного обучения
• 28 уроков до production пайплайнов
• Живая обратная связь по каждому домашнему заданию
🎯 Production-ready проект в портфолио
• Фреймворк с паттернами проектирования
• Docker контейнеризация + CI/CD настройка
• Coverage метрики + Telegram уведомления
• GitLab CI пайплайн
🎯 Персональное сопровождение
• Проверяю каждое ДЗ лично
• Консультации в чате курса 24/7
• Хорошо проявившим себя студентам и освоившим программу в срок, рекомендация в OZONTECH.
💎 Для амбициозных: После Advanced можете пройти REST API Professional - научитесь создавать CLI инструменты для генерации проектов одной командой. Это уже уровень "архитектора платформы".
⚡️ Ограничения:
• Максимум 5 участников (качество > количество) . Осталась всего пара мест.
• Для участия нужны базовые знания Python
Цель простая: за 2 месяца сделать из вас того самого QA, которого переманивают в другие компании.
Максимальный оффер одного из моих выпускников 460К.
И только положительные отзывы от моего обучения.
Готовы присоединиться к экспертам?
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
