惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
Google DeepMind News
Google DeepMind News
Hugging Face - Blog
Hugging Face - Blog
D
Docker
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
Project Zero
Project Zero
Engineering at Meta
Engineering at Meta
J
Java Code Geeks
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Simon Willison's Weblog
Simon Willison's Weblog
S
Security Affairs
NISL@THU
NISL@THU
T
Tor Project blog
A
About on SuperTechFans
宝玉的分享
宝玉的分享
腾讯CDC
S
Schneier on Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Privacy & Cybersecurity Law Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Stack Overflow Blog
Stack Overflow Blog
P
Privacy International News Feed
雷峰网
雷峰网
C
Cyber Attacks, Cyber Crime and Cyber Security
Vercel News
Vercel News
Cisco Talos Blog
Cisco Talos Blog
D
DataBreaches.Net
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Google Online Security Blog
Google Online Security Blog
Recorded Future
Recorded Future
L
LINUX DO - 热门话题
Microsoft Security Blog
Microsoft Security Blog
Latest news
Latest news
C
Check Point Blog
有赞技术团队
有赞技术团队
T
The Exploit Database - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
云风的 BLOG
云风的 BLOG
SecWiki News
SecWiki News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
爱范儿
爱范儿
月光博客
月光博客
V
Vulnerabilities – Threatpost
T
Threat Research - Cisco Blogs
P
Palo Alto Networks Blog
T
The Blog of Author Tim Ferriss
C
Cisco Blogs
Webroot Blog
Webroot Blog
S
Security @ Cisco Blogs

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Лайфхаки по быстрому написанию автотестов или пишем автотесты без боли
NoiseOR · 2026-06-01 · via Все публикации подряд на Хабре

Лайфхаки по быстрому написанию автотестов или пишем автотесты без боли

Простой

6 мин

5.5K

Привет, Хабр. Меня зовут Виталий Стародубцев. Я ведущий QA-инженер в СберЗдоровье — MedTech-компании №1 в России.

Написание и использование автотестов — базовая практика в разработке и продвинутая — в тестировании. Но подходы к их написанию и отладке зачастую вызывают боль у специалистов. Остаётся много проблемных мест: долгие ожидания при запуске и перезапуске, нестабильность сервисов, ошибки из‑за устаревших версий библиотек. В результате даже опытные инженеры тратят больше времени, чем могли бы. 

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

Начнем с азов: общие рекомендации

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

Горячие клавиши

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

  • command + C и command + V — стандартные копировать/вставить (куда же без них);

  • command + Shift + V — вставляет текст без форматирования;

  • command + X — вырезает выделенный текст/строку;

  • command + D — копирует и сразу вставляет строку/выделенный текст;

  • command + O — выполняет поиск классов/методов;

  • option + ЛКМ — выполняет метод/получение данных из переменной (тоже самое, что выполнить через Evaluate Expression);

  • command + N — генерирует основные методы, конструкторы;

  • command + ? — комментирует/раскомментирует "//" выделенные строки;

  • command + shift + N — создает временные файлы. Полезно, когда нужно проверить код, потому что файл не затрагивает проект; 

  • command + option + L — команда для выравнивания текста, удаления; импортов и просто чистки. Полезно выполнять после того, как все в классе написано;

  • command + shift + U — приводит выделенный текст к верхнему/нижнему регистру;

  • fn + shift + F6 — команда для редактирования имени переменной/метода/класса (меняет сразу во всех местах, где используется).

Брейкпоинты

Перезапуск тестов занимает время, поэтому можно поставить код на брейкпоинт и описывать локаторы, методы и классы прямо во время выполнения теста.

На следующем запуске останется только проверить:

  • корректность локаторов;

  • работу методов;

  • корректность логики теста.

Это значительно ускоряет разработку и помогает с дебагом.

Если хочешь узнать о том, какие задачи мы решаем — заходи в ТГ-канал SberHealth IT :)

Умные брейкпоинты (Condition Breakpoints)

Помимо простых, есть еще и умные брейкпоинты: когда ставите брейкпоинт и нажимаете на него, появляется окно, где можно указать условие, при котором выполнение кода остановится.

Как это можно использовать?

Например, тест падает на строке не всегда, а только при определенных обстоятельствах. Чтобы не перезапускать тест много раз, можно указать условие, по типу:
patient == null

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

Evaluate Expression (option + fn + F8)

Мощный инструмент. Он позволяет писать и выполнять код прямо во время выполнения теста, пока оно остановлено на брейкпоинте.

Так, без изменения кода проекта можно:

  • вызвать методы;

  • проверить значения переменных;

  • выполнить кусок логики;

  • протестировать локатор.

Работа со Stack Trace

Stack Trace — очень полезная штука. Неважно, где он получен — в CI, логах или в консоли. Его можно просто вставить в проект.

IDE автоматически:

  • распознает классы;

  • подсветит строки;

  • позволит перейти в место падения.

Синим цветом выделены классы и строки, которые есть в проекте — на них можно воздействовать.

Серым цветом выделены классы библиотек или системных компонентов. Их изменить нельзя, но можно поставить там брейкпоинт, чтобы посмотреть, что происходит.

Плагины

Плагины могут очень сильно ускорить разработку.

Например, может быть полезен @mega_generator_plugin — плагин, позволяющий быстро создавать DTO и DAO (спасибо Нечаеву Антону).

Также стоит посмотреть плагины для:

  • генерации тестовых данных;

  • форматирования кода;

  • работы с JSON;

  • генерации Page Object.

Мобильные автотесты

Автоматизация тестирования мобильных приложений имеет ряд особенностей по сравнению с веб.

Это обусловлено тем, что в мобильных тестах добавляются дополнительные факторы нестабильности:

  • разные версии ОС;

  • разные размеры экранов;

  • особенности эмуляторов и симуляторов;

  • нестабильность драйверов;

  • долгий запуск приложений;

  • проблемы с кешем устройства.

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

Далее несколько практических советов, которые реально экономят время.

Использование устройства как в CI

Могут возникать ситуации, когда тесты проходят локально, но падают в CI.
Это может быть обусловлено тем, что отличаются:

  • версия ОС;

  • модель устройства;

  • разрешение экрана;

  • версия симулятора/эмулятора.

Поэтому желательно использовать такую же конфигурацию устройства, как в CI.

Это позволит:

  • избежать различий в верстке;

  • уменьшить количество проблем с локаторами;

  • снизить количество нестабильных тестов.

Использование более свежих версий APK / IPA

Желательно использовать последнюю сборку приложения. Это позволит быстрее заметить изменения и обновить тесты, даже если разработчики изменили локатор, поменяли структуру экрана или добавили новый элемент.

Чистка кэша эмулятора / симулятора

Эмуляторы и симуляторы сохраняют данные приложения между запусками. Это может приводить к разным проблемам. Например:

  • приложение не запускается;

  • приложение падает;

  • тесты ведут себя нестабильно;

  • ломается авторизация.

Но иногда решить проблему можно довольно быстро. Достаточно:

  • очистить данные приложения;

  • сбросить симулятор;

  • перезапустить эмулятор.

Актуализация версий Appium, драйверов и XCUITest / UiAutomator

Стабильность автотестов сильно зависит от версий Appium, драйверов и XCUITest / UiAutomator. Причем иногда после обновления Appium драйверы нужно обновлять отдельно.

Полезные команды:

  • appium driver list;

  • appium driver update.

Если тесты начали падать без изменений в коде, почти всегда стоит проверить версии.

Полезные аргументы Appium

Помочь в работе могут и некоторые аргументы Appium.

  • appium:newCommandTimeout: 9000. Если выполнение остановилось на брейкпоинте, драйвер может закрыться из-за таймаута. Этот параметр увеличивает время ожидания команды. Очень удобно во время дебага.

  • appium:platformVersion: 18.0. Иногда симулятор iOS может не запускаться из-за конфликта версий. Явное указание версии платформы часто решает проблему.

  • appium:simulatorStartupTimeout: 300000. Бывает, что симулятор запускается очень долго. Этот параметр увеличивает время ожидания запуска.

  • appium:fullReset: false. Аргумент позволяет не перезапускать эмулятор каждый раз. Это сильно ускоряет запуск тестов.

Использование Page Object

Использование Page Object — базовая практика, но её часто игнорируют. Page Object позволяет:

  • вынести локаторы в отдельный класс;

  • переиспользовать код;

  • уменьшить количество дублирования.

К тому же, при изменении локатора нужно поменять одну строку, а не десятки тестов.

Использование deep link

Если приложение поддерживает deep links, можно значительно ускорить тесты.
Например, вместо того, чтобы открыть приложение, указать логин и перейти на нужный экран, можно сразу открыть экран, используя myapp://profile. 

Это экономит десятки секунд на каждом тесте.

Корректное добавление ожиданий 

Одна из частых причин нестабильности тестов — неправильные ожидания.

Лучше использовать:

  • explicit wait;

  • ожидание появления элемента;

  • ожидание кликабельности.

При этом желательно избегать Thread.sleep(), поскольку это замедляет тесты и делает их нестабильными. 

Заключение

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

Есть ли у вас свои лайфхаки или полезные инструменты? Обязательно делитесь ими — возможно, именно ваши советы помогут кому-то сэкономить несколько часов.