<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Software-Testing.Ru Blog Aggregator</title>
<link>http://software-testing.ru/</link>
<description>Software-Testing.Ru Blog Aggregator</description>
<language>ru-ru</language>
<copyright>Copyright (C) 2009-2012 Software-Testing.Ru</copyright>

<item>
<title>Покажите мне Playwright «с нуля»</title>
<description><![CDATA[<p>Представим, что кто-то кому-то рассказывает историю о том, как он пытался нанять себе ментором одного тестировщика из Кишинёва, а тот оказался совершенно неадекватным неадекватом…</p>
<hr />
<p>…и я решил, что я буду изучать Playwright. Почему я буду изучать именно Playwright, а не автоматизацию тестирования ПО вообще — ну так в вакансиях пишут, что надо уметь в этот ваш Плайвригхт.</p>
<p style="padding-left: 40px;">Так-то я хз, как оно правильно читается, ха-ха-ха, но инглиш иззэ кэпитэл оф грэт бритэн, это я досконально знаю ещё со школы. Советское образование всегда было лучшим в мире!</p>
<p>А что приличному человеку нужно для успешной учебы?! Ментор нужен, конечно же. Пусть все, как дураки, бегают на общие курсы, а я возьму себе индивидуального ментора, он мне обстоятельно всё объяснит, и это будет моим конкурентным преимуществом. Мы будем с ним раз в неделю созваниваться (два раза, ладно) и он будет советовать мне, что учить, а что нет смысла учить, какие именно страницы в каких именно книгах читать, и будет спрашивать, как у меня идут дела, и я как разовьюсь! Ого! Да-да-да!</p>
<p>Ну и вот я вам пишу, драгэ романтикэ товарэшул молдовенескул тестировщик, а давайте вы будете мне ментором по Playwright. И по API. И по REST, чтобы три раза не вставать. Давайте раз (два раза?!) в неделю созваниваться, вы будете мне обстоятельно всё объяснять… это в ваших же интересах! Доведите меня до трудоустройства, и я сразу же вам заплачу за обучение с первой же зарплаты. Я знаю, что у начинающего зарплата будет небольшой, 1500 или 1700… ладно, 1200 долларов, я не жадный (для начала). И я сразу вам заплачу 200 евро, не обижу. Вам там, в Молдавии, много не надо, я смотрел видео либерально-уважаемой Натановны Эйдельман и знаю всё про вас и вашу страну.</p>
<p>Он, конечно, попытался накрутить себе цену и сбить меня с пути истинного. Начал спрашивать, а зачем вам вообще эта автоматизация, может быть, вы сперва научитесь (хотя бы!) тестировать. Или программировать, хотя бы, на том же JS. На что только не пойдут эти молдаване ради лишних 200 долларов…</p>
<p>Но позвольте <del>милостивый государь</del>, говорю я ему, я же знаю, что тестировать — слишком легко, а программировать — слишком нелегко. А я нашел хитрый способ пройти невредимым посередине — неведомая автоматизация манит меня и ждёт, когда я её открою для себя… Давайте же, ну!</p>
<p>А он говорит — то, чего вы хотите, звучит логично, но на деле нелогично. Вы только умеете переустанавливать винду при любой проблеме и мечтаете купить мак, якобы там ничего переустанавливать не надо… Но вы даже в настройки системы никогда не заходили! Как вы будете скрипты в Playwright писать, если вы локатор в html не найдете, даже если вам на него укажут пальцем указательным?! Почему бы вам не изучить html для начала? И на Linux посмотрите, там тоже основы несложные…</p>
<p>Каюсь, зря я ему про всё это рассказал, что умею только переустанавливать винду и мечтаю купить в Шымкенте дорогой мак занедорого, и что ничего не знаю про html. Слишком я откровенный, что поделать, страдаю человеколюбием. Мы, хабаровские, всегда от этого страдаем.</p>
<p>Вообще я слегка уставший, но изо всех сил стараюсь оставаться вежливым, ведь с молдаванами надо разговаривать как с животными — ласково, без резких движений, а то испугается и шмыгнёт в кусты… Ну я ему и говорю, мол, а зачем мне эти твои глупые html и мануальное тестирование?! Ты такой странный, такие дурацкие предложения предлагаешь… Да ты меня НЕ СЛЫШИШЬ! У мануального тестирования нет будущего, у программирования нет будущего, в будущем будут одни только клауды, я знаю… Мне нужно научиться плайрайт, или как его там! Ментор мне нужен, мееееентоооор!</p>
<p>Он уже занервничал, начал говорить про отвлеченное, мол, а вот вы про клауды говорите — какие именно? Вы про Cloud computing или про семейство ой-ай моделей Claude? А я ж не знаю, о чем он лопочет… Всякие будут, веско говорю. Оно сегодня так развивается, что ай-ой, завтра вообще будет ой-вэй. И пока все вы будете ой-ой, я буду спокойно автоматизировать. Месяц-другой. А потом переключусь на что-то поинтереснее…</p>
<p>А он всё не угомонится, он меня уже с фланга обходит — а хотите, мы просто поговорим о том, как IT устроено? У меня день свободен, я машине под лобовое стекло полиуретановый герметик загнал, спешить некуда. Могу вам рассказать, с чего всё начинается и где там нужен Плэйрайт, а дальше вы сами решите, с чего вам начать…</p>
<p>Мммм, нет, я уже всё понял, не хочет этот полиуретан поработать индивидуальным ментором. Не хотят люди деньги зарабатывать, не хотят… Ну и не надо. Я совсем уже почти договорился с одним бывшим программистом из дома напротив, так он мне устроит краткосрочные курсы по Playwright. Десят тыщ тенге за одно занятие, ну и что? Это недорого. Занятия утром и вечером, а в обед я буду заниматься дома бесплатно, я всегда имею возможность заниматься дома бесплатно и доставать свежие версии Playwright и другие полезные скрипты. В конце концов, если мне покажется недостаточно, так я всегда смогу прикупать нужное в даркнете. Пусть всякие дураки берут учебные курсы задорого. Вот я вижу, вы всегда берете учебные курсы задорого. А я могу брать их же с рутрекера, слитые, бесплатные, у меня там есть аккаунт, и они даже слитые будут лучше, чем ваши онлайн и задорого. Ваши курсы битые, а у меня будут целые, хорошие, проверенные временем курсы! Вы человек ещё молодой, вы ещё не понимаете, что главное в жизни — это устроиться с хорошими образовательными курсами… Ведь мир заполонили дурные, своекорыстные люди! Да господи же боже ж мой, ну нигде же нет от них спасения! Куда ни сунься — везде ведь они! Везде блат, по знакомству можно достать всё, а без знакомства человек ничто — особенно, если он не сумел как следует устроиться по образовательному аспекту…</p>
<p>На том и разошлись.</p>
<hr />
<p>Весь последний абзац — мой вольный парафраз из Стругацких, «Рукопись ОЗ», раздел 23-25, спич Матвея Матвеевича утром на кухне. Соррянчики, не удержался, очень уж было похоже.</p>
<h2>А кто виноват?</h2>
<p>Я, конечно же.</p>
<p>Человек проделал сложную работу и, как говорит тащ. военврач Курпатов, «оказался в конструкции» в которой он нашел изящное решение своей проблемы. Ему не нужно ни тестировать, ни программировать, он уже решил, что ему просто нужно освоить Playwright. Он всё продумал, он ВСЕХ перехитрил, он сумел выехать, он молодец, осталось только найти кого-то, кто ему покажет, что где нажимать и чтобы светлое будущее наконец-то настало.</p>
<p>А тут я со своим ненужным мнением, пытаюсь ему объяснить что-то, что превышает его уровень понимания темы (<em>винду переустановить</em>…) на невозможном для него уровне объяснения. Мог бы я поменьше рассказывать про абстрактно-игристое?! Вы же не поэт, к чему вам смотреть, как ветер колотит воду по чреву пепельно-сизых финских волн!?</p>
<p>Но я исхожу из того, что нельзя отказывать голодному в еде, а интересующемуся в объяснении. И если я могу что-то объяснить, то давай объясню, тебе потом проще будет понимать, как всё устроено и принимать взвешенные решения.</p>
<p>Я, конечно же, сказал, что если вы вообще ничего не знаете о том, как делают ПО, Playwright сам по себе не имеет смысла, что там надо будет смотреть в код html и писать команды, мол, значение этого элемента сохранить в переменную и сравнить с ожидаемым результатом. Например:</p>
<pre>let totalPrice = document.querySelector('#totalPrice').textContent;
let expectedResult = 100;

if (Number(totalPrice) === expectedResult) {
console.log("Total price: PASS");
}</pre>
<p>Вам тут всё понятно? В переменную <em>totalPrice</em> cохранить значение из элемента <em>#totalPrice</em> в виде plain text. Перевести этот plain text в число. Сравнить число из переменной <em>totalPrice</em> со значением из переменной <em>expectedResult</em>. Всё понятно человеку, который не имеет понятия, что такое html, переменные и прочие абстрактные абстракции? Оказалось, что нет. И что это всё, очевидно, лишнее. Зачем это всё?</p>
<p>Почему же я просто не сказал ему «Нет»? Человек понял только то, что его пытаются разубедить, ему показалось, что над ним издеваются. Человек хочет просто научиться Playwright. Он же не спрашивал, как оно всё устроено. Может быть, надо было просто показать ему Playwright?</p>
<h2>Это проще показать или объяснить?</h2>
<p>В основе всего тестирования ПО лежит простой принцип — залезь в настройки, поменяй их и посмотри, что получится. В древние времена тестировщиками становились люди, которые в принципе ВСЕГДА ковырялись в настройках своих компьютеров, потому что вот так в те времена всё было устроено. Сегодня всё иначе, интерфейсы и железо стали стабильно-предсказуемыми, и уже поколения людей никогда не заходили в настройки системы, и не намереваются туда заходить, ведь там всё такое сложно-непонятное, а вдруг я что-то сломаю, ненене, не буду это открывать вообще. И в настройки отдельных программ они тоже не заходят, потому что если программа не делает то, что надо, уже проще установить другую программу.</p>
<p style="padding-left: 40px;">Впервые я увидел это году в 2017-ом, наверное. Коллега установил какой-то софт для записи экрана, и тот софт нарисовал ему на экране квадрат — область, содержимое которой попадет в видеозапись. А коллега хотел записать сразу весь экран, а не квадрат. Он это ПО сразу удалил и пошёл искать аналоги.</p>
<p style="padding-left: 40px;">Я это ПО у себя установил, увидел упомянутый квадрат, ухватил его за край курсором мыши и понял, что область видеозаписи можно спокойно растянуть, передвинуть, и вообще можно нажатием одной клавиши переключиться в режим записи всего экрана — я просто посмотрел в настройки софта… И написал коллеге, мол, it works, this gizmo is adjustable! Переключись в другой режим, нажми такую-то клавишу.</p>
<p style="padding-left: 40px;">Коллега ответил, что нененене, этот софт неадекватный, он скоро найдёт другой.</p>
<p style="padding-left: 40px;">Ну ок.</p>
<p>Сам по себе Playwright — это фреймворк для написания кода, через который можно будет вызывать из небытия браузер и в этом браузере эмулировать действия пользователя, тыкать кнопки, пролистывать страницы, кликать по ссылкам и проверять наличие каких-то элементов или содержимое этих элементов. И тут надо бы объяснить, что такое фреймворк…</p>
<p>А чтобы взаимодействовать с элементами в коде html надо хотя бы немного разобраться с этим самым html. Начнём с того, что это не язык программирования, это язык логической разметки текста (Hypertext Markup Language). Там дальше есть неэпически запутанные моменты и нюансы, но в основе — нет ничего сложного, смотрите….</p>
<p>Чтобы разобраться с html, надо написать свой код, своими руками, полностью в отдельном файле, и открыть это всё в браузере и посмотреть, что получилось. Сделал три страницы, вывел текст, вывел изображения, соединил эти три страницы через линки — увидел и понял, как оно работает.</p>
<p>Заодно посмотришь, по нраву ли тебе айтишная работа — колотить код и смотреть, как он вроде бы складывается в нужное, а вот тут не получается, а вроде бы всё правильно написал, а что-то не так, а что именно не так, а почему оно, бляха, не работает… ааааа, вот почему оно, бляха, не работает, а я сделаю вот так, и оно, бляха, заработало, но не совсем так, как мне хотелось… И вот так целый день.</p>
<p>&nbsp;</p>
<div id="attachment_37063" style="width: 484px" class="wp-caption aligncenter"><a href="https://testitquickly.com/wp-content/uploads/2026/09/do-something.jpg"><img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-37063" class="size-full wp-image-37063" src="https://testitquickly.com/wp-content/uploads/2026/09/do-something.jpg" alt="C'mon, do-something…" width="474" height="266" srcset="https://testitquickly.com/wp-content/uploads/2026/09/do-something.jpg 474w, https://testitquickly.com/wp-content/uploads/2026/09/do-something-300x168.jpg 300w" sizes="(max-width: 474px) 100vw, 474px" /></a><p id="caption-attachment-37063" class="wp-caption-text">C&#8217;mon, do-something…</p></div>
<p>А потом приходят какие-то дементоры и говорят, что это мы отменяем, требования поменялись, тут будет фича вообще без требований, а тут мы еще не знаем, а вот это надо срочно переделать, а вот это не трогать. И теперь оно всё никак не заработает, потому что тут убрали, там добавили, и в целом вроде всё просто, но…</p>
<p style="padding-left: 40px;">И вот так целый день.</p>
<p>А когда понял, как устроены элементы в html — можно смотреть и понимать, как их делают программисты. Что есть параметры. Что есть классы. Что оформление элемента вынесено в общие файлы, потому что так устроен CSS (Cascading Style Sheets), а идею, силу и особенности CSS надо объяснять отдельно. Потом надо объяснить, что ты можешь открывать исходный код любого сайта и смотреть, как он устроен, и понимать, как с этим всем можно работать.</p>
<p>Пришло время идентифицировать элементы в коде, и это можно делать разными способами… которые во фреймворке Playwright реализованы так и эдак, и к ним можно обращаться или так, или эдак…</p>
<p>Одновременно с изучением html есть возможность хотя бы поверхностно потрогать <del>траву ладонями</del> основные принципы тестирования ПО. Playwright нам нужен не сам по себе, а для выполнения тестирования ПО в браузере руками робота, условно говоря. А чтобы тестировать, надо не тыркать элементы в html по-отдельности, а надо продумывать (распознавать логикой) сценарии, по которым будущие пользователи будут пользоваться нашим приложением.</p>
<p>О, самое время рассказать о том, как наши html-страницы становятся частью приложения, которое работает на сервере… И в чем разница между сайтом и сервером.</p>
<p style="padding-left: 40px;">Наверное, в том же 2017-м один из наших джунов, который уже год тестировал проект, спросил, а где именно находится наше приложение? Одни говорят, что оно на сайте, другие — что оно на сервере.</p>
<p style="padding-left: 40px;">Ну, ок. Объяснил.</p>
<p>Playwright умеет автоматически запускать и контролировать сервер, на котором находится тестируемое приложение. И оно может быть на удаленном сервере, а может работать на локалхосте. Пришло время объяснить понятие localhost…</p>
<p>Если понял за 127.0.0.1 и 192.168…, то вернемся к Playwright. Это фреймворк, который позволяет через код программно управлять браузером. Его придумали программисты, и это не единственный фреймворк подобного рода. И чтобы им управлять, вместе с изучением html и тестирования надо посмотреть в основы JavaScript (стал основным языком работы с элементами в браузере) или Python (многие считают его норм для начинающих и таки почему бы и нет). Кажется, что для этого надо сперва научиться программировать, но это только кажется. Чтобы программировать, надо не код писать, а думать как программист. Можно научиться писать код и не научиться программированию.</p>
<p style="padding-left: 40px;">Кажется нелогичным, но это логично.</p>
<p style="padding-left: 40px;">Я знаю английский язык, но от этого я не стал англичанином.</p>
<p style="padding-left: 40px;">Можно научиться играть на пианино и не быть музыкантом, для этого нужен природно-обострённый слух и надо освоить математическую грамоту музыкального мышления.</p>
<p>Вместе с основами html спокойно учим основы программирования на примере JS или Python. Само по себе это знание не сделает нас программистами. Да и вряд ли мы продвинемся дальше основ. Кто-то да, кто-то нет, заранее неизвестно, что и у кого будет получаться. Расчехляем простую рабоче-крестьянскую логику, смотрим на чужой код и разбираемся, как там все устроено. Сперва на простых примерах, затем на всё более сложных.</p>
<p>Вгрызаемся дальше. В командной работе надо будет пользоваться тем языком, которым уже пользуются другие однокомандники. Да, в одиночку можно писать скрипты для Playwright на JavaScript или на TypeSсript или на Python или на ассемблере. Но если в рабочей группе все пишут на Go — ты тоже должен писать скрипты на Go, это не обсуждается. Надо понимать основные принципы языков программирования, а не привязываться к синтаксису.</p>
<p>Далее оказывается, что для работы с общей кодовой базой надо разобраться в том, где она лежит, как её взять и как в неё добавлять свою работу — разбираемся с git (заодно глянем и на svn, не помешает понимать эту тему в принципе, а не в частностях). А для этого надо разобраться с тем, что такое файлы, где они лежат, как с ними работает твоя операционная система, а это вряд ли будет Windows. Давай объясню, как работает Linux…</p>
<p>А как работает обмен данными между серверами? Рассказать про API? Показать, что это само по себе, откуда взялось и как его трогать? Нет, я не буду ограничиваться только «я покажу тебе Postman» — надо понимать, что такое API вообще, а не отдельный софт, через который можно взаимодействовать с API.</p>
<p>И чего мы привязались к API? А реляционные базы данных кого уже давно ждут? Объяснить, почему они называются реляционными?</p>
<div id="attachment_5007" style="width: 730px" class="wp-caption aligncenter"><a href="https://testitquickly.com/wp-content/uploads/2012/01/don-t-be-a-pussy.jpg"><img decoding="async" aria-describedby="caption-attachment-5007" class="size-full wp-image-5007" src="https://testitquickly.com/wp-content/uploads/2012/01/don-t-be-a-pussy.jpg" alt="" width="720" height="621" srcset="https://testitquickly.com/wp-content/uploads/2012/01/don-t-be-a-pussy.jpg 720w, https://testitquickly.com/wp-content/uploads/2012/01/don-t-be-a-pussy-300x259.jpg 300w" sizes="(max-width: 720px) 100vw, 720px" /></a><p id="caption-attachment-5007" class="wp-caption-text">C&#8217;mon, just do something…</p></div>
<p>&nbsp;</p>
<p>Я понимаю, что эта штука делает в принципе.</p>
<p>Я понимаю, как это устроено в принципе.</p>
<p>Я понимаю, как найти локатор на странице в принципе.</p>
<p>Я понимаю, как обезопаситься от того, что этот локатор в будущем может поменять свое местоположение или переименоваться или стать видимым только после выполнения какого-то действия на странице — в принципе.</p>
<p>И вот теперь мы берём Playwright и спокойно его используем, и всё будет работать. C&#8217;mon, это уже не так уж и сложно! Заморочено, конечно, и много всякого, но в основе своей не сложно. Просто это «длинное» знание, которое приходит медленно, после изучения, привыкания и понимания простых принципов. Это не то, что можно показать на экране и сказать «Вот эту кнопку нажимай, а эту не надо трогать».</p>
<p>А если я скажу вам сразу «Нет»? Ну, вам же легче будет?</p>
<p>Привет каждому, кто приходил ко мне с запросом «<em>Научите меня тестировать…</em>», а я в ответ говорил «<em>Ок. Сделайте сайт, три страницы, давайте посмотрим, как получится и зайдёт ли оно вам…</em>» — может быть, вы уже самостоятельно попытались и поняли, что само по себе тестирование не очень сложное занятие, но сперва надо освоить некоторые очень неочевидные основы. Надо будет лезть в настройки системы и отдельных программ, смело что-то перещелкивать и понимать, что после этого поменяется, и отвечать за результат. И в какой-то момент обязательно надо будет понять разницу между сайтом и сервером.</p>
<p>Тестирование само по себе — абстрактная тема, которую рукам не пощупать. Всё IT работает на абстракциях. Учиться IT — изучить абстрактные темы, для которых в быту нет и не может быть объяснений или примеров, их надо придумывать. Но можно научиться взаимодействовать с абстракциями, можно наполнять их смыслом, придавать им смыслы, перехватывать изменение смыслов… Можно понимать, что перед тобой условные переменные, и что данные в этих переменных бывают разных типов. Нужно тестировщику это знание или нет? Или оно подразумевается, потому что это база нашей профессии?!</p>
<p>Так что да, иногда надо сразу говорить «Нет», а не пытаться объяснить, что три тысячи лет назад один древнегрек возвращался домой с рынка (по-ихнему агора) и посмотрел на звёзды…</p>
<blockquote><p>Our whole universe was in a hot dense state,<br />
Then nearly fourteen billion years ago expansion started. Wait&#8230;</p></blockquote>
<p><iframe title="Шелдон учит Пенни физике" width="665" height="374" src="https://www.youtube.com/embed/_uEnXsU6jq4?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>]]></description>
<link>https://testitquickly.com/2026/09/05/playwright-de-la-zero/</link>
<pubDate>Sat, 05 Sep 2026 05:06:57 +0300</pubDate>
</item>
<item>
<title>Как тестировать RAG-системы: методы, инструменты и метрики</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p>Если в компании появился ИИ‑помощник, чат‑бот или поиск по внутренней базе знаний, следующий логичный шаг – убедиться, что он работает надёжно. LLM часто выдают ответы уверенно, но это не гарантия точности: ошибка может возникнуть на любом этапе RAG‑пайплайна: при поиске контекста, его подготовке или при генерации итогового ответа.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":31130,"width":"320px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="707" height="649" src="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-81_11zon.png" alt="rag система" class="wp-image-31130" style="width:320px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-81_11zon.png 707w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-81_11zon-300x275.png 300w" sizes="(max-width: 707px) 100vw, 707px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Важно регулярно тестировать RAG-системы с пристрастием, чтобы минимизировать риски некорректной выдачи данных. <br><br>Читайте, чтобы узнать на что обратить внимание в первую очередь, какие метрики отражают реальную картину и как выстроить регрессионную и нагрузочную проверку так, чтобы изменения в модели, промптах или базе знаний не приводили к деградации качества.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#f7eccd"}}} --></p>
<p class="has-background" style="background-color:#f7eccd">Поскольку материал объёмный, советуем добавить страницу в закладки, чтобы возвращаться к нужным местам. <span class='font-weight-bold'>Руководителю проекта </span>хватит разделов <span class='font-weight-bold'>1, 2, 8 и 13</span> – они дадут понять, во что он ввязывается и сколько времени это займёт. <span class='font-weight-bold'>Тест‑инженерам </span>пригодятся и все остальные.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p>Вот приборная панель одного корпоративного ассистента за неделю до того, как его пришлось отключить. Все автоматические метрики зелёные, но проект провалился. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>
  .readout {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 16px;
    max-width: 800px;
    margin: 30px auto 12px;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
  }
  .readout > div {
    background: #f8faff;
    border: 1px solid #e5eaf2;
    border-radius: 12px;
    padding: 18px 16px 16px;
    text-align: center;
    transition: box-shadow 0.25s ease;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    min-height: 100px;
  }
  .readout > div:hover {
    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.06);
  }
  .readout .k {
    font-size: 12px;
    font-weight: 500;
    color: #6b7280;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    margin-bottom: 6px;
    line-height: 1.3;
    text-align: center;
    width: 100%;
  }
  .readout .v {
    font-size: 28px;
    font-weight: 700;
    color: #1f2937;
    line-height: 1.2;
    text-align: center;
    width: 100%;
    font-variant-numeric: tabular-nums;
  }
  .readout .bad {
    border-color: #fecaca;
    background: #fef2f2;
  }
  .readout .bad .v {
    color: #dc2626;
  }
  .readout-note {
    max-width: 800px;
    margin: 0 auto 30px;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    font-size: 15px;
    color: #6b7280;
    font-style: italic;
    text-align: center;
    padding: 0 16px;
  }</p>
<p>  @media (max-width: 700px) {
    .readout {
      grid-template-columns: repeat(2, 1fr);
      gap: 12px;
      padding: 0 12px;
    }
    .readout .v {
      font-size: 24px;
    }
  }
  @media (max-width: 420px) {
    .readout {
      grid-template-columns: 1fr;
    }
    .readout > div {
      padding: 14px 12px;
      min-height: 80px;
    }
    .readout .v {
      font-size: 22px;
    }
  }
</style>
<div class="readout">
<div>
<div class="k">faithfulness (RAGAS)</div>
<div class="v">0.94</div>
</p></div>
<div>
<div class="k">answer relevancy</div>
<div class="v">0.91</div>
</p></div>
<div>
<div class="k">p95 latency</div>
<div class="v">1.8 с</div>
</p></div>
<div class="bad">
<div class="k">ответов с неактуальным тарифом</div>
<div class="v">17%</div>
</p></div>
</div>
<p class="readout-note">Три из четырёх метрик вводили в заблуждение.</p>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Ассистент работал с внутренней базой банка. Говорил гладко, не придумывал цифры, всегда ссылался на документы – поэтому метрика faithfulness показывала хорошие 0,94. Но была проблема: в индексе лежали <span class='font-weight-bold'>сразу две версии тарифного сборника</span> – старая и новая. Ретривер то и дело вытаскивал старую версию, и модель честно пересказывала её – то есть, по сути, неправду.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"id":31134,"width":"277px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="711" height="756" src="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-85_11zon.png" alt="rag система" class="wp-image-31134" style="width:277px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-85_11zon.png 711w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-85_11zon-282x300.png 282w" sizes="(max-width: 711px) 100vw, 711px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">На бумаге всё выглядело идеально. А на деле каждый шестой ответ сбивал клиента с толку. При этом метрика этого не показывала: она проверяла, насколько ответ соответствует тому, что попало в контекст, а не тому, насколько он правдив.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Такие ситуации встречаются сплошь и рядом. Команда собирает RAG за полтора месяца, а потом полгода не может запустить его в полноценную работу и сама не понимает, в чём загвоздка.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Давайте разберёмся: <a href="https://quality-lab.ru/blog/perestante-schitat-bagi-sovremennye-metriki-testirovaniya-dlya-it-komand/" data-type="post" data-id="30560">какие показатели действительно важны</a>, какими инструментами их измерять, какие значения считать нормой – и что делать, когда метрики друг другу противоречат.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Раздел 1. Почему привычное тестирование не подходит для RAG-систем</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Когда QA‑специалист, привыкший к обычному бэкенду, берётся за <a href="https://quality-lab.ru/blog/ispolzuete-ii-dlya-napisaniya-koda-obyasnyaem-kak-ego-pravilno-testirovat/" data-type="post" data-id="30745">тестирование ИИ‑системы</a>, он сразу упирается в одну проблему: тут нельзя просто сравнить ответ с эталоном. Нет одного чёткого ожидаемого результата – есть целый набор допустимых вариантов. Один и тот же запрос может трижды выдать разные тексты – и все три будут правильными. А может быть так: два ответа верные, а третий выглядит правдоподобно, но при этом с ошибкой.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Дальше всплывают ещё три неприятные проблемы:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Локальная правка ломает то, чего вы не касались.</span> Например, подкрутили промпт, чтобы система перестала выдумывать сроки, – и она вдруг начала отказываться отвечать на половину обычных вопросов.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Качество и производительность тесно связаны. </span>Увеличили top‑k с 5 до 15, чтобы охватить больше вариантов, – а в итоге латентность выросла вдвое, да и точность, скорее всего, упала: модель начала «тонуть» в лишнем шуме.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Система может деградировать сама по себе.</span> Индекс пополняется, документы со временем устаревают, а вендор тихо обновляет модель под тем же именем эндпоинта. Вы ничего не меняли, а качество всё равно снижается.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Отсюда главный организационный вывод, который Barnett и соавторы сформулировали жёстко: валидацию такой системы нельзя сделать до релиза. Она возможна только в эксплуатации, а устойчивость не проектируется заранее, а накапливается со временем<sup data-fn="012a5e6c-1398-445e-a6b6-bcc51f0a0ea6" class="fn"><a href="https://quality-lab.ru#012a5e6c-1398-445e-a6b6-bcc51f0a0ea6" id="012a5e6c-1398-445e-a6b6-bcc51f0a0ea6-link">1</a></sup> . Это не отговорка, а требование к процессу. Нет замкнутого цикла: продакшен, датасет, регрессия – нет тестирования LLM. Есть приёмка демо. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Тестирование LLM – это не про проверку отдельных ответов. Это про создание надёжной системы измерений, которая останется полезной, даже если поменяется модель, изменится промпт или база знаний вырастет в десять раз. </span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Раздел 2. RAG-система по слоям</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Самая частая ошибка – оценивать RAG как единое целое. В итоге вы получаете одну цифру, которая потихоньку падает, а понять, в чём проблема, невозможно. Качество снизилось – и что с этим делать? Между вопросом пользователя и готовым ответом скрывается восемь разных компонентов, и на каждом из них могут быть сбои по разным причинам.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":31148,"width":"840px","height":"auto","sizeSlug":"large","linkDestination":"none"} --></p>
<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="309" src="https://quality-lab.ru/wp-content/uploads/2026/09/image_2026-09-04_15-16-06-1024x309.png" alt="rag система ai" class="wp-image-31148" style="width:840px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/image_2026-09-04_15-16-06-1024x309.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/image_2026-09-04_15-16-06-300x91.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/image_2026-09-04_15-16-06-768x232.png 768w, https://quality-lab.ru/wp-content/uploads/2026/09/image_2026-09-04_15-16-06-1536x464.png 1536w, https://quality-lab.ru/wp-content/uploads/2026/09/image_2026-09-04_15-16-06.png 1739w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p>Если оценивать систему целиком, все эти проблемы перемешиваются, и понять, где именно прячется сбой, становится невозможно.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>&amp;lt;br>  .tablebox {&amp;lt;br>    max-width: 1100px !important;&amp;lt;br>    margin: 30px auto !important;&amp;lt;br>    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif !important;&amp;lt;br>    background: #ffffff !important;&amp;lt;br>    border: 1px solid #e5eaf2 !important;&amp;lt;br>    border-radius: 16px !important;&amp;lt;br>    padding: 24px 28px 28px !important;&amp;lt;br>    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06) !important;&amp;lt;br>    overflow: hidden !important;&amp;lt;br>  }&amp;lt;br>  .tablebox .tbl-scroll {&amp;lt;br>    overflow-x: auto !important;&amp;lt;br>    -webkit-overflow-scrolling: touch !important;&amp;lt;br>    margin: 0 -4px !important;&amp;lt;br>  }&amp;lt;br>  .tablebox table {&amp;lt;br>    width: 100% !important;&amp;lt;br>    min-width: 700px !important;&amp;lt;br>    table-layout: fixed !important;&amp;lt;br>    border-collapse: collapse !important;&amp;lt;br>    font-size: 14px !important;&amp;lt;br>    line-height: 1.5 !important;&amp;lt;br>  }&amp;lt;br>  .tablebox caption {&amp;lt;br>    font-size: 18px !important;&amp;lt;br>    font-weight: 700 !important;&amp;lt;br>    color: #1f2937 !important;&amp;lt;br>    text-align: left !important;&amp;lt;br>    padding: 0 0 16px 0 !important;&amp;lt;br>    caption-side: top !important;&amp;lt;br>  }&amp;lt;br>  .tablebox thead th {&amp;lt;br>    background: #f8faff !important;&amp;lt;br>    font-size: 11px !important;&amp;lt;br>    font-weight: 700 !important;&amp;lt;br>    text-transform: uppercase !important;&amp;lt;br>    letter-spacing: 0.06em !important;&amp;lt;br>    color: #6b7280 !important;&amp;lt;br>    padding: 12px 16px !important;&amp;lt;br>    text-align: left !important;&amp;lt;br>    border-bottom: 2px solid #e5eaf2 !important;&amp;lt;br>    word-wrap: break-word !important;&amp;lt;br>  }&amp;lt;br>  .tablebox thead th:first-child { width: 5% !important; text-align: center !important; }&amp;lt;br>  .tablebox thead th:nth-child(2) { width: 22% !important; }&amp;lt;br>  .tablebox thead th:nth-child(3) { width: 35% !important; }&amp;lt;br>  .tablebox thead th:nth-child(4) { width: 20% !important; }&amp;lt;br>  .tablebox thead th:nth-child(5) { width: 18% !important; }&amp;lt;br>&amp;lt;br>  .tablebox tbody td {&amp;lt;br>    padding: 13px 16px !important;&amp;lt;br>    border-bottom: 1px solid #f0f2f5 !important;&amp;lt;br>    color: #374151 !important;&amp;lt;br>    vertical-align: top !important;&amp;lt;br>    word-wrap: break-word !important;&amp;lt;br>  }&amp;lt;br>  .tablebox tbody tr:last-child td { border-bottom: none !important; }&amp;lt;br>  .tablebox tbody tr:hover td { background: #fafcff !important; }&amp;lt;br>  .tablebox tbody td b { color: #1f2937 !important; font-weight: 700 !important; }&amp;lt;br>  .tablebox .num {&amp;lt;br>    font-weight: 700 !important;&amp;lt;br>    color: #6b7280 !important;&amp;lt;br>    text-align: center !important;&amp;lt;br>    font-size: 15px !important;&amp;lt;br>  }&amp;lt;br>  .tablebox .tag {&amp;lt;br>    display: inline-block !important;&amp;lt;br>    background: #f0f2f5 !important;&amp;lt;br>    border-radius: 4px !important;&amp;lt;br>    padding: 1px 8px !important;&amp;lt;br>    font-size: 12px !important;&amp;lt;br>    font-weight: 500 !important;&amp;lt;br>    color: #374151 !important;&amp;lt;br>    font-family: 'JetBrains Mono', 'Cascadia Code', 'Consolas', monospace !important;&amp;lt;br>  }&amp;lt;br>&amp;lt;br>  @media (max-width: 768px) {&amp;lt;br>    .tablebox { padding: 18px 16px 20px !important; margin: 20px 0 !important; }&amp;lt;br>    .tablebox caption { font-size: 16px !important; }&amp;lt;br>    .tablebox table { font-size: 13px !important; min-width: 600px !important; }&amp;lt;br>    .tablebox thead th, .tablebox tbody td { padding: 10px 12px !important; }&amp;lt;br>  }&amp;lt;br>  @media (max-width: 480px) {&amp;lt;br>    .tablebox { padding: 14px 12px 16px !important; border-radius: 12px !important; }&amp;lt;br>    .tablebox table { font-size: 12px !important; min-width: 480px !important; }&amp;lt;br>    .tablebox thead th, .tablebox tbody td { padding: 8px 10px !important; }&amp;lt;br>    .tablebox .num { font-size: 13px !important; }&amp;lt;br>  }&amp;lt;br></style>
<div class="tablebox">  </p>
<div class="tbl-scroll">
<table>
<caption>Точки отказа RAG: как заметить и измерить</caption>
<thead>
<tr>
<th>#</th>
<th>Что ломается</th>
<th>Как выглядит снаружи</th>
<th>Метрика</th>
<th>Инструмент</th>
</tr>
</thead>
<tbody>
<tr>
<td class="num">1</td>
<td>Ответа нет в базе</td>
<td>Уверенный ответ на вопрос, ответа на который в документах не существует</td>
<td>coverage датасета, доля «нет данных»</td>
<td>ручной аудит корпуса</td>
</tr>
<tr>
<td class="num">2</td>
<td>Парсинг</td>
<td>Таблицы превратились в кашу, сноски приклеились к тексту, из сканов ничего не извлеклось</td>
<td>доля распарсенных блоков, ошибка на таблицах</td>
<td>сверка с эталонной разметкой, Docling, Unstructured</td>
</tr>
<tr>
<td class="num">3</td>
<td>Чанкинг</td>
<td>Ответ в базе есть, но разрезан пополам между чанками</td>
<td>chunk attribution, доля «разорванных» ответов</td>
<td>эталонная привязка вопрос — чанк</td>
</tr>
<tr>
<td class="num">4</td>
<td>Запрос</td>
<td>Ломается на местоимениях, аббревиатурах, опечатках, многошаговых вопросах</td>
<td>дельта recall до и после переписывания</td>
<td>A/B на слайсе «грязных» запросов</td>
</tr>
<tr>
<td class="num">5</td>
<td>Поиск</td>
<td>Нужный чанк не попал в top-k вообще</td>
<td>recall@k, hit rate</td>
<td>ranx, ruMTEB, свой прогон</td>
</tr>
<tr>
<td class="num">6</td>
<td>Ранжирование</td>
<td>Чанк в top-k, но на 14-й позиции — модель его не увидела</td>
<td>MRR, nDCG@k, context precision</td>
<td>RAGAS, TruLens</td>
</tr>
<tr>
<td class="num">7</td>
<td>Сборка промпта</td>
<td>Контекст обрезан, релевантное ушло в середину, лимит съел половину</td>
<td>доля усечённых промптов, позиция релевантного чанка</td>
<td>трассировка: Langfuse, Phoenix</td>
</tr>
<tr>
<td class="num">8</td>
<td>Генерация</td>
<td>Контекст правильный, ответ всё равно неверный или неполный</td>
<td>faithfulness, correctness, completeness</td>
<td>RAGAS, DeepEval, LLM-судья</td>
</tr>
</tbody>
</table>
<p>  </div>
<p></div>
<p><!-- /wp:html --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dfdfe3"}}} --></p>
<p class="has-background" style="background-color:#dfdfe3"><span class='font-weight-bold'>Пример: производственная компания, поиск по техрегламентам</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Recall@10 держался на уровне 0,52</span>. Полгода перебирали модели генерации: две коммерческие, три открытые, пробовали дообучение. Разница – единицы процентов. И неудивительно: лечили <span class='font-weight-bold'>точку 8, а сломаны были точки 2 и 3.</span> Разметили 60 вопросов с привязкой к местам в документах. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Оказалось, что <span class='font-weight-bold'>40% эталонных фрагментов физически отсутствовали в индексе</span>: таблицы допусков из PDF парсер разложил в бессмысленную строку чисел. Часть ответов разрывалась между кусками – резали по 800 символам без оглядки на структуру документа. Починили парсинг таблиц, стали резать по разделам, добавили BM25 и реранкер на кросс-энкодере. <span class='font-weight-bold'>Recall@10 вырос до 0,87, faithfulness подтянулась сама – с 0,71 до 0,89.</span> Модель не трогали вообще.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":31131,"width":"249px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="945" src="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-83_11zon.png" alt="rag система ai" class="wp-image-31131" style="width:249px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-83_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-83_11zon-300x277.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-83_11zon-768x709.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Отсюда правило: прежде чем винить модель, убедитесь, что нужная информация вообще попала в промпт. Две трети жалоб решаются на этапе парсинга, разбивки на фрагменты и поиска. <br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Раздел 3. Без золотого датасета надстройки не работают</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Без размеченного набора вопросов с эталонными ответами вы не сможете <a href="https://quality-lab.ru/blog/chto-testirovat-v-pervuyu-ochered-risk-orientirovannoe-testirovanie-po-russki/" data-type="post" data-id="26579">ни отследить ухудшение качества</a>, ни сравнить разные модели, ни нормально обсудить с заказчиком, насколько хорошо работает система. Вместо фактов будет просто спор, где побеждает тот, кто громче говорит.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Что должно быть в одной записи:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Вопрос ровно в той форме, как его мог бы задать реальный человек</span> – с опечатками, сокращениями и всеми «а если по‑другому».</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Эталонный ответ от эксперта. </span>Не какой‑то безупречный текст, а чёткий список фактов, которые обязательно должны прозвучать.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Ссылки на конкретные куски источников.</span> Они помогают понять, в чём проблема: система не нашла нужную информацию или нашла, но плохо её пересказала. Без таких ссылок не получится разобраться, где именно случился сбой.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Срез: тип вопроса, подразделение, уровень сложности.</span></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Ожидаемое поведение: </span>ответить, запросить уточнение или честно сказать, что такой информации нет. Это очень важно: если в наборе нет вопросов, на которые правильный ответ – «в базе этого нет», весь набор почти бесполезен.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Сколько нужно записей?</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Допустим, вы хотите понять, насколько хорошо система отвечает: скажем, примерно в <span class='font-weight-bold'>80% случаев, плюс‑минус 5%</span>, и чтобы результат был надёжным <span class='font-weight-bold'>(с вероятностью 95%)</span>. Для этого понадобится около <span class='font-weight-bold'>250 примеров</span>. Опыт с бенчмарками это подтверждает: стабильная картина появляется где‑то на <span class='font-weight-bold'>250–500 кейсах</span>. А если взять меньше сотни – вы будете видеть случайные колебания и принимать их за реальный прогресс.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Только не надо думать, что нужно <span class='font-weight-bold'>собрать по 250 кейсов</span> для каждого среза – так вы просто утонете в разметке. Держать точность в <span class='font-weight-bold'>±5% дорого и трудоёмко</span>. Для того чтобы вовремя замечать, когда качество падает, <span class='font-weight-bold'>вполне хватает ±10% – а для этого достаточно около 60 примеров.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Срезы бывают двух видов. По крупным срезам вы смотрите общую долю удачных ответов и оцениваете её с учётом погрешности. А редкие, но очень важные случаи лучше вообще не мерить статистикой: сделайте их обязательными (must‑pass) и проверяйте вручную. Тут всё просто: либо ответ верный, либо нет.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>
  .tablebox {
    max-width: 960px;
    margin: 30px auto;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    background: #ffffff;
    border: 1px solid #e5eaf2;
    border-radius: 16px;
    padding: 24px 28px 28px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06);
    overflow: hidden;
  }
  .tablebox .tbl-scroll {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
  }
  .tablebox table {
    width: 100%;
    min-width: 600px;
    border-collapse: collapse;
    font-size: 14px;
    line-height: 1.5;
  }
  .tablebox caption {
    font-size: 18px;
    font-weight: 700;
    color: #1f2937;
    text-align: left;
    padding: 0 0 16px 0;
    caption-side: top;
  }
  .tablebox thead th {
    background: #f8faff;
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: #6b7280;
    padding: 12px 16px;
    text-align: left;
    border-bottom: 2px solid #e5eaf2;
    white-space: nowrap;
  }
  .tablebox thead th:first-child { width: 16%; }
  .tablebox thead th:nth-child(2) { width: 14%; }
  .tablebox thead th:nth-child(3) { width: 36%; }
  .tablebox thead th:nth-child(4) { width: 34%; }</p>
<p>  .tablebox tbody td {
    padding: 14px 16px;
    border-bottom: 1px solid #f0f2f5;
    color: #374151;
    vertical-align: top;
  }
  .tablebox tbody td:first-child {
    font-weight: 600;
  }
  .tablebox tbody tr:last-child td {
    border-bottom: none;
  }
  .tablebox tbody tr:hover td {
    background: #fafcff;
  }
  .tablebox tbody td b {
    color: #1f2937;
    font-weight: 700;
  }
  .tablebox .num {
    font-weight: 600;
    color: #1f2937;
    white-space: nowrap;
  }
  .tablebox .bad td:first-child {
    border-left: 4px solid #dc2626;
    padding-left: 12px;
  }
  .tablebox .good td:first-child {
    border-left: 4px solid #16a34a;
    padding-left: 12px;
  }</p>
<p>  @media (max-width: 768px) {
    .tablebox {
      padding: 18px 16px 20px;
      margin: 20px 0;
    }
    .tablebox caption {
      font-size: 16px;
    }
    .tablebox table {
      font-size: 13px;
      min-width: 500px;
    }
    .tablebox thead th,
    .tablebox tbody td {
      padding: 10px 12px;
    }
    .tablebox thead th {
      white-space: normal;
    }
  }
  @media (max-width: 480px) {
    .tablebox {
      padding: 14px 12px 16px;
      border-radius: 12px;
    }
    .tablebox table {
      font-size: 12px;
      min-width: 400px;
    }
    .tablebox thead th,
    .tablebox tbody td {
      padding: 8px 10px;
    }
  }
</style>
<div class="tablebox">
<div class="tbl-scroll">
<table>
<caption>Кол-во примеров под задачу</caption>
<thead>
<tr>
<th>Этап</th>
<th>Объём</th>
<th>Что этим можно делать</th>
<th>Чего делать нельзя</th>
</tr>
</thead>
<tbody>
<tr class="bad">
<td>Разведка</td>
<td class="num">20–50</td>
<td>Понять, куда смотреть; отловить очевидное</td>
<td>Сравнивать модели, отчитываться о качестве</td>
</tr>
<tr>
<td>Пилот</td>
<td class="num">100–200</td>
<td>Первые пороги, регресс на критичных сценариях</td>
<td>Резать по срезам — в каждом окажется по 10 записей</td>
</tr>
<tr class="good">
<td>Прод</td>
<td class="num">300–600</td>
<td>Пороги по срезам, приёмка релизов, выбор модели</td>
<td>Считать, что он не устареет</td>
</tr>
<tr class="good">
<td>Зрелый</td>
<td class="num">1000+</td>
<td>Дельты в 2–3 п.п., длинный хвост, редкие сценарии</td>
<td>Гонять целиком на каждый коммит — разоритесь</td>
</tr>
</tbody>
</table></div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Срезы важнее объёма</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Средняя оценка по датасету – почти бесполезная цифра в отчёте. Показатель 0,86 может значить разное: либо везде стабильно 0,86, либо, например, 0,95 на простых фактах и всего 0,41 на вопросах с расчётами. Это два совершенно разных уровня качества продукта.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Разбивать данные стоит минимум по четырём параметрам: тип вопроса (факт, сравнение, расчёт, процедура, отсутствующая информация), раздел базы, «грязность» формулировки и цена ошибки. Отдельно держите список must‑pass – 20–40 вопросов, провал по любому из которых сразу блокирует релиз, без обсуждений.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Откуда брать данные?</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Есть три источника, и они дополняют друг друга, а не заменяют:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Реальные обращения из тикетов и поисковых логов</span> – так вы увидите, как пользователи формулируют запросы на самом деле.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Экспертные сценарии</span> – то, что обязано работать всегда, даже если таких вопросов ещё никто не задавал.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Синтетические данные</span> (например, с помощью RAGAS) – они помогают закрыть объём и обеспечить покрытие базы документов.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"id":31132,"width":"313px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-82_11zon.png" alt="rag система ai" class="wp-image-31132" style="width:313px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-82_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-82_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-82_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-82_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Важное про синтетику: она часто создаёт вопросы, которые почти дословно повторяют текст документа. Такие легко решаются простым совпадением и сильно завышают показатель recall – иногда на десятки процентных пунктов. Обязательно перефразируйте такие вопросы и вручную проверьте хотя бы 10%. Лучше подстраховаться сразу.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#f0d2da"}}} --></p>
<p class="has-background" style="background-color:#f0d2da"><span class='font-weight-bold'>Признаки, что ваш датасет не отражает реальность:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>В нём нет вопросов, на которые правильный ответ – «не знаю».</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Все вопросы написал один человек за один вечер.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Эталонные ответы готовил тот же человек, который писал системный промпт.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Датасет три месяца не обновляли, хотя в базу добавили 4000 документов.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Он хранится в Google‑таблице без версий – никто не может сказать, какая версия использовалась для какого релиза.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Раздел 4. Метрики поиска – база для оценки RAG</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Хорошая новость: ретривер (тот самый каталог данных) тестируется как обычная поисковая система, тут за нас всё придумали ещё в девяностые. Метрики детерминированные, дешёвые, считаются за секунды и не требуют ни одного вызова LLM.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>&amp;lt;br>  .tablebox {&amp;lt;br>    max-width: 1100px !important;&amp;lt;br>    margin: 30px auto !important;&amp;lt;br>    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif !important;&amp;lt;br>    background: #ffffff !important;&amp;lt;br>    border: 1px solid #e5eaf2 !important;&amp;lt;br>    border-radius: 16px !important;&amp;lt;br>    padding: 24px 28px 28px !important;&amp;lt;br>    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06) !important;&amp;lt;br>    overflow: hidden !important;&amp;lt;br>  }&amp;lt;br>  .tablebox .tbl-scroll {&amp;lt;br>    overflow-x: auto !important;&amp;lt;br>    -webkit-overflow-scrolling: touch !important;&amp;lt;br>  }&amp;lt;br>  .tablebox table {&amp;lt;br>    width: 100% !important;&amp;lt;br>    min-width: 680px !important;&amp;lt;br>    border-collapse: collapse !important;&amp;lt;br>    font-size: 14px !important;&amp;lt;br>    line-height: 1.5 !important;&amp;lt;br>  }&amp;lt;br>  .tablebox caption {&amp;lt;br>    font-size: 18px !important;&amp;lt;br>    font-weight: 700 !important;&amp;lt;br>    color: #1f2937 !important;&amp;lt;br>    text-align: left !important;&amp;lt;br>    padding: 0 0 16px 0 !important;&amp;lt;br>    caption-side: top !important;&amp;lt;br>  }&amp;lt;br>  .tablebox thead th {&amp;lt;br>    background: #f8faff !important;&amp;lt;br>    font-size: 11px !important;&amp;lt;br>    font-weight: 700 !important;&amp;lt;br>    text-transform: uppercase !important;&amp;lt;br>    letter-spacing: 0.06em !important;&amp;lt;br>    color: #6b7280 !important;&amp;lt;br>    padding: 12px 16px !important;&amp;lt;br>    text-align: left !important;&amp;lt;br>    border-bottom: 2px solid #e5eaf2 !important;&amp;lt;br>  }&amp;lt;br>  .tablebox tbody td {&amp;lt;br>    padding: 14px 16px !important;&amp;lt;br>    border-bottom: 1px solid #f0f2f5 !important;&amp;lt;br>    color: #374151 !important;&amp;lt;br>    vertical-align: top !important;&amp;lt;br>    word-wrap: break-word !important;&amp;lt;br>    overflow-wrap: break-word !important;&amp;lt;br>  }&amp;lt;br>  .tablebox tbody tr:last-child td { border-bottom: none !important; }&amp;lt;br>  .tablebox tbody tr:hover td { background: #fafcff !important; }&amp;lt;br>  .tablebox tbody td strong { color: #1f2937 !important; font-weight: 700 !important; }&amp;lt;br>  &amp;lt;br>  /* Специально для столбца "Ориентир" — разрешаем перенос */&amp;lt;br>  .tablebox tbody td.num {&amp;lt;br>    font-weight: 600 !important;&amp;lt;br>    color: #1f2937 !important;&amp;lt;br>    white-space: normal !important;&amp;lt;br>    word-wrap: break-word !important;&amp;lt;br>    overflow-wrap: break-word !important;&amp;lt;br>    word-break: break-word !important;&amp;lt;br>  }&amp;lt;br>&amp;lt;br>  @media (max-width: 768px) {&amp;lt;br>    .tablebox { padding: 18px 16px 20px !important; margin: 20px 0 !important; }&amp;lt;br>    .tablebox caption { font-size: 16px !important; }&amp;lt;br>    .tablebox table { font-size: 13px !important; min-width: 560px !important; }&amp;lt;br>    .tablebox thead th, .tablebox tbody td { padding: 10px 12px !important; }&amp;lt;br>  }&amp;lt;br>  @media (max-width: 480px) {&amp;lt;br>    .tablebox { padding: 14px 12px 16px !important; border-radius: 12px !important; }&amp;lt;br>    .tablebox table { font-size: 12px !important; min-width: 420px !important; }&amp;lt;br>    .tablebox thead th, .tablebox tbody td { padding: 8px 10px !important; }&amp;lt;br>  }&amp;lt;br></style>
<div class="tablebox">  </p>
<div class="tbl-scroll">
<p></p>
<table>
<caption>На какие метрики поиска стоит обратить внимание</caption>
<thead>
<tr>
<th style="width:17% !important;">Метрика</th>
<th style="width:31% !important;">Что отвечает</th>
<th style="width:14% !important;">Ориентир</th>
<th style="width:38% !important;">О чём говорит просадка</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class='font-weight-bold'>Recall@k</span></td>
<td>Доля нужных фрагментов, попавших в top-k</td>
<td class="num">≥ 0.90<br />при k=10</td>
<td>Потолок всей системы. Ниже recall модель не прыгнет никогда — ответ просто не из чего собрать</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Hit rate@k</span></td>
<td>Доля запросов, где в top-k попал хотя бы один нужный фрагмент</td>
<td class="num">≥ 0.95</td>
<td>Мягкая версия recall; удобна для быстрых прогонов и мониторинга</td>
</tr>
<tr>
<td><span class='font-weight-bold'>MRR</span></td>
<td>Насколько высоко стоит первый релевантный фрагмент</td>
<td class="num">≥ 0.75</td>
<td>Слабое ранжирование: ответ есть, но лежит глубоко и тонет в шуме</td>
</tr>
<tr>
<td><span class='font-weight-bold'>nDCG@k</span></td>
<td>Качество порядка с учётом градаций релевантности</td>
<td class="num">≥ 0.80</td>
<td>Главная метрика для оценки реранкера</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Context precision</span></td>
<td>Какая доля отданного в промпт контекста реально нужна</td>
<td class="num">≥ 0.70</td>
<td>Мусор в контексте: растут токены и TTFT, падает точность</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Context recall</span></td>
<td>Вся ли информация из эталона нашлась в контексте</td>
<td class="num">≥ 0.80</td>
<td>Частичные ответы: верно, но неполно</td>
</tr>
</tbody>
</table>
<p>  </div>
<p></div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Три эксперимента, которые реально улучшают показатели. Сделайте их до того, как начинать возиться с моделью.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Гибридный поиск.</span> Векторный поиск плохо ловит точные обозначения – артикулы, номера ГОСТов, коды услуг, редкие термины. Зато с этим отлично справляется BM25. Если объединить результаты (обычно используют RRF), на корпоративных базах на русском языке recall стабильно растёт. Причина простая: в половине реальных запросов люди указывают точные идентификаторы.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Реранкер. </span>Поставьте кросс‑энкодер поверх первых 50 результатов – это самый недорогой способ поднять nDCG. Обработка занимает всего десятки миллисекунд и почти всегда себя оправдывает.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Метаданные и права доступа. </span>Добавляйте фильтры по дате, версии, подразделению. Параллельно проверьте, нет ли утечек: обязательно включите в обязательные тесты ситуацию, когда пользователь с одной ролью пытается получить доступ к документам другой роли.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>И про длину контекста. Хочется добавить побольше текста в запрос – вроде как модель лучше разберётся. Это частая ошибка. Ещё в 2023 году описали эффект «потерянного в середине»<sup data-fn="c68c5831-e683-495c-ae9c-5a49bbaae4e1" class="fn"><a href="https://quality-lab.ru#c68c5831-e683-495c-ae9c-5a49bbaae4e1" id="c68c5831-e683-495c-ae9c-5a49bbaae4e1-link">2</a></sup>: информация из середины длинного контекста хуже учитывается. А исследование context rot от Chroma подтвердило: чем длиннее входной текст, тем ниже качество ответов – это верно для всех проверенных моделей. Даже миллион токенов не убирает проблему, а лишь сдвигает момент, когда качество начинает падать<sup data-fn="333affac-4dd0-4d6e-a7e3-d9494fe19659" class="fn"><a href="https://quality-lab.ru#333affac-4dd0-4d6e-a7e3-d9494fe19659" id="333affac-4dd0-4d6e-a7e3-d9494fe19659-link">3</a></sup>. Подбирайте количество фрагментов (k) опытным путём: почти всегда есть граница, после которой лишние куски только ухудшают и точность, и скорость работы.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Раздел 5. Пять типов галлюцинаций: чем они отличаются и как их ловить</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns {"verticalAlignment":"center"} --></p>
<div class="wp-block-columns are-vertically-aligned-center"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"id":31133,"width":"287px","height":"auto","sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-86_11zon.png" alt="архитектура rag системы" class="wp-image-31133" style="width:287px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-86_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-86_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-86_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-86_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Слово «галлюцинация» в требованиях к проекту – верный признак, что требования ещё не проработаны. За этим термином скрывается как минимум пять разных дефектов, и для каждого нужно своё решение.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:html --></p>
<style>&amp;lt;br>  .tablebox {&amp;lt;br>    max-width: 1100px !important;&amp;lt;br>    margin: 30px auto !important;&amp;lt;br>    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif !important;&amp;lt;br>    background: #ffffff !important;&amp;lt;br>    border: 1px solid #e5eaf2 !important;&amp;lt;br>    border-radius: 16px !important;&amp;lt;br>    padding: 24px 28px 28px !important;&amp;lt;br>    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06) !important;&amp;lt;br>    overflow: hidden !important;&amp;lt;br>  }&amp;lt;br>  .tablebox .tbl-scroll {&amp;lt;br>    overflow-x: auto !important;&amp;lt;br>    -webkit-overflow-scrolling: touch !important;&amp;lt;br>  }&amp;lt;br>  .tablebox table {&amp;lt;br>    width: 100% !important;&amp;lt;br>    min-width: 700px !important;&amp;lt;br>    table-layout: fixed !important;&amp;lt;br>    border-collapse: collapse !important;&amp;lt;br>    font-size: 14px !important;&amp;lt;br>    line-height: 1.5 !important;&amp;lt;br>  }&amp;lt;br>  .tablebox caption {&amp;lt;br>    font-size: 18px !important;&amp;lt;br>    font-weight: 700 !important;&amp;lt;br>    color: #1f2937 !important;&amp;lt;br>    text-align: left !important;&amp;lt;br>    padding: 0 0 16px 0 !important;&amp;lt;br>    caption-side: top !important;&amp;lt;br>  }&amp;lt;br>  .tablebox thead th {&amp;lt;br>    background: #f8faff !important;&amp;lt;br>    font-size: 11px !important;&amp;lt;br>    font-weight: 700 !important;&amp;lt;br>    text-transform: uppercase !important;&amp;lt;br>    letter-spacing: 0.06em !important;&amp;lt;br>    color: #6b7280 !important;&amp;lt;br>    padding: 12px 16px !important;&amp;lt;br>    text-align: left !important;&amp;lt;br>    border-bottom: 2px solid #e5eaf2 !important;&amp;lt;br>    word-wrap: break-word !important;&amp;lt;br>    overflow-wrap: break-word !important;&amp;lt;br>  }&amp;lt;br>  .tablebox thead th:first-child { width: 18% !important; }&amp;lt;br>  .tablebox thead th:nth-child(2) { width: 32% !important; }&amp;lt;br>  .tablebox thead th:nth-child(3) { width: 24% !important; }&amp;lt;br>  .tablebox thead th:nth-child(4) { width: 26% !important; }&amp;lt;br>&amp;lt;br>  .tablebox tbody td {&amp;lt;br>    padding: 14px 16px !important;&amp;lt;br>    border-bottom: 1px solid #f0f2f5 !important;&amp;lt;br>    color: #374151 !important;&amp;lt;br>    vertical-align: top !important;&amp;lt;br>    word-wrap: break-word !important;&amp;lt;br>    overflow-wrap: break-word !important;&amp;lt;br>  }&amp;lt;br>  .tablebox tbody tr:last-child td { border-bottom: none !important; }&amp;lt;br>  .tablebox tbody tr:hover td { background: #fafcff !important; }&amp;lt;br>  .tablebox tbody td strong { color: #1f2937 !important; font-weight: 700 !important; }&amp;lt;br>&amp;lt;br>  @media (max-width: 768px) {&amp;lt;br>    .tablebox { padding: 18px 16px 20px !important; margin: 20px 0 !important; }&amp;lt;br>    .tablebox caption { font-size: 16px !important; }&amp;lt;br>    .tablebox table { font-size: 13px !important; min-width: 580px !important; }&amp;lt;br>    .tablebox thead th, .tablebox tbody td { padding: 10px 12px !important; }&amp;lt;br>  }&amp;lt;br>  @media (max-width: 480px) {&amp;lt;br>    .tablebox { padding: 14px 12px 16px !important; border-radius: 12px !important; }&amp;lt;br>    .tablebox table { font-size: 12px !important; min-width: 460px !important; }&amp;lt;br>    .tablebox thead th, .tablebox tbody td { padding: 8px 10px !important; }&amp;lt;br>  }&amp;lt;br></style>
<div class="tablebox">  </p>
<div class="tbl-scroll">
<p></p>
<table>
<caption>Таксономия галлюцинаций и инструкция по их устранению</caption>
<thead>
<tr>
<th>Тип</th>
<th>Как выглядит</th>
<th>Чем ловится</th>
<th>Чем лечится</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class='font-weight-bold'>Фабрикация</span></td>
<td>Придуманы факты, которых нет ни в контексте, ни в реальности: несуществующий пункт регламента, выдуманный срок</td>
<td>NLI-энтейлмент, декомпозиция на утверждения</td>
<td>Требование цитаты, жёсткая инструкция «только из контекста», постфильтр</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Противоречие контексту</span></td>
<td>В документе «до 30 дней», в ответе «до 14 дней»</td>
<td>faithfulness / groundedness</td>
<td>Понижение температуры, реранкер, отсев противоречивых чанков</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Верно, но не по делу</span></td>
<td>Ответ фактически корректен и полностью бесполезен для заданного вопроса</td>
<td>answer relevancy</td>
<td>Переписывание запроса, работа с промптом</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Неполнота</span></td>
<td>Из трёх обязательных условий названо одно: формально не ложь, по факту вводит в заблуждение</td>
<td>completeness, context recall</td>
<td>Рост k, чанкинг по смыслу, требование перечислить все условия</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Устаревшая правда</span></td>
<td>Ответ идеально соответствует контексту, но контекст протух</td>
<td>свежесть источника, correctness против эталона</td>
<td>Версионирование документов, фильтр по дате, регламент переиндексации</td>
</tr>
</tbody>
</table>
<p>  </div>
<p></div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Пятый тип – самый коварный: его не видят метрики без эталона. Именно он был в примере из начала статьи. Если ваша база обновляется чаще раза в квартал, добавьте отдельную метрику – «доля ответов на неактуальной редакции». Это простая проверка на метаданных – она не требует ни одного вызова модели и обходится недорого.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dfdfe3"}}} --></p>
<p class="has-background" style="background-color:#dfdfe3"><span class='font-weight-bold'>Пример: банк, ассистент оператора контакт-центра</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Это тот самый случай, с которого началась статья. Когда базу переиндексировали, новые версии тарифов загрузили рядом со старыми, а старые не удалили. <span class='font-weight-bold'>В итоге около 17% фрагментов в поиске относились к уже недействующим редакциям.</span> Векторный поиск спокойно их выдавал: по тексту они даже лучше подходили к запросам – ведь написаны более официальным, «казённым» языком. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Проставили valid_from и valid_to в метаданных, ввели жёсткий фильтр по дате на этапе поиска, добавили в датасет 45 вопросов с изменившимися формулировками и метрику свежести. Доля ответов по устаревшим источникам за две недели упала с 17% до 0,4%. Faithfulness не изменилась – и это нормально: она и не должна была меняться, ведь проблема была не в искажении фактов, а в том, что система брала данные из старых документов. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Раздел 6. Четыре способа бороться с галлюцинациями</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>В индустрии выделяются четыре основных подхода. Они отличаются по стоимости – разница может быть в два раза и больше. Выбирать стоит тот, который укладывается в ваш бюджет при нужном объёме прогонов. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>&amp;lt;br>  .tablebox {&amp;lt;br>    max-width: 1100px !important;&amp;lt;br>    margin: 30px auto !important;&amp;lt;br>    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif !important;&amp;lt;br>    background: #ffffff !important;&amp;lt;br>    border: 1px solid #e5eaf2 !important;&amp;lt;br>    border-radius: 16px !important;&amp;lt;br>    padding: 24px 28px 28px !important;&amp;lt;br>    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06) !important;&amp;lt;br>    overflow: hidden !important;&amp;lt;br>  }&amp;lt;br>  .tablebox .tbl-scroll {&amp;lt;br>    overflow-x: auto !important;&amp;lt;br>    -webkit-overflow-scrolling: touch !important;&amp;lt;br>  }&amp;lt;br>  .tablebox table {&amp;lt;br>    width: 100% !important;&amp;lt;br>    min-width: 900px !important;&amp;lt;br>    border-collapse: collapse !important;&amp;lt;br>    font-size: 14px !important;&amp;lt;br>    line-height: 1.5 !important;&amp;lt;br>  }&amp;lt;br>  .tablebox caption {&amp;lt;br>    font-size: 18px !important;&amp;lt;br>    font-weight: 700 !important;&amp;lt;br>    color: #1f2937 !important;&amp;lt;br>    text-align: left !important;&amp;lt;br>    padding: 0 0 16px 0 !important;&amp;lt;br>    caption-side: top !important;&amp;lt;br>  }&amp;lt;br>  .tablebox thead th {&amp;lt;br>    background: #f8faff !important;&amp;lt;br>    font-size: 11px !important;&amp;lt;br>    font-weight: 700 !important;&amp;lt;br>    text-transform: uppercase !important;&amp;lt;br>    letter-spacing: 0.06em !important;&amp;lt;br>    color: #6b7280 !important;&amp;lt;br>    padding: 12px 16px !important;&amp;lt;br>    text-align: left !important;&amp;lt;br>    border-bottom: 2px solid #e5eaf2 !important;&amp;lt;br>    white-space: nowrap !important;&amp;lt;br>  }&amp;lt;br>  .tablebox thead th:first-child { width: 18% !important; }&amp;lt;br>  .tablebox thead th:nth-child(2) { width: 28% !important; }&amp;lt;br>  .tablebox thead th:nth-child(3) { width: 12% !important; }&amp;lt;br>  .tablebox thead th:nth-child(4) { width: 21% !important; }&amp;lt;br>  .tablebox ]]></description>
<link>https://quality-lab.ru/blog/kak-testirovat-rag-sistemy-na-baze-llm-metody-instrumenty-i-metriki/</link>
<pubDate>Fri, 04 Sep 2026 18:02:18 +0300</pubDate>
</item>
<item>
<title>Зачем командам разработки и QA концепция DoR и DoD, и как не превратить ее в бюрократию</title>
<description><![CDATA[<p>На связи Анастасия Шильникова, менеджер по тестированию <a href="https://garda.ai/" mce_href="https://garda.ai/" target="_blank">компании «Гарда»</a>.</p><p>Мы регулярно сталкиваемся с ситуациями, когда в Jira к задаче вроде есть какое-то описание, стоит статус «готово», но, чтобы понять, в чем была проблема, что было исправлено, как было проверено, приходится «нырять» в мессенджер или звонить коллегам. Все это съедает время, размывает ответственность между командами и мешает выпускать продукт быстро, качественно, в срок.</p><p>Вот несколько реальных примеров, когда описание к задаче похоже на квест:&nbsp;&nbsp;&nbsp;</p>]]></description>
<link>https://software-testing.ru/library/around-testing/processes/4537-dor-dod</link>
<pubDate>Tue, 01 Sep 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Итак, вы «ускорили работу в десять раз»…</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/10x.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/10x.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Джеймс Бах (James Bach)<br /><strong><a href="https://www.satisfice.com/blog/archives/488009" mce_href="https://www.satisfice.com/blog/archives/488009" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод: </strong>Ольга Алифанова</p>
<p>Существует множество способов «ускорить что-то в 10 раз».</p>
<ul>
<li>Ехать со скоростью 300 миль в час по оживлённой городской улице.</li>
<li>Съесть 15 000 калорий за один приём пищи.</li>
<li>Завести десять собак.</li>
<li>Родить десять детей.</li>
<li>Завести сотни друзей.</li>
</ul>
<p>У всех этих вещей есть вполне очевидные последствия и побочные эффекты. Даже простое наличие гораздо большего количества друзей заставит понимать дружбу гораздо поверхностнее, чем можно было бы себе позволить. Так почему же, когда фанаты ИИ говорят о «десятикратном» росте своей продуктивности, они никогда не упоминают о побочных эффектах?</p>
<p>Потому что они говорят и действуют безответственно.</p>]]></description>
<link>https://software-testing.ru/library/around-testing/processes/4505-10x</link>
<pubDate>Sun, 30 Aug 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Что тормозит QA-процесс: ищем проблемы с помощью Lean, Six Sigma и Кайдзен</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p>Столкнулись с тем, что QA-команда много работает, а релизы всё равно тормозят? Проблема часто не в том, что тестировщики работают медленно или их не хватает. Мы видим на практике, что чаще всего собака зарыта в самих процессах. Например, когда специалистам приходится стоять в очереди на тестирование, ждать готовности стенда, возвращаться на доработку или повторную проверку. В итоге люди постоянно заняты, а скорость поставки продукта не растёт. Но как обнаружить такие дыры?</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"id":31042,"width":"259px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="619" height="643" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-71_11zon.png" alt="Бережливое производство Lean" class="wp-image-31042" style="width:259px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-71_11zon.png 619w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-71_11zon-289x300.png 289w" sizes="(max-width: 619px) 100vw, 619px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">В <a href="https://quality-lab.ru/cases/" data-type="page" data-id="24565">«Лаборатории Качества»</a> мы применяем принципы Бережливого производства (Lean), Шесть сигм (Six Sigma) и Кайдзен не как набор отдельных модных методик, а как диагностический цикл для поиска проблем в QA-процессах. </pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Нам это помогает увидеть, где именно теряется время, почему возникают лишние переделки и какие изменения действительно повысят эффективность команды.&nbsp;Читайте статью, если хотите узнать, как внедрить устойчивые улучшения.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Можно ли выбрать что-то одно?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Нередко компании используют <span class='font-weight-bold'>Бережливое производство (Lean), Six Sigma и Кайдзен</span> как отдельные инструменты – берут тот, который кажется самым простым или больше нравится. Но эти <span class='font-weight-bold'>методы работают не по отдельности, а как единый процесс.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Сначала вы смотрите, как движется работа: сколько времени уходит на каждый этап, где всё замедляется. Потом находите конкретное место сбоя – например, долгое ожидание стенда или частые поломки автотестов. Дальше подбираете решение именно под эту проблему: если дело в нехватке ресурсов – настраиваете резервирование, если в нестабильных тестах – дорабатываете их или среду. И наконец, закрепляете изменения, чтобы улучшения остались надолго.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dbebf3"}}} --></p>
<p class="has-background" style="background-color:#dbebf3"><span class='font-weight-bold'>Мы разберём этот процесс шаг за шагом. Покажем понятные расчёты, пороговые значения и один сквозной пример: одни и те же цифры будут переходить из этапа в этап – так вы увидите, как всё связано между собой.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>
  .diagnostic-cycle {
    max-width: 1000px;
    margin: 40px auto;
    padding: 32px 28px;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    background: #ffffff;
    border: 1px solid #e5eaf2;
    border-radius: 20px;
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.06);
  }
  .diagnostic-cycle .engine-h {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 8px 16px;
    margin-bottom: 28px;
    padding-bottom: 16px;
    border-bottom: 2px solid #f0f2f5;
  }
  .diagnostic-cycle .engine-h > span:first-child {
    font-size: 20px;
    font-weight: 700;
    letter-spacing: 0.1em;
    color: #1f2937;
  }
  .diagnostic-cycle .engine-h .r {
    font-size: 15px;
    font-weight: 400;
    color: #6b7280;
  }
  .diagnostic-cycle .engine-body {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 16px;
  }
  .diagnostic-cycle .stage {
    background: #f8faff;
    border: 1px solid #e5eaf2;
    border-radius: 14px;
    padding: 20px 18px 22px;
    text-align: center;
    transition: box-shadow 0.25s ease, transform 0.2s ease;
  }
  .diagnostic-cycle .stage:hover {
    box-shadow: 0 8px 28px rgba(0, 0, 0, 0.07);
    transform: translateY(-3px);
  }
  .diagnostic-cycle .stage .n {
    display: block;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.06em;
    color: #6b7280;
    text-transform: uppercase;
    margin-bottom: 10px;
  }
  .diagnostic-cycle .stage .t {
    font-size: 18px;
    font-weight: 700;
    color: #1f2937;
    margin-bottom: 6px;
  }
  .diagnostic-cycle .stage .d {
    font-size: 13px;
    line-height: 1.5;
    color: #6b7280;
  }</p>
<p>  /* Две последние карточки — каждая занимает 1.5 колонки */
  .diagnostic-cycle .stage:nth-child(4) {
    grid-column: 1 / 2;
  }
  .diagnostic-cycle .stage:nth-child(5) {
    grid-column: 2 / 4;
  }</p>
<p>  /* Адаптивность */
  @media (max-width: 768px) {
    .diagnostic-cycle .engine-body {
      grid-template-columns: 1fr 1fr;
    }
    .diagnostic-cycle .stage:nth-child(4),
    .diagnostic-cycle .stage:nth-child(5) {
      grid-column: span 1;
    }
    .diagnostic-cycle .engine-h {
      flex-direction: column;
      align-items: flex-start;
    }
    .diagnostic-cycle .engine-h > span:first-child {
      font-size: 18px;
    }
    .diagnostic-cycle .engine-h .r {
      font-size: 14px;
    }
    .diagnostic-cycle {
      padding: 20px 16px;
    }
    .diagnostic-cycle .stage {
      padding: 16px 12px 18px;
    }
    .diagnostic-cycle .stage .t {
      font-size: 16px;
    }
    .diagnostic-cycle .stage .d {
      font-size: 12px;
    }
  }
  @media (max-width: 480px) {
    .diagnostic-cycle .engine-body {
      grid-template-columns: 1fr;
    }
  }
</style>
<div class="diagnostic-cycle" aria-label="Пять стадий диагностического цикла">
<div class="engine-h">
    <span>ДИАГНОСТИЧЕСКИЙ ЦИКЛ</span><br />
    <span class="r">повторяется, а не выполняется один раз</span>
  </div>
<div class="engine-body">
<div class="stage">
      <span class="n">01 · ИЗМЕРИТЬ</span></p>
<div class="t">Карта потока</div>
<div class="d">VSM с реальными метриками: PT, LT, %C&amp;A</div>
</p></div>
<div class="stage">
      <span class="n">02 · НАЙТИ</span></p>
<div class="t">Тип проблемы</div>
<div class="d">Очередь? Переделка? Перегрузка?</div>
</p></div>
<div class="stage">
      <span class="n">03 · ВЫБРАТЬ</span></p>
<div class="t">Контрмера</div>
<div class="d">WIP, poka-yoke, DMAIC — по типу</div>
</p></div>
<div class="stage">
      <span class="n">04 · ЗАКРЕПИТЬ</span></p>
<div class="t">Ката + контроль</div>
<div class="d">Малый эксперимент, метрика на обзор</div>
</p></div>
<div class="stage">
      <span class="n">05 · ПОДДЕРЖАНИЕ</span></p>
<div class="t">Постоянные улучшения</div>
<div class="d">Карта показывает новое узкое место</div>
</p></div>
</p></div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>В статьях про Lean в тестировании часто показывают только витрину: перечисляют семь потерь, описывают DMAIC, приводят цифру в 3,4 дефекта на миллион. И дело не в том, что эти данные неверны. Такая подача не помогает руководителю ответить на самый важный вопрос: с чего начать именно в его команде и что делать дальше.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Методы Lean нередко подают как разные варианты на выбор, хотя на деле это последовательные стадии одного цикла. Мы покажем, как они связаны между собой.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Три японских термина – не просто красивые слова, а чёткая цепочка: она подсказывает, в каком порядке устранять проблемы и выстраивать улучшения.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>
  .gloss {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 20px;
    max-width: 960px;
    margin: 30px auto;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
  }
  .gcard {
    background: #f8faff;
    border: 1px solid #e5eaf2;
    border-radius: 16px;
    padding: 28px 24px 24px;
    text-align: center;
    transition: box-shadow 0.25s ease, transform 0.2s ease;
  }
  .gcard:hover {
    box-shadow: 0 8px 28px rgba(0, 0, 0, 0.07);
    transform: translateY(-3px);
  }
  .gcard .jp {
    font-size: 32px;
    font-weight: 700;
    color: #1a1a2e;
    line-height: 1.2;
    margin-bottom: 4px;
    letter-spacing: 0.02em;
  }
  .gcard .en {
    font-size: 14px;
    font-weight: 600;
    color: #6b7280;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    margin-bottom: 12px;
  }
  .gcard .df {
    font-size: 14px;
    line-height: 1.6;
    color: #374151;
  }
  .gcard .df b {
    color: #d61f26;
    font-weight: 600;
  }</p>
<p>  @media (max-width: 768px) {
    .gloss {
      grid-template-columns: 1fr;
      gap: 16px;
      padding: 0 16px;
    }
    .gcard .jp {
      font-size: 28px;
    }
  }
</style>
<div class="gloss">
<div class="gcard">
<div class="jp">ムラ mura</div>
<div class="en">неравномерность</div>
<div class="df">Скачки нагрузки: то простой, то три релиза разом. <span class='font-weight-bold'>Причина.</span></div>
</p></div>
<div class="gcard">
<div class="jp">ムリ muri</div>
<div class="en">перегрузка</div>
<div class="df">Люди и системы за пределом мощности. <span class='font-weight-bold'>Следствие mura.</span></div>
</p></div>
<div class="gcard">
<div class="jp">ムダ muda</div>
<div class="en">потери</div>
<div class="df">Ожидание, переделка, лишняя работа. <span class='font-weight-bold'>Следствие первых двух.</span></div>
</p></div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>В западных разборах всё крутится вокруг муда и её семи видов, а мура и мури упоминают будто для галочки. В Toyota, где и были разработаны принципы бережливого производства, подход другой: сначала выравнивают поток задач – (убирают мура). Это снимает перегрузку (мури), и только потом борьба с потерями (муда) становится по-настоящему эффективной.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Поэтому главное правило системы простое: устранять проблемы нужно строго по порядку – сначала мура, потом мури, и только затем муда. Это важно.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Именно этот принцип и лежит в основе подхода Toyota – он помогает не распыляться на мелкие проблемы, а бить точно в цель. Вот как сформулировал суть сам создатель производственной системы компании:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:separator {"opacity":"css","className":"is-style-default"} --></p>
<hr class="wp-block-separator has-css-opacity is-style-default"/>
<!-- /wp:separator --></p>
<p><!-- wp:image {"id":31044,"width":"150px","height":"150px","sizeSlug":"full","linkDestination":"none","align":"center","className":"is-style-rounded"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized is-style-rounded"><img decoding="async" width="300" height="300" src="https://quality-lab.ru/wp-content/uploads/2026/08/Frame-776.png" alt="Бережливое производство Lean" class="wp-image-31044" style="width:150px;height:150px" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Frame-776.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Frame-776-150x150.png 150w" sizes="(max-width: 300px) 100vw, 300px" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:quote {"textAlign":"center","className":"is-style-large"} --></p>
<blockquote class="wp-block-quote has-text-align-center is-style-large"><p><!-- wp:paragraph --></p>
<p>«Всё, что мы делаем, – смотрим на время между заказом клиента и получением денег. И сокращаем этот отрезок, убирая всё, что не добавляет ценности»</p>
<p><!-- /wp:paragraph --><cite>&nbsp;– Тайити Оно, создатель производственной системы Toyota</cite></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:separator {"opacity":"css","className":"is-style-default"} --></p>
<hr class="wp-block-separator has-css-opacity is-style-default"/>
<!-- /wp:separator --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Стадия 1. Составляем карту потока и получаем конкретные данные</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Карта потока создания ценности (VSM) – это карта всего пути задачи: от самого первого запроса до того момента, когда результат доходит до пользователя. Каждый этап на ней отмечают тремя цифрами – они показывают, сколько времени уходит на работу, на ожидание и на потери. Относится к концепции бережливого производства (Lean).</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Важно понимать: <span class='font-weight-bold'>VSM не исправляет проблемы</span> – она помогает их увидеть. Именно с этой карты стоит начинать любые улучшения. Без цифр мы обычно бросаемся чинить то, что бросается в глаза, а не то, что реально, но тихо съедает время и деньги.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>На каждом шаге процесса мы смотрим три метрики. Их важно понимать точно, так как именно на них строится вся дальнейшая работа с цифрами.&nbsp;&nbsp;</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>
  .tbl-scroll {
    max-width: 960px;
    margin: 30px auto;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
  }
  .tbl-scroll table {
    width: 100%;
    border-collapse: collapse;
    background: #ffffff;
    border-radius: 16px;
    overflow: hidden;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06);
    border: 1px solid #e5eaf2;
    min-width: 600px;
  }
  .tbl-scroll caption {
    font-size: 18px;
    font-weight: 700;
    color: #1f2937;
    text-align: left;
    padding: 0 0 16px 0;
    caption-side: top;
  }
  .tbl-scroll thead th {
    background: #f8faff;
    font-size: 12px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: #6b7280;
    padding: 14px 18px;
    text-align: left;
    border-bottom: 2px solid #e5eaf2;
  }
  .tbl-scroll tbody td {
    padding: 16px 18px;
    font-size: 14px;
    line-height: 1.6;
    color: #374151;
    border-bottom: 1px solid #f0f2f5;
    vertical-align: top;
  }
  .tbl-scroll tbody tr:last-child td {
    border-bottom: none;
  }
  .tbl-scroll tbody tr:hover td {
    background: #fafcff;
  }
  .tbl-scroll tbody td b {
    color: #1f2937;
    font-weight: 700;
  }
  .tbl-scroll tbody td b:first-child {
    font-size: 15px;
  }</p>
<p>  @media (max-width: 768px) {
    .tbl-scroll {
      margin: 20px 0;
    }
    .tbl-scroll table {
      min-width: 500px;
    }
    .tbl-scroll caption {
      font-size: 16px;
    }
    .tbl-scroll thead th,
    .tbl-scroll tbody td {
      padding: 12px 14px;
      font-size: 13px;
    }
  }
  @media (max-width: 480px) {
    .tbl-scroll table {
      min-width: 380px;
    }
    .tbl-scroll thead th,
    .tbl-scroll tbody td {
      padding: 10px 12px;
      font-size: 12px;
    }
  }
</style>
<div class="tbl-scroll">
<table>
<thead>
<tr>
<th style="width:24%">Метрика</th>
<th style="width:40%">Что измеряет</th>
<th>Как снять</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class='font-weight-bold'>PT · Process Time</span><br />время работы</td>
<td>Сколько заняла бы задача, если бы исполнитель делал её без перерывов, имея всё нужное.</td>
<td>Спросить исполнителя: «чистого времени руками — сколько?»</td>
</tr>
<tr>
<td><span class='font-weight-bold'>LT · Lead Time</span><br />время цикла</td>
<td>Сколько задача реально провела на этом шаге — от «попала в колонку» до «ушла дальше». Работа + ожидание.</td>
<td>По доске / трекеру: время в колонке</td>
</tr>
<tr>
<td><span class='font-weight-bold'>%C&amp;A</span><br />годно с первого раза</td>
<td>Доля задач, которые следующий шаг получает в пригодном виде — без возврата на доработку.</td>
<td>Спросить не исполнителя, а того, кто принимает работу дальше</td>
</tr>
</tbody>
</table>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Одна ошибка может свести на нет всю ценность карты потока.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Показатель <span class='font-weight-bold'>%C&amp;A</span> нужно снимать с того, кто принимает работу, а не с того, кто её делал. Автор всегда уверен, что передал всё как надо. А правду видит тот, кто принял задачу – и вернул с вопросами.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Например, чтобы понять реальную картину, спросите разработчика, какая доля багов приходит с понятными шагами для воспроизведения. Или спросите тестировщика, насколько часто <a href="https://quality-lab.ru/blog/testing-requirements/" data-type="post" data-id="6599">требования</a> приходят без пробелов в граничных случаях. Так вы получите честные данные, на которых можно строить улучшения.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Карта потока выдаёт три главных показателя</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Они складываются из построчных данных – <span class='font-weight-bold'>PT, LT и %C&amp;A</span>. Эти итоговые цифры – как диагноз для процесса: сразу видно, где он тормозит и сколько времени и ресурсов теряется зря.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>
  .formula {
    max-width: 880px;
    margin: 30px auto;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    background: #0d1117;
    border: 1px solid #30363d;
    border-radius: 16px;
    padding: 28px 30px 26px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
    overflow-x: auto;
  }
  .formula .formula-h {
    font-size: 16px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: #8b949e;
    padding-bottom: 14px;
    border-bottom: 2px solid #21262d;
    margin-bottom: 20px;
  }
  .formula pre {
    margin: 0;
    padding: 0;
    font-family: 'JetBrains Mono', 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
    font-size: 14px;
    line-height: 1.8;
    color: #e6edf3;
    white-space: pre-wrap;
    word-break: break-word;
    background: transparent;
    border: none;
    border-radius: 0;
  }
  .formula .k {
    color: #79c0ff;
    font-weight: 600;
  }
  .formula .g {
    color: #7ee787;
    font-weight: 600;
  }
  .formula .c {
    color: #8b949e;
    font-style: italic;
  }
  .formula pre br {
    display: none;
  }</p>
<p>  @media (max-width: 768px) {
    .formula {
      padding: 20px 18px 18px;
      margin: 20px 0;
    }
    .formula .formula-h {
      font-size: 14px;
    }
    .formula pre {
      font-size: 13px;
      line-height: 1.7;
    }
  }
  @media (max-width: 480px) {
    .formula {
      padding: 16px 14px 14px;
    }
    .formula pre {
      font-size: 12px;
      line-height: 1.6;
    }
  }
</style>
<div class="formula">
<div class="formula-h">три сводных метрики потока</div>
<pre><span class="k">Total LT</span> = сумма Lead Time всех шагов          <span class="c"># сквозное время задачи</span>
<span class="k">Total PT</span> = сумма Process Time всех шагов       <span class="c"># чистая работа</span>

<span class="g">Activity Ratio</span> = Total PT / Total LT × 100%     <span class="c"># доля времени, когда над задачей работали</span>
<span class="c"># В реальных потоках сплошь и рядом 2–15%. Остальное — ожидание.</span>

<span class="g">Rolled %C&amp;A</span> = %C&amp;A(шаг1) × %C&amp;A(шаг2) × ...    <span class="c"># сквозное «годно с первого раза»</span>
<span class="c"># Перемножается! Пять шагов по 80% дают 0.8^5 = 33%.</span>
<span class="c"># То есть две трети задач где-то по пути идут на переделку.</span></pre>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Activity Ratio</span> помогает понять, почему процесс идёт медленно: из‑за самой работы или из‑за ожиданий. <span class='font-weight-bold'>Rolled %C&amp;A</span> (он же rolled first‑pass yield в Six Sigma) показывает, сколько задач приходится переделывать. Его главная особенность – он перемножается: даже неплохие 80–90% на каждом этапе в сумме могут дать очень низкий общий результат. Именно эту проблему часто упускают из виду.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">В статье мы разберём один сквозной пример на всех этапах</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#eaf3f9"}}} --></p>
<p class="has-background" style="background-color:#eaf3f9">В команде – <span class='font-weight-bold'>6 разработчиков и 2 QA‑инженера</span>. Менеджмент замечает, что <span class='font-weight-bold'>тестирование тормозит релизы</span>, и предлагает решение: <span class='font-weight-bold'>нанять ещё одного тестировщика</span>. Мы построили карту потока по 12 задачам – и с её помощью смотрим, где на самом деле прячется проблема.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>
  .vsm-frame {
    max-width: 960px;
    margin: 30px auto;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    background: #ffffff;
    border: 1px solid #e5eaf2;
    border-radius: 16px;
    padding: 24px 28px 28px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06);
  }
  .vsm-frame .vh {
    font-size: 16px;
    font-weight: 600;
    color: #1f2937;
    padding-bottom: 14px;
    border-bottom: 2px solid #f0f2f5;
    margin-bottom: 18px;
    letter-spacing: 0.01em;
  }
  .vsm-frame .tbl-scroll {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    margin: 0 -4px;
  }
  .vsm-frame table {
    width: 100%;
    min-width: 600px;
    border-collapse: collapse;
    font-size: 14px;
    line-height: 1.5;
  }
  .vsm-frame thead th {
    background: #f8faff;
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: #6b7280;
    padding: 12px 14px;
    text-align: left;
    border-bottom: 2px solid #e5eaf2;
  }
  .vsm-frame tbody td {
    padding: 12px 14px;
    border-bottom: 1px solid #f0f2f5;
    color: #374151;
    vertical-align: middle;
  }
  .vsm-frame tbody tr:last-child td {
    border-bottom: none;
  }
  .vsm-frame tbody tr:hover td {
    background: #fafcff;
  }
  .vsm-frame .mono-c {
    font-family: 'JetBrains Mono', 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
    font-size: 13px;
    font-weight: 500;
    color: #1f2937;
    white-space: nowrap;
  }
  .vsm-frame .em-a {
    color: #d61f26;
    font-weight: 600;
  }
  .vsm-frame .tot {
    font-weight: 700;
    color: #1f2937;
    border-top: 2px solid #d1d5db;
  }
  .vsm-frame tbody .tot {
    background: #fafcff;
  }
  .vsm-frame tbody .tot.mono-c {
    font-weight: 700;
  }</p>
<p>  @media (max-width: 768px) {
    .vsm-frame {
      padding: 18px 16px 20px;
      margin: 20px 0;
    }
    .vsm-frame .vh {
      font-size: 14px;
    }
    .vsm-frame table {
      font-size: 13px;
      min-width: 500px;
    }
    .vsm-frame thead th,
    .vsm-frame tbody td {
      padding: 10px 12px;
    }
    .vsm-frame .mono-c {
      font-size: 12px;
    }
  }
  @media (max-width: 480px) {
    .vsm-frame {
      padding: 14px 12px 16px;
    }
    .vsm-frame table {
      font-size: 12px;
      min-width: 400px;
    }
    .vsm-frame thead th,
    .vsm-frame tbody td {
      padding: 8px 10px;
    }
    .vsm-frame .mono-c {
      font-size: 11px;
    }
  }
</style>
<div class="vsm-frame">
<div class="vh">CURRENT STATE · путь одной задачи, усреднённый по 12</div>
<div class="tbl-scroll">
<table>
<thead>
<tr>
<th>Шаг</th>
<th>PT (ч)</th>
<th>LT (ч)</th>
<th>%C&amp;A</th>
<th>Что происходит</th>
</tr>
</thead>
<tbody>
<tr>
<td>Груминг / анализ</td>
<td class="mono-c">1.0</td>
<td class="mono-c">8</td>
<td class="mono-c em-a">70%</td>
<td>QA не зовут, границы всплывают позже</td>
</tr>
<tr>
<td>Разработка</td>
<td class="mono-c">6.0</td>
<td class="mono-c">40</td>
<td class="mono-c">85%</td>
<td>—</td>
</tr>
<tr>
<td>Ожидание сборки/стенда</td>
<td class="mono-c">0</td>
<td class="mono-c">10</td>
<td class="mono-c">100%</td>
<td>чистое ожидание</td>
</tr>
<tr>
<td>Тестирование</td>
<td class="mono-c">3.0</td>
<td class="mono-c">28</td>
<td class="mono-c em-a">75%</td>
<td>баги без шагов → возвраты</td>
</tr>
<tr>
<td>Фикс + ретест</td>
<td class="mono-c">2.0</td>
<td class="mono-c">22</td>
<td class="mono-c">90%</td>
<td>переоткрытия</td>
</tr>
<tr>
<td class="tot">ИТОГО</td>
<td class="mono-c tot">12.0</td>
<td class="mono-c tot">108</td>
<td class="mono-c tot">—</td>
<td class="tot">—</td>
</tr>
</tbody>
</table></div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:html --></p>
<style>
  .formula {
    max-width: 880px;
    margin: 30px auto;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    background: #0d1117;
    border: 1px solid #30363d;
    border-radius: 16px;
    padding: 28px 30px 26px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
    overflow-x: auto;
  }
  .formula .formula-h {
    font-size: 16px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: #8b949e;
    padding-bottom: 14px;
    border-bottom: 2px solid #21262d;
    margin-bottom: 20px;
  }
  .formula pre {
    margin: 0;
    padding: 0;
    font-family: 'JetBrains Mono', 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
    font-size: 14px;
    line-height: 1.8;
    color: #e6edf3;
    white-space: pre-wrap;
    word-break: break-word;
    background: transparent;
    border: none;
    border-radius: 0;
  }
  .formula .k {
    color: #79c0ff;
    font-weight: 600;
  }
  .formula .g {
    color: #7ee787;
    font-weight: 600;
  }
  .formula .c {
    color: #8b949e;
    font-style: italic;
  }
  .formula pre br {
    display: none;
  }</p>
<p>  @media (max-width: 768px) {
    .formula {
      padding: 20px 18px 18px;
      margin: 20px 0;
    }
    .formula .formula-h {
      font-size: 14px;
    }
    .formula pre {
      font-size: 13px;
      line-height: 1.7;
    }
  }
  @media (max-width: 480px) {
    .formula {
      padding: 16px 14px 14px;
    }
    .formula pre {
      font-size: 12px;
      line-height: 1.6;
    }
  }
</style>
<div class="formula">
<div class="formula-h">диагноз по карте</div>
<pre><span class="g">Activity Ratio</span> = 12 / 108 = <span class="k">11%</span>
<span class="c"># 89% времени задача просто ждёт. Люди при этом заняты по горло.</span>

<span class="g">Rolled %C&amp;A</span> = 0.70 × 0.85 × 1.0 × 0.75 × 0.90 = <span class="k">40%</span>
<span class="c"># 60% задач где-то идут на переделку. Два узких горла — груминг (70%)</span>
<span class="c"># и тестирование (75%), и они бьют по одному и тому же: возвраты.</span></pre>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Карта сразу показывает, что <span class='font-weight-bold'>первоначальная гипотеза неверна</span>. Дело не в том, что тестирование идёт медленно: на саму работу уходит всего 3 часа. И нехватка людей тут ни при чём.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Главная проблема – в долгих ожиданиях <span class='font-weight-bold'>(Activity Ratio 11%)</span> и в том, что многое приходится переделывать <span class='font-weight-bold'>(Rolled %C&amp;A 40%)</span>. Причём переделки возникают на <span class='font-weight-bold'>двух конкретных этапах</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dbebf3"}}} --></p>
<p class="has-background" style="background-color:#dbebf3"><span class='font-weight-bold'>Если бы в команду взяли ещё одного тестировщика, эти цифры не изменились бы: задачи всё равно застревали бы в той же очереди.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Стадия 2. Диагностика типа проблем</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>VSM</span> не просто показывает, где есть проблемы, – она ещё помогает понять, какого они рода. В этом суть всей системы – и именно этого не хватает в поверхностных обзорах.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Три сводные <a href="https://quality-lab.ru/blog/perestante-schitat-bagi-sovremennye-metriki-testirovaniya-dlya-it-komand/" data-type="post" data-id="30560">метрики</a> указывают на три разных типа проблем</span>, и для каждого нужен свой подход. Если перепутать тип, получится, что лечим не ту болезнь – и улучшения не дают результата.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>
  .diagnosis-table {
    max-width: 1000px;
    margin: 30px auto;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    background: #ffffff;
    border: 1px solid #e5eaf2;
    border-radius: 16px;
    padding: 24px 28px 28px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06);
  }
  .diagnosis-table .tbl-scroll {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    margin: 0 -4px;
  }
  .diagnosis-table table {
    width: 100%;
    min-width: 700px;
    border-collapse: collapse;
    font-size: 14px;
    line-height: 1.5;
  }
  .diagnosis-table caption {
    font-size: 18px;
    font-weight: 700;
    color: #1f2937;
    text-align: left;
    padding: 0 0 16px 0;
    caption-side: top;
  }
  .diagnosis-table thead th {
    background: #f8faff;
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: #6b7280;
    padding: 12px 16px;
    text-align: left;
    border-bottom: 2px solid #e5eaf2;
  }
  .diagnosis-table tbody td {
    padding: 14px 16px;
    border-bottom: 1px solid #f0f2f5;
    color: #374151;
    vertical-align: top;
  }
  .diagnosis-table tbody tr:last-child td {
    border-bottom: none;
  }
  .diagnosis-table tbody tr:hover td {
    background: #fafcff;
  }
  .diagnosis-table tbody td b {
    color: #1f2937;
    font-weight: 700;
  }
  .diagnosis-table .em-g {
    color: #16a34a;
    font-weight: 600;
  }
  .diagnosis-table .em-r {
    color: #d61f26;
    font-weight: 600;
  }</p>
<p>  @media (max-width: 768px) {
    .diagnosis-table {
      padding: 18px 16px 20px;
      margin: 20px 0;
    }
    .diagnosis-table caption {
      font-size: 16px;
    }
    .diagnosis-table table {
      font-size: 13px;
      min-width: 600px;
    }
    .diagnosis-table thead th,
    .diagnosis-table tbody td {
      padding: 10px 12px;
    }
  }
  @media (max-width: 480px) {
    .diagnosis-table {
      padding: 14px 12px 16px;
    }
    .diagnosis-table table {
      font-size: 12px;
      min-width: 480px;
    }
    .diagnosis-table thead th,
    .diagnosis-table tbody td {
      padding: 8px 10px;
    }
  }
</style>
<div class="diagnosis-table">
<div class="tbl-scroll">
<table>
<caption>Пример диагностики на основе карты</caption>
<thead>
<tr>
<th style="width:26%">Что видно на карте</th>
<th style="width:22%">Тип разрыва</th>
<th style="width:18%">Первопричина</th>
<th>Контрмера</th>
</tr>
</thead>
<tbody>
<tr>
<td>Низкий Activity Ratio, длинные LT на «ожиданиях»</td>
<td><span class='font-weight-bold'>Очередь</span> (muda ожидания)</td>
<td>Высокая загрузка + mura</td>
<td class="em-g">Лимит WIP + выравнивание входа</td>
</tr>
<tr>
<td>Низкий Rolled %C&amp;A, шаги с %C&amp;A &lt; 85%</td>
<td><span class='font-weight-bold'>Переделка</span> (muda дефектов)</td>
<td>Ошибку ловят поздно</td>
<td class="em-g">Poka-yoke на конкретном шаге</td>
</tr>
<tr>
<td>Один шаг с %C&amp;A резко ниже других</td>
<td><span class='font-weight-bold'>Системный дефект</span> процесса</td>
<td>Неизвестна</td>
<td class="em-g">DMAIC-разбор этого шага</td>
</tr>
<tr>
<td>LT шага скачет в разы от задачи к задаче</td>
<td><span class='font-weight-bold'>Неравномерность</span> (mura)</td>
<td>Нет выравнивания</td>
<td class="em-g">Классы обслуживания, ограничение старта</td>
</tr>
<tr>
<td>Загрузка людей ≈ 100%, всё «горит»</td>
<td><span class='font-weight-bold'>Перегрузка</span> (muri)</td>
<td>Очередь не контролируется</td>
<td class="em-g">Снизить загрузку до ~80% (см. ниже)</td>
</tr>
</tbody>
</table></div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Почему «загрузить людей на 100%» – самая дорогая ошибка</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Здесь нужна математика очередей, потому что интуиция врёт именно в этом месте. Дон Райнертсен (писатель, прославился как один из главных авторов концепции бережливой разработки продуктов) перенёс теорию массового обслуживания на разработку, и вывод контринтуитивный: время ожидания в очереди зависит от загрузки не линейно, а экспоненциально. Для простой очереди множитель ожидания считается так:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>
  .formula {
    max-width: 800px;
    margin: 30px auto;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    background: #0d1117;
    border: 1px solid #30363d;
    border-radius: 16px;
    padding: 28px 30px 26px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
    overflow-x: auto;
  }
  .formula .formula-h {
    font-size: 16px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: #8b949e;
    padding-bottom: 14px;
    border-bottom: 2px solid #21262d;
    margin-bottom: 20px;
  }
  .formula pre {
    margin: 0;
    padding: 0;
    font-family: 'JetBrains Mono', 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
    font-size: 14px;
    line-height: 1.8;
    color: #e6edf3;
    white-space: pre-wrap;
    word-break: break-word;
    background: transparent;
    border: none;
    border-radius: 0;
  }
  .formula .k {
    color: #79c0ff;
    font-weight: 600;
  }
  .formula .g {
    color: #f0883e;
    font-weight: 600;
  }
  .formula .c {
    color: #8b949e;
    font-style: italic;
  }
  .formula pre br {
    display: none;
  }</p>
<p>  @media (max-width: 768px) {
    .formula {
      padding: 20px 18px 18px;
      margin: 20px 0;
    }
    .formula .formula-h {
      font-size: 14px;
    }
    .formula pre {
      font-size: 13px;
      line-height: 1.7;
    }
  }
  @media (max-width: 480px) {
    .formula {
      padding: 16px 14px 14px;
    }
    .formula pre {
      font-size: 12px;
      line-height: 1.6;
    }
  }
</style>
<div class="formula">
<div class="formula-h">множитель ожидания от загрузки · модель M/M/1</div>
<pre>Ожидание ∝ <span class="k">U / (1 − U)</span>       <span class="c"># U — загрузка ресурса (0..1)</span>

  U = 50%  →  множитель  <span class="g">1×</span>
  U = 80%  →  множитель  <span class="g">4×</span>
  U = 90%  →  множитель  <span class="g">9×</span>
  U = 95%  →  множитель <span class="g">19×</span>

<span class="c"># Догрузив тестировщика с 80% до 95%, вы получаете не +19% работы,</span>
<span class="c"># а рост времени ожидания задачи в очереди почти впятеро.</span></pre>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Вот почему добавление ещё одного человека в перегруженную команду нередко ускоряет работу куда сильнее, чем кажется. А попытки выжать из текущих сотрудников «ещё немного» почти всегда дают обратный эффект – процесс только замедляется.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dbebf3"}}} --></p>
<p class="has-background" style="background-color:#dbebf3"><span class='font-weight-bold'>Главный практический вывод Райнертсена прост: управлять нужно не загрузкой людей, а размером очереди. Загрузку точно оценить сложно, а очередь всегда видна – например, на доске задач. Стоит ограничить количество задач в работе – и загрузка сама придёт в здоровый диапазон.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Правила выбора инструмента простые</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Если видите <span class='font-weight-bold'>долгие ожидания и низкий Activity Ratio</span> – проблема в очереди. Решают лимиты <span class='font-weight-bold'>WIP (Стадия 03)</span>. Нанимать людей или требовать работать быстрее тут не поможет.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Если <span class='font-weight-bold'>низкий Rolled %C&amp;A</span> – значит, много переделок. Нужно внедрять <span class='font-weight-bold'>poka‑yoke</span> на том шаге, где показатель падает.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Если на одном шаге <span class='font-weight-bold'>%C&amp;A неожиданно низкий</span> – не стоит действовать наугад. Разберите причину с помощью подхода <span class='font-weight-bold'>DMAIC</span>.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Если <span class='font-weight-bold'>проблемы сразу по всем фронтам</span> – исправляйте по порядку: сначала выровняйте поток <span class='font-weight-bold'>(mura)</span>, потом снимите перегрузку <span class='font-weight-bold'>(muri)</span>, затем уберите потери <span class='font-weight-bold'>(muda)</span>.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":31045,"width":"368px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-80_11zon.png" alt="Бережливое производство Lean" class="wp-image-31045" style="width:368px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-80_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-80_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-80_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-80_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">В нашем примере карта выявила две основные проблемы: очередь (Activity Ratio – 11%) и переделки на двух этапах (Rolled %C&amp;A – 40%). Значит на третьей стадии понадобятся два инструмента: лимит WIP, чтобы справиться с очередью, и poka‑yoke – чтобы сократить переделки. Действуем по правилу mura, а затем muda: сначала выравниваем поток, а потом точечно улучшаем качество отдельных шагов.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Стадия 3. Выбрать и применить контрмеру</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Контрмера А. Лимит WIP – против очереди</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#d5f2e9"}}} --></p>
<p class="has-background" style="background-color:#d5f2e9"><span class='font-weight-bold'>Механика</span>. Лимит WIP работает на базе закона Литтла – простого, но фундаментального правила из теории очередей. Суть такая: в стабильном потоке время выполнения задач напрямую зависит от их количества. Держите в работе меньше задач – и они будут проходить через систему быстрее.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>
  .formula {
    max-width: 800px;
    margin: 30px auto;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    background: #0d1117;
    border: 1px solid #30363d;
    border-radius: 16px;
    padding: 28px 30px 26px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
    overflow-x: auto;
  }
  .formula .formula-h {
    font-size: 16px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: #8b949e;
    padding-bottom: 14px;
    border-bottom: 2px solid #21262d;
    margin-bottom: 20px;
  }
  .formula pre {
    margin: 0;
    padding: 0;
    font-family: 'JetBrains Mono', 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
    font-size: 14px;
    line-height: 1.8;
    color: #e6edf3;
    white-space: pre-wrap;
    word-break: break-word;
    background: transparent;
    border: none;
    border-radius: 0;
  }
  .formula .k {
    color: #79c0ff;
    font-weight: 600;
  }
  .formula .g {
    color: #7ee787;
    font-weight: 600;
  }
  .formula .c {
    color: #8b949e;
    font-style: italic;
  }
  .formula pre br {
    display: none;
  }</p>
<p>  @media (max-width: 768px) {
    .formula {
      padding: 20px 18px 18px;
      margin: 20px 0;
    }
    .formula .formula-h {
      font-size: 14px;
    }
    .formula pre {
      font-size: 13px;
      line-height: 1.7;
    }
  }
  @media (max-width: 480px) {
    .formula {
      padding: 16px 14px 14px;
    }
    .formula pre {
      font-size: 12px;
      line-height: 1.6;
    }
  }
</style>
<div class="formula">
<div class="formula-h">закон Литтла · связь трёх величин</div>
<pre><span class="k">WIP = Throughput × Lead Time</span>

  WIP        — задач одновременно «в работе»
  Throughput — сколько задач в день выходит из шага
  Lead Time  — сколько в среднем задача проводит на шаге

<span class="c"># Перестановка даёт лимит, а не «возьмём 2 на человека наугад»:</span>
<span class="g">Целевой лимит WIP = Throughput × Целевой Lead Time</span></pre>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Лимит рассчитывается, исходя из реальной пропускной способности команды и целевого времени цикла, а не на глаз. Покажем на примере.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>
  .formula {
    max-width: 800px;
    margin: 30px auto;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    background: #0d1117;
    border: 1px solid #30363d;
    border-radius: 16px;
    padding: 28px 30px 26px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
    overflow-x: auto;
  }
  .formula .formula-h {
    font-size: 16px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: #8b949e;
    padding-bottom: 14px;
    border-bottom: 2px solid #21262d;
    margin-bottom: 20px;
  }
  .formula pre {
    margin: 0;
    padding: 0;
    font-family: 'JetBrains Mono', 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
    font-size: 14px;
    line-height: 1.8;
    color: #e6edf3;
    white-space: pre-wrap;
    word-break: break-word;
    background: transparent;
    border: none;
    border-radius: 0;
  }
  .formula .k {
    color: #79c0ff;
    font-weight: 600;
  }
  .formula .g {
    color: #7ee787;
    font-weight: 600;
  }
  .formula .c {
    color: #8b949e;
    font-style: italic;
  }
  .formula pre br {
    display: none;
  }</p>
<p>  @media (max-width: 768px) {
    .formula {
      padding: 20px 18px 18px;
      margin: 20px 0;
    }
    .formula .formula-h {
      font-size: 14px;
    }
    .formula pre {
      font-size: 13px;
      line-height: 1.7;
    }
  }
  @media (max-width: 480px) {
    .formula {
      padding: 16px 14px 14px;
    }
    .formula pre {
      font-size: 12px;
      line-height: 1.6;
    }
  }
</style>
<div class="formula">
<div class="formula-h">расчёт лимита для шага «Тестирование»</div>
<pre><span class="c"># Из карты: шаг тестирования выпускает ~2 задачи в день (throughput).</span>
<span class="c"># Сейчас Lead Time на шаге = 28 ч ≈ 3.5 рабочих дня.</span>

Фактический WIP = 2 × 3.5 = <span class="k">7 задач</span> висят в тестировании разом.
<span class="c"># Вот источник переключения: 2 инженера жонглируют семью задачами.</span>

<span class="c"># Хотим Lead Time = 1 день. Тогда:</span>
<span class="g">Целевой лимит WIP = 2 × 1 = 2 задачи</span>
<span class="c"># Ставим лимит колонки = 3 (небольшой запас), а не 7.</span></pre>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Как внедрить, чтобы результат сохранился</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Ставьте лимит на колонку, а не на отдельного сотрудника. Если лимит достигнут – новую задачу не берём: вся команда помогает завершить то, что уже в работе.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Важно дать команде право не брать новые входящие задачи. Без этого лимит превращается просто в цифру на доске. Если сверху постоянно подкидывают «срочно» поверх лимита – система не работает.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Эффект следует из закона Литтла: при том же объёме выполненной работы (throughput) и меньшем количестве задач в работе (WIP) время выполнения (Lead Time) сокращается пропорционально. Это не про то, что все стали усерднее трудиться, – это простая арифметика.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Где возникают проблемы</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Закон Литтла работает только при стабильном потоке: сколько задач заходит, столько примерно и выходит. Если есть mura – то есть скачки в поступлении задач, – лимит WIP будет то создавать заторы, то пустовать.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Поэтому действовать нужно по цепочке mura, затем muri, потом muda: сначала хотя бы примерно выровнять поток входящих задач – например, через классы обслуживания или ограничение числа одновременно стартующих задач. И только потом ставить лимит WIP. Пытаться применять лимит на хаотичном, неровном потоке – значит лечить не причину, а симптом.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Контрмера Б. Poka‑yoke – боремся с переделками&nbsp;</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#d5f2e9"}}} --></p>
<p class="has-background" style="background-color:#d5f2e9"><span class='font-weight-bold'>Механика</span>. Poka‑yoke (метод Сигео Синго из Toyota) напрямую повышает показатель %C&amp;A на этапе – не за счёт более тщательного поиска ошибок, а за счёт того, что делает ошибку невозможной.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Синго выделял два уровня защиты – и это не просто нюанс, а выбор силы решения:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>контролирующий poka‑yoke не даёт совершить ошибку – это самый надёжный вариант;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>предупреждающий – только сигнализирует о ней, но человек может его проигнорировать, поэтому он слабее.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Мы в компании всегда, где возможно, выбираем контролирующий вариант – он даёт устойчивый результат и заметно снижает переделки.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Привязка к карте простая: находим шаг с низким %C&amp;A и работаем именно с ним.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#eaf3f9"}}} --></p>
<p class="has-background" style="background-color:#eaf3f9"><span class='font-weight-bold'>В нашем примере проседали груминг (70%) и тестирование (75%) – и причина у обоих одна: работа уходит дальше, не будучи доведённой до нужного состояния. Контрмеры:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>
  .poka-table {
    max-width: 960px;
    margin: 30px auto;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    background: #ffffff;
    border: 1px solid #e5eaf2;
    border-radius: 16px;
    padding: 24px 28px 28px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06);
  }
  .poka-table .tbl-scroll {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    margin: 0 -4px;
  }
  .poka-table table {
    width: 100%;
    min-width: 600px;
    border-collapse: collapse;
    font-size: 14px;
    line-height: 1.5;
  }
  .poka-table caption {
    font-size: 18px;
    font-weight: 700;
    color: #1f2937;
    text-align: left;
    padding: 0 0 16px 0;
    caption-side: top;
  }
  .poka-table thead th {
    background: #f8faff;
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: #6b7280;
    padding: 12px 16px;
    text-align: left;
    border-bottom: 2px solid #e5eaf2;
  }
  .poka-table tbody td {
    padding: 14px 16px;
    border-bottom: 1px solid #f0f2f5;
    color: #374151;
    vertical-align: top;
  }
  .poka-table tbody tr:last-child td {
    border-bottom: none;
  }
  .poka-table tbody tr:hover td {
    background: #fafcff;
  }
  .poka-table tbody td b {
    color: #1f2937;
    font-weight: 700;
  }
  .poka-table .em-g {
    color: #16a34a;
    font-weight: 600;
  }
  .poka-table .em-r {
    color: #d61f26;
    font-weight: 600;
  }</p>
<p>  @media (max-width: 768px) {
    .poka-table {
      padding: 18px 16px 20px;
      margin: 20px 0;
    }
    .poka-table caption {
      font-size: 16px;
    }
    .poka-table table {
      font-size: 13px;
      min-width: 500px;
    }
    .poka-table thead th,
    .poka-table tbody td {
      padding: 10px 12px;
    }
  }
  @media (max-width: 480px) {
    .poka-table {
      padding: 14px 12px 16px;
    }
    .poka-table table {
      font-size: 12px;
      min-width: 400px;
    }
    .poka-table thead th,
    .poka-table tbody td {
      padding: 8px 10px;
    }
  }
</style>
<div class="poka-table">
<div class="tbl-scroll">
<table>
<caption>Poka-yoke по уровню силы — на шаги с низким %C&amp;A</caption>
<thead>
<tr>
<th style="width:26%">Шаг (его %C&amp;A)</th>
<th style="width:37%">Слабо · предупреждающий</th>
<th>Сильно · контролирующий</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class='font-weight-bold'>Груминг (70%)</span><br />требования без границ</td>
<td>Чек-лист граничных случаев (можно пропустить)</td>
<td class="em-g">QA обязателен на груминге + Definition of Ready блокирует передачу в разработку без разобранных границ</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Тестирование (75%)</span><br />баги без шагов → возвраты</td>
<td>Просить шаги на код-ревью бага</td>
<td class="em-g">Обязательное поле «шаги воспроизведения» — без него баг технически не создаётся</td>
</tr>
<tr>
<td>Мёрж без тестов</td>
<td>Напоминание в PR</td>
<td class="em-g">Гейт в CI: мёрж заблокирован при падении или нехватке diff-покрытия</td>
</tr>
</tbody>
</table></div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Контрмера В. DMAIC в поисках причины</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#d5f2e9"}}} --></p>
<p class="has-background" style="background-color:#d5f2e9"><span class='font-weight-bold'>Механика</span>. DMAIC (каркас Six Sigma) используют не каждый день, а только когда на карте виден этап с низким %C&amp;A, а причина проблемы неочевидна.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Он помогает не бросаться чинить первый попавшийся симптом, а разобраться в настоящей причине. Его сила – в пяти чётких шагах: они задают системный подход.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>
  .dmaic-table {
    max-width: 960px;
    margin: 30px auto;
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    background: #ffffff;
    border: 1px solid #e5eaf2;
    border-radius: 16px;
    padding: 24px 28px 28px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06);
  }
  .dmaic-table .tbl-scroll {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    margin: 0 -4px;
  }
  .dmaic-table table {
    width: 100%;
    min-width: 600px;
    border-collapse: collapse;
    font-size: 14px;
    line-height: 1.5;
  }
  .dmaic-table caption {
    font-size: 18px;
    font-weight: 700;
    color: #1f2937;
    text-align: left;
    padding: 0 0 16px 0;
    caption-side: top;
  }
  .dmaic-table thead th {
    background: #f8faff;
    font-size: 11px;
    font-weight: 700;
    text]]></description>
<link>https://quality-lab.ru/blog/chto-tormozit-qa-process-ishhem-problemy-s-pomoshhyu-lean-six-sigma-i-kajdzen/</link>
<pubDate>Fri, 28 Aug 2026 17:27:08 +0300</pubDate>
</item>
<item>
<title>Как мне ИИ помог в Redash разобраться</title>
<description><![CDATA[<p>&nbsp;Одно из применений ИИ — вникнуть в проект и понять "что тут происходит / что мне делать по задаче". Вот как раз о таком применении я сегодня и расскажу.</p><p>У нас настроен дашборд в&nbsp;Redash для проведения НТ (нагрузочного тестирования). Его настроили один раз давно и сейчас тестировщик, проводящий НТ, просто открывает ссылочку и смотрит на циферки:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPZQMDBZ3131yx-cEMT96CrwUIM2ubJ0m8h1bgyZWzdNiWqhysnSpijJHsrzg4muuArg0FdzOMx_w8alDOc6TiYbzdWQVVY7NFane6369jHUnebwNqQABjT-nPKiSXyTcJxD20uUAgqGls2Fqfk39gO_iVpYAFJoIqi_1YkNl7jYeL5kReOEpKQfiWTzI/s1895/Redash.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="812" data-original-width="1895" height="137" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPZQMDBZ3131yx-cEMT96CrwUIM2ubJ0m8h1bgyZWzdNiWqhysnSpijJHsrzg4muuArg0FdzOMx_w8alDOc6TiYbzdWQVVY7NFane6369jHUnebwNqQABjT-nPKiSXyTcJxD20uUAgqGls2Fqfk39gO_iVpYAFJoIqi_1YkNl7jYeL5kReOEpKQfiWTzI/s320/Redash.png" width="320" /></a></div><br /><p>Циферки показывают дату запуска, время, и разницу между последними запусками. И даже раскрашивают эту разницу:</p><p></p><ul style="text-align: left;"><li>зеленый цвет — все ок</li><li>красный — иди проверь, все ли там в порядке</li></ul><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAsRLTKmhG_mn1LG4aECEE6fJjCsAMjMPVEMMqEdsyLwdecydFcPWvrZDjbaYxXUkqCL2E2lv2d8oGbzPgO0EwjcHlMWs1KptOIhEiuktQt5AOzM1IpYf3R4KWYudwpqLtS0Xv_cn9qT3i993uqbZ1gmqTa2cGblZY3mnjnVD0h4vp6UW4Fw-CRPP_618/s855/%D1%80%D0%B5%D0%B4%D0%B0%D1%88-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="375" data-original-width="855" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAsRLTKmhG_mn1LG4aECEE6fJjCsAMjMPVEMMqEdsyLwdecydFcPWvrZDjbaYxXUkqCL2E2lv2d8oGbzPgO0EwjcHlMWs1KptOIhEiuktQt5AOzM1IpYf3R4KWYudwpqLtS0Xv_cn9qT3i993uqbZ1gmqTa2cGblZY3mnjnVD0h4vp6UW4Fw-CRPP_618/s320/%D1%80%D0%B5%D0%B4%D0%B0%D1%88-2.png" width="320" /></a></div><br /><div>Ну а дальше тестировщик уже смотрит, где красное, и идет в интерфейс приложения искать запуск этой задачи и смотреть подробнее.&nbsp;</div><div><br /></div><div>То есть в редаше настройки не трогаем, просто смотрим дашборд (обычно). Если добавляется задача в регрессионный триггер, она автоматически появится в дашборде, так как он ищет по конкретному паттеру в названии.</div><div><br /></div><div>Но тут мне понадобилось его поменять...&nbsp;</div><div><br /></div><span><a name='more'></a></span><div>Мы добавили «тяжелые» задачи, но запускать их решили не еженедельно, а ежемесячно. Сделали отдельный триггер, но хотелось бы видеть их тоже на привычном дашборде. На самом деле можно было бы им название подкрутить, чтобы было "как в нашем триггере". Ну или обновить скрипт дашборда.</div><div><br /></div><div>Вот только я с Redash работала только на уровне «тык-тык по ссылочке». И раньше бы пошла искать знающего человека, чтобы он показал «как тут все устроено» А теперь для этого есть ИИ! Так что я решила начать с общения с чатиком.</div><div><br /></div><div>Пошла к ChatGPT (оригинальному, не trychat или что-то такое, но в целом, можно было поговорить с любой ИИ), начала спрашивать:</div><div><br /></div><div><blockquote>У меня есть дашборд в зеус <i>(ссылка)</i>, а как я могу посмотреть данные в его БД?</blockquote></div><div>Чат подсказал, что надо искать&nbsp;source запроса:</div><div><br /></div><div><blockquote>Если скинешь сюда скрин страницы source или сам SQL из query, я прямо покажу, какая там БД, какие таблицы и каким запросом посмотреть их данные</blockquote></div><div><br /></div><div>Кнопочку «Edit Source» справа вверху я еще раньше виеола, так что зашла в исходный код и показала чату запрос к базе. А он мне рассказал, как он устроен и как можно посмотреть просто данные из базы, до фильтраций.</div><div><br /></div><div>Но где смотреть? Менять source текущего запроса страшно, сломаю еще что-нибудь... Тогда я просто сделала еще раз скриншот экрана и кинула в чат с вопросом:</div><div><br /></div><div><blockquote>и куда мне тут тыкать, чтобы создать собственный запрос и не сломать имеющийся?</blockquote></div><div><br /></div><div>Чат мне тут же подсказал:</div><div><br /></div><p></p><p class="PDq2pG_selectionAnchorContainer" data-end="156" data-start="0"></p><blockquote><p class="PDq2pG_selectionAnchorContainer" data-end="156" data-start="0">Да — чтобы <strong data-end="62" data-start="11">точно не трогать текущий <code data-end="60" data-start="38">Regression_Tasks_new</code></strong>, нажми слева в тёмной панели <strong data-end="104" data-start="92"><code data-end="102" data-start="94">Create</code></strong> (значок <code data-end="116" data-start="113">+</code>), а не редактируй SQL на этой странице.<span aria-hidden="true" class="PDq2pG_selectionAnchor"></span></p><div>
<p data-end="344" data-start="158">Дальше выбери создание <strong data-end="202" data-start="181">Query / New Query</strong> (название пункта может немного отличаться). В новом запросе выбери источник <strong data-end="292" data-start="279"><code data-end="290" data-start="281">CH_zeus</code></strong> — тот же, который виден у тебя сейчас сверху слева.</p>
<p data-end="394" data-start="346">Для проверки вставь безопасный read-only запрос: ...</p></div></blockquote><p><br /></p><p>Нашла, отлично! Ну, с SQL я уже знакома, так что потыкала разные селектики, чтобы понять. что вообще происходит. Когда начала добавлять условия (вручную), налетела на ошибку:</p><p></p><blockquote><p>Code: 47. DB::Exception: Unknown expression or table expression identifier <code class="user-message-inline-code">node</code> in scope ... <i>(тут мой запрос целиком).</i> Maybe you meant: ['NODE']</p><p></p></blockquote><p>Скопировала ошибку, скинула в чат, он мне и объяснил, что в ClickHouse (на основе данных которого и строится дашборд) имена колонок <strong data-end="63" data-start="43">регистрозависимы. </strong><span data-end="63" data-start="43">Ок, исправила, таблицы изучила.</span></p><p>Дальше решила не химичить сама, и снова спросила чат, указав на то место кода, которое собиралась изменить:</p><p></p><blockquote>я бы хотела имеющийся запрос (выше, где and task like ('%_Regression')  ) расширить задачками task in ('Task1', 'Task2'), как это сделать?</blockquote><p></p><p>И не зря! Для этого участка чат написал запрос так, как я бы сама хотела сделать, но закончил мысль так:</p><p></p><blockquote>Но есть один важный нюанс именно в твоём исходном запросе: выше у тебя <code data-end="833" data-start="822">task_name</code> формируется через <code data-end="876" data-start="852">..</code>. И у тебя не сработает, потому что... Если хочешь, могу сразу показать, <strong data-end="1052" data-start="1000">что ещё надо поправить в полном исходном запросе</strong>, чтобы эти две новые задачи корректно отображались в дашборде.</blockquote><p></p><p>Вот блин! Как удачно, что я решила изменить запрос через него, а не самостоятельно.&nbsp;</p><p></p><blockquote>Да, давай</blockquote><p></p><p>Применила правки от чатика, проверила результат — все хорошо. Потом спросила чат, как сохранить исходный запрос — у меня не было там кнопки сохранения. Скинула скрин, вот, мол, просто меняю и нажимаю Execute, да?</p><p class="PDq2pG_selectionAnchorContainer" data-end="142" data-start="0"></p><blockquote><p class="PDq2pG_selectionAnchorContainer" data-end="142" data-start="0">Да, если в <strong data-end="26" data-start="11">Edit Source</strong> нет отдельной кнопки Save и изменения применяются через <strong data-end="98" data-start="83">Execute (⚡)</strong>, то ничего дополнительно сохранять не надо.<span aria-hidden="true" class="PDq2pG_selectionAnchor"></span></p><p>
</p><p data-end="221" data-start="144">То есть: <strong data-end="221" data-start="153">Edit Source → внести две правки → Execute → проверить результат.</strong></p></blockquote><p data-end="221" data-start="144"><strong data-end="221" data-start="153"></strong></p><p data-end="221" data-start="144">Как вы думаете, я сохранила итоговый запрос в блокнот "на всякий случай"? ????</p><p data-end="221" data-start="144">Конечно же, нет, ИИ ведь сказал, что само применится! Обновила страницу, изменений нет))</p><p data-end="221" data-start="144">Сходила к админу, попросила выдать прав, тогда и заветная кнопочка «Save» появилась... Ну и ладно, в чате с ИИ было же записано "измени тут вот так и тут вот так", снова изменила, сохранила... Фух, готово!</p><p data-end="221" data-start="144"><br /></p><h3 style="text-align: left;">Итого&nbsp;</h3><p data-end="221" data-start="144">Если бы я гуглила информацию, то долго бы искала ответы на свои вопросы (как не навредить, случайно затронув прод-запрос). Тут проще сходить за консультацией. Только вот вместо того, чтобы отвлекать коллегу, я помучала ChatGPT!&nbsp;</p><p data-end="221" data-start="144">И в такие моменты ИИ очень хорош, погрузиться в новую для себя тему «самостоятельно». И именно такой навык будет цениться работодателями. как ранее навык гугления (имхо) ????</p><div><p data-end="394" data-start="346"></p></div>]]></description>
<link>http://okiseleva.blogspot.com/2026/08/redash.html</link>
<pubDate>Thu, 27 Aug 2026 18:56:24 +0300</pubDate>
</item>
<item>
<title>Почему оркестр не играет без дирижёра, а команда — без QA и менеджера</title>
<description><![CDATA[<p><a href="https://habr.com/ru/articles/1000404/" mce_href="https://habr.com/ru/articles/1000404/" target="_blank" style="">Оригинальная публикация</a></p><p>
Это третья статья из серии. В первой я разобрал&nbsp;<a href="https://habr.com/ru/articles/996060/" mce_href="https://habr.com/ru/articles/996060/" rel="noopener noreferrer nofollow">5 техник тест-дизайна</a>, во второй - API и Security Testing на собеседованиях. Сегодня тема другая - не техническая. Хочу поговорить про роли в команде.</p><p>Недавно я попал на концерт симфонического оркестра. Сижу в зале, 80 музыкантов на сцене, всё серьёзно - скрипки, виолончели, духовые. И тут дирижёр поднимает палочку, зал затихает, и у меня в голове:</p><p>«Подожди... а зачем он вообще нужен? Они же все профессионалы. Ноты перед глазами. Каждый знает свою партию. Ну начните играть, чего ждать-то?»</p><p>И тут меня накрыло. Я же слышу  такое каждый месяц на работе:</p><blockquote><p><em>«Зачем нам QA? Разработчики сами протестируют.»</em></p><p><em>«Зачем менеджер? Мы сами разберёмся, мы же взрослые.»</em></p></blockquote><p>Одна и та же логика. И там, и тут. Давайте разберу, почему она не работает.</p>]]></description>
<link>https://software-testing.ru/library/around-testing/management/4534-roles-in-the-team-qa</link>
<pubDate>Tue, 25 Aug 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Тестирование 2FA с Playwright и Mailosaur</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/playwright-and-mailosaur/playwright-and-mailosaur1.png" mce_src="https://software-testing.ru/images/stories/library/11hs/playwright-and-mailosaur/playwright-and-mailosaur1.png" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Филип Рик (Filip Hric)<br /><strong><a href="https://filiphric.com/2fa-testing-with-playwright-and-mailosaur" mce_href="https://filiphric.com/2fa-testing-with-playwright-and-mailosaur" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p>
<p>Когда вы пишете end-to-end тесты, аутентификация часто становится первым барьером. Невозможно протестировать реальную функциональность приложения, не пройдя сначала экран логина. Но современные методы аутентификации могут усложнять автоматизацию, используя несколько факторов, которые трудно автоматизировать (в этом и заключается смысл 2FA).</p>
<p>Обычно с этим справляются, либо отключая такие методы в тестовых окружениях, либо используя различные обходные решения. Кто-то может сказать, что это уже не настоящее e2e-тестирование. Честно говоря, это, скорее, тема для отдельной дискуссии, но критика подхода с обходом логина определённо имеет основания.</p>
<p>Так как же правильно работать с аутентификацией?</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-automation/4508-2fa-testing-with-playwright-and-mailosaur</link>
<pubDate>Sun, 23 Aug 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>ИИ в тестировании: ускорение проверки калькулятора с 3 недель до 3 дней</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'><em>Делимся ещё одним кейсом от нашего ведущего эксперта Олега – на этот раз про тестирование расчётного калькулятора с помощью ИИ. Напомним, в <a href="https://quality-lab.ru/blog/navajbkodili-sebe-organizacionno-finansovuyu-sistemu-i-teper-eyo-testiruem/" data-type="post" data-id="30933">прошлой статье</a> Олег честно рассказал, как ему удалось добиться качества и стабильности системы, которую он навайбкодил без полноценного ТЗ и команды разработки. А сейчас – новый разбор: читайте, где прячутся ошибки в вычислениях и как их ловить с помощью ИИ.</em></span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p>Скажу прямо: я не верил в то, что можно адекватно протестировать расчётную систему с помощью ИИ, потому что на практике нейросеть за минуту выдаёт сотню тест‑кейсов, а толку от этого мало. Но жизнь сама меня подтолкнула к такому эксперименту: нужно было протестировать калькулятор трудозатрат, и когда я прикинул объём задач, то с ужасом понял, что мне придётся неделями делать однообразную работу.&nbsp;Решил рискнуть и попробовать применить ИИ не как волшебную кнопку, а как помощника. Результат оказался настолько интересным, что я решил написать об этом статью.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30993,"width":"271px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="609" height="637" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-64_11zon.png" alt="ИИ в тестировании калькулятора" class="wp-image-30993" style="width:271px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-64_11zon.png 609w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-64_11zon-287x300.png 287w" sizes="(max-width: 609px) 100vw, 609px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted {"style":{"color":{"background":"#eaf3f9"}}} --></p>
<pre class="wp-block-preformatted has-background" style="background-color:#eaf3f9">Если коротко, то примерно <span class='font-weight-bold'>122 часа вручную</span> у меня бы ушло на то, что я сделал <span class='font-weight-bold'>за 27 часов с ИИ</span>. Рассказываю, какие инструменты и промпты реально сработали, как я строил матрицу покрытия и, самое важное, как не дать ошибкам просочиться в расчёты.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Постановка задачи</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Мне предстояло протестировать <span class='font-weight-bold'>калькулятор для оценки трудозатрат и стоимости тестирования</span>. Вот как он работает: вводишь параметры будущего проекта – он выдаёт оценку часов, состав команды, сроки и итоговую стоимость. Это не Excel‑таблица, а полноценный веб‑калькулятор: интерфейс на HTML, математика – в движке на JavaScript.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Выглядит просто, но «под капотом» всё куда сложнее.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>6 видов тестирования в отдельных модулях – ручное функциональное, автоматизация, нагрузочное, юзабилити, интеграционное и ИБ. Плюс седьмой собирает всё вместе;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>79 входных параметров: числа, выпадающие списки с коэффициентами, переключатели, слайдеры рисков;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>70 расчетных формул, многие из которых ссылаются друг на друга;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>карта из 12 ролевых ставок, из которых собирается смешанная ставка помодульно;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>сквозная зависимость через сводку: подсчёты из модулей собираются в итог с накладными, запасом на риски и НДС.&nbsp;</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Главная опасность: дернул одну вводную, поехало половина калькулятора. Вот несколько примеров логики прямо из движка. Прочувствуйте боль.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code {"style":{"color":{"background":"#e5e5e5"}}} --></p>
<pre class="wp-block-code has-background" style="background-color:#e5e5e5"><code>
Ручное: трудозатраты на прогон — цепочка из пяти множителей
  execMin = кейсы × мин_на_кейс × сложность × прогоны × платформы
 
Автоматизация: точка окупаемости
  окупаемость_мес = (разработка + фреймворк) / (экономия − поддержка)
  // знаменатель ≤ 0  →  «не окупается» (деление на ~ноль)
 
Сводка: накладные и резерв на риски
  деньги:  итог = (база + база×overhead) × (1 + резерв) × (1 + НДС)
  часы:    итог = база + база×overhead + база×резерв
</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>Сложность в том, что при ручном расчёте перемножаются пять коэффициентов: ошибка в одном незаметно меняет весь результат. В автоматизации точка окупаемости считается как «экономия минус поддержка». Но результат может быть нулевым или отрицательным – и получится деление на ноль, спрятанное внутри бизнес‑логики.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Ещё нюанс: в сводке накладные и резерв считаются по‑разному. Для денег – каскадом (резерв берут уже от суммы с накладными), а для часов – линейно от базы. Из‑за этого любая неточность влияет на итоговую стоимость. При этом число выглядит корректным – и ошибку легко не заметить.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Почему тестировать такую систему вручную – это ад?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>В тестировании расчётных систем есть понятие «<a href="https://ieeexplore.ieee.org/document/6963470" rel="nofollow">проблема оракула</a>». Чтобы проверить, что калькулятор верно посчитал 1 234,5, нужен эталон – независимо полученное «правильное» число. А чтобы получить такое, придётся вручную пройти всю цепочку формул. И так – для каждого тест‑кейса, пока не покроешь все варианты входных значений, границы, ветвления и взаимодействия параметров. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Я сел и прикинул ручную оценку для такого объема. Вот она по этапам:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:table --></p>
<figure class="wp-block-table">
<table class="has-fixed-layout">
<tbody>
<tr>
<td><span class='font-weight-bold'>Этап</span></td>
<td><span class='font-weight-bold'>Часы</span></td>
<td><span class='font-weight-bold'>Почему так долго?</span></td>
</tr>
<tr>
<td>Разбор формул и граф зависимостей</td>
<td>12</td>
<td>~70 формул в шести модулях, у каждой надо понять на какие другие формулы или результаты она влияет</td>
</tr>
<tr>
<td>Тест-дизайн (чек-лист)</td>
<td>38</td>
<td>Классы эквивалентности, границы, попарное тестирование по 79 параметрам, да еще и ветвления методов – это больше тысячи проверок</td>
</tr>
<tr>
<td>Расчет эталонов (оракул)</td>
<td>42</td>
<td>Нужно вручную рассчитать ожидаемое число для каждого кейса</td>
</tr>
<tr>
<td>Прогон и сравнение</td>
<td>18</td>
<td>Заполнить поля, снять результат, сравнить с эталоном – и так по всем модулям и сводке</td>
</tr>
<tr>
<td>Триаж и документация</td>
<td>от 3 до 12</td>
<td>Разобрать расхождения, оформить отчет</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Итого</span></td>
<td><span class='font-weight-bold'>≈ 122</span></td>
<td><span class='font-weight-bold'>Примерно 3 рабочие недели</span></td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30995,"width":"324px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-60_11zon-1.png" alt="ИИ в тестировании" class="wp-image-30995" style="width:324px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-60_11zon-1.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-60_11zon-1-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-60_11zon-1-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-60_11zon-1-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted {"style":{"color":{"background":"#eaf3f9"}}} --></p>
<pre class="wp-block-preformatted has-background" style="background-color:#eaf3f9">Три недели на один калькулятор! При этом 42 часа из 122 – однообразная выматывающая рутина с высокой вероятностью ошибок. Потом поди разберись, кто наврал – калькулятор или уставший тестировщик.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Почему я решил применить ИИ для решения этой задачи?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Смотрите, какая картина получается. Логика калькулятора детерминирована: одинаковые входы дают одинаковый выход. Много однотипных вариаций. Важно сгенерировать массу комбинаций по чётким правилам и аккуратно просчитать арифметику. Именно в таких задачах языковые модели полезны.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Важная оговорка: ИИ склонен к галлюцинациям – и в расчётах это опасно. Модель уверенно выдаёт правдоподобное, но неверное число, и заметить ошибку непросто. Поэтому главный принцип методики такой: не верить одной модели. Истина появляется там, где совпадают несколько независимых способов посчитать одно и то же.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Алгоритм тестирования калькулятора с помощью ИИ</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Прежде чем погружаться в детали, вот общий порядок действий.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li>Выгрузка формул и построение графа зависимостей.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Декомпозиция на тестируемые единицы: формула, модуль, сквозной сценарий.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>ИИ-генерация чек-листа (тест-дизайн): классы эквивалентности, границы, негативные и тд.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Матрица покрытия и ревью – ищем дыры.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Независимый оракул: считаем эталоны «вслепую» тремя способами.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Прогон реального калькулятора и сравнение с эталоном.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Триаж расхождений (баг калькулятора, ошибка оракула, галлюцинация).</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Стек инструментов</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:table --></p>
<figure class="wp-block-table">
<table class="has-fixed-layout">
<tbody>
<tr>
<td><span class='font-weight-bold'>Инструмент</span></td>
<td><span class='font-weight-bold'>Роль в процессе</span></td>
</tr>
<tr>
<td>Claude (старшая модель, Opus Х.Х)</td>
<td>Основной «рассуждающий» движок: разбор формул, генерация чек-листа, расчет эталонов с пошаговой арифметикой</td>
</tr>
<tr>
<td>Модель другого вендора (у меня был Gemini)</td>
<td>Перекрестный расчет эталонов – второй независимый «свидетель»</td>
</tr>
<tr>
<td>Python</td>
<td>Независимая референс-реализация формул на коде – третий «свидетель» и главный барьер от галлюцинаций</td>
</tr>
<tr>
<td>Playwright (headless-браузер)</td>
<td>Прогон самого калькулятора: заполняем поля вводными из кейса, снимаем фактические выходные значения. Для эффективности можно было все прогнать на уровне unit-тестов, но как выше говорил, мне хотелось написать статью, потому я применил порой избыточные методы</td>
</tr>
<tr>
<td>Pytest + git</td>
<td>Сборка всего в регрессионный набор, который прогоняется по кнопке</td>
</tr>
<tr>
<td>Pairwise-инструмент</td>
<td>Старая добрая комбинаторика</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Примеры промптов, которые я использовал</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading"><span class='font-weight-bold'>Выгрузка формул и граф зависимостей</span></h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Сперва нужно понять, что тестируем, – для этого нужна карта. Поскольку математика лежит в JS‑движке, скрипт на Python проходится по коду и выгружает все формулы: к какому модулю они относятся, какие входные поля читают и в какое выходное значение пишут. Так получется граф зависимостей: он показывает, какие узлы – входные, промежуточные и итоговые, а также как они связаны. Особенно это заметно в сводке – туда стекаются данные из всех шести модулей.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>И я подключил модель – не для расчётов, а чтобы она помогала объяснять.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Вот первый промпт:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code {"style":{"color":{"background":"#e5e5e5"}}} --></p>
<pre class="wp-block-code has-background" style="background-color:#e5e5e5"><code>
Роль: старший QA-инженер по тестированию расчетных систем.
На входе — выгрузка формул из кода калькулятора:
  &#091;модуль | входные поля | формула | выходное поле].
Твоя задача — НЕ считать значения, а:
  1) описать простыми словами, что вычисляет каждая формула;
  2) перечислить, от каких ВХОДНЫХ параметров она зависит;
  3) пометить формулы, где возможны граничные эффекты:
     деление, округление, ветвления ЕСЛИ, перемножение коэффициентов.
Формат: таблица &#091;Формула | Назначение | Входы | Тип риска].
Если формула неоднозначна — поставь «????» и НЕ выдумывай смысл.
Данные: &lt;выгрузка&gt;
</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>Обратите внимание на две вещи в промте. Первое – явный запрет считать («НЕ считать значения»): на этом этапе нам нужна семантика, а не арифметика, и любое число от модели здесь было бы лишним поводом для ошибки. Второе – разрешение сказать «не знаю» («поставь ???? и НЕ выдумывай»). Это простое правило, но именно его отсутствие часто приводит к «галлюцинациям»: модель считает, что обязана дать ответ, и начинает его придумывать.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Декомпозиция и генерация чек-листа</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Я разбил калькулятор на три уровня тестирования:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>формула – проверяем каждую в изоляции;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>модуль – целый вид тестирования (например, расчёт автоматизации с точкой окупаемости);</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>сквозной сценарий – реалистичный проект целиком: заполняем несколько модулей и смотрим, как сводка собирает итог с накладными, резервом и НДС.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Для каждого уровня – свой набор проверок. И вот тут ИИ принёс реальную пользу.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Промт на тест-дизайн:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code {"style":{"color":{"background":"#e5e5e5"}}} --></p>
<pre class="wp-block-code has-background" style="background-color:#e5e5e5"><code>
Роль: ведущий тест-аналитик.
На входе — формула, ее входные параметры, диапазоны и классы значений.
Сгенерируй чек-лист проверок строго по методикам:
  (1) классы эквивалентности;
  (2) анализ граничных значений: min-1, min, min+1, типовое,
      max-1, max, max+1, за границей;
  (3) негативные / невалидные значения.
Для каждой проверки выведи:
  ID | все входные значения | какой класс/границу проверяем |
  ожидаемое ПОВЕДЕНИЕ СЛОВАМИ (НЕ число!) | приоритет П1-П3
Приоритет — по риску искажения итоговой стоимости и срока.
НЕ придумывай параметров, которых нет во вводных.
Формат: CSV.
Параметры: &lt;...&gt;
</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>Ключевой нюанс – «ожидаемое поведение словами, НЕ число». На этапе дизайна мы фиксируем что должно произойти («при росте сложности трудозатраты не уменьшаются», «при количественной юзабилити система не должна молча подменять введенное число респондентов», «при нулевой экономии автоматизация должна честно показать „не окупается“, а не упасть в ошибку»), но не конкретные цифры.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Цифры оставляем на потом – это задача оракула, их считаем отдельно и независимо. Если смешать дизайн и расчёты в одном промпте, модель начнёт подгонять логику под удобные ей числа. Разделяй и властвуй.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В итоге после нескольких итераций получился <span class='font-weight-bold'>чек‑лист на 1 150 проверок</span>. Звучит много, но вручную <span class='font-weight-bold'>я бы расписывал их 38 часов</span>. ИИ быстро сгенерировал черновик, а мне осталось только вычитать и убрать дубли.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Поиск дыр в матрице покрытия</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Чек‑лист без матрицы покрытия – просто набор строк, в котором не видно пробелов. Поэтому я попросил модель свести всё в матрицу: по строкам – узлы расчёта (из графа зависимостей), по столбцам – виды проверок.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Вот промпт.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code {"style":{"color":{"background":"#e5e5e5"}}} --></p>
<pre class="wp-block-code has-background" style="background-color:#e5e5e5"><code>
Построй матрицу покрытия.
Строки — узлы расчета (формулы) из графа зависимостей.
Столбцы — виды проверок:
  Классы эквивалентности | Граничные |
  Негативные | Инвариант/свойство | Якорный кейс.
В ячейке — количество проверок данного вида + список их ID.
В конце — строка ИТОГО и ПОДСВЕТИ узлы, где в каком-либо
столбце стоит 0 (это пробел покрытия — туда смотрим в первую очередь).
Формат: Markdown-таблица.
Данные: &lt;чек-лист CSV&gt;
</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>Это фрагмент матрицы покрытия (пример). Видно, на какие узлы приходится больше всего проверок.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":30996,"width":"841px","height":"auto","sizeSlug":"large","linkDestination":"none"} --></p>
<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="598" src="https://quality-lab.ru/wp-content/uploads/2026/08/b2048b3591e4f73dc4de2ac6df66e99e-1-1024x598.png" alt="Матрица покрытия с помощью ИИ" class="wp-image-30996" style="width:841px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/b2048b3591e4f73dc4de2ac6df66e99e-1-1024x598.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/b2048b3591e4f73dc4de2ac6df66e99e-1-300x175.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/b2048b3591e4f73dc4de2ac6df66e99e-1-768x448.png 768w, https://quality-lab.ru/wp-content/uploads/2026/08/b2048b3591e4f73dc4de2ac6df66e99e-1-1536x897.png 1536w, https://quality-lab.ru/wp-content/uploads/2026/08/b2048b3591e4f73dc4de2ac6df66e99e-1.png 1560w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p>Первая же матрица подсветила три узла, где в столбце «Негативные» стоял ноль: модель просто забыла про невалидные входы. Я вернул их в работу отдельным промтом. Вот почему матрицу строит ИИ, а анализирует человек: модель отлично сводит данные в таблицу, но решение остаётся за инженером.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Независимый оракул</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Вот и самое интересное. Эталонное значение для каждого кейса я считал вслепую тремя способами. Подробно об этом – в следующем разделе. Здесь покажу промт, которым модель считает эталон. Важно: нейронка не должна видеть реальный результат калькулятора в момент расчёта – иначе она просто перепишет его и «подтвердит» любую ошибку.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Промпт такой.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code {"style":{"color":{"background":"#e5e5e5"}}} --></p>
<pre class="wp-block-code has-background" style="background-color:#e5e5e5"><code>
Роль: расчетчик-аудитор.
Тебе даны: формула и КОНКРЕТНЫЙ
набор входных значений. Фактический результат калькулятора
тебе НЕ показан и показан не будет.
Посчитай ожидаемый результат ВРУЧНУЮ, показывая КАЖДЫЙ
промежуточный шаг и число.
Запрещено:
  - округлять раньше, чем это указано в формуле;
  - пропускать шаги;
  - подгонять под «красивый» ответ.
Если есть ветвление ЕСЛИ — явно укажи активную ветку и почему.
Выведи:
  - пошаговый расчет (текст);
  - финальное число;
  - отдельным JSON-блоком ВСЕ промежуточные значения
    (для автоматической сверки кодом).
Если данных не хватает — напиши «НЕДОСТАТОЧНО ДАННЫХ», не угадывай.
Формула: &lt;...&gt;   Входы: &lt;...&gt;
</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>Тот самый JSON с промежуточными значениями – не для красоты. Он нужен, чтобы код потом перепроверил не только финальное число, но и каждый шаг вычисления. Если модель «угадывала» правильный итог через неправильные промежуточные шаги (а так бывало), я это видел. А если модель выдавала итог вообще без выкладок – такой ответ я отбраковывал автоматически.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Прогон калькулятора и триаж расхождений</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Фактический результат снимался так: headless‑браузер открывал калькулятор, скрипт заполнял поля данными из кейса, дожидался пересчёта и считывал выходные значения – по всем модулям и из сводки.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns {"verticalAlignment":"center"} --></p>
<div class="wp-block-columns are-vertically-aligned-center"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"id":30997,"width":"393px","height":"auto","sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-51_11zon-1.png" alt="нейросети в тестировании" class="wp-image-30997" style="width:393px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-51_11zon-1.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-51_11zon-1-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-51_11zon-1-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-51_11zon-1-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center","style":{"color":{"background":"#eaf3f9"}}} --></p>
<div class="wp-block-column is-vertically-aligned-center has-background" style="background-color:#eaf3f9"><!-- wp:preformatted {"style":{"color":{"background":"#eaf3f9"}}} --></p>
<pre class="wp-block-preformatted has-background" style="background-color:#eaf3f9">Получались три эталона (Claude, Gemini, Python‑реализация) и одно фактическое число от калькулятора – дальше шло сравнение. Если что‑то расходилось, я не просил модель «проголосовать» за правильный ответ, так как мне не нужна была уверенная чушь.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Вместо этого – промт на разбор:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code {"style":{"color":{"background":"#e5e5e5"}}} --></p>
<pre class="wp-block-code has-background" style="background-color:#e5e5e5"><code>Дано: формула, входы и четыре числа:
  - эталон_1 (Claude),
  - эталон_2 (Gemini),
  - эталон_3 (Python-оракул),
  - фактический результат калькулятора.
Они расходятся. НЕ выбирай правильный голосованием.
Вместо этого:
  1) разложи каждый расчет по шагам;
  2) найди ПЕРВЫЙ шаг, на котором числа разошлись;
  3) назови вероятную причину именно этого расхождения:
     ошибка округления / двойной учет коэффициента /
     неверная ветка ЕСЛИ / неверный порядок операций / галлюцинация.
Гипотеза: это баг калькулятора, ошибка оракула или фантазия модели?
Не делай утверждений без указания КОНКРЕТНОГО шага.</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>Требование «найди первый шаг расхождения» превращает расплывчатое «тут что-то не так» в точную координату: вот здесь, на умножении базы на коэффициент накладных в сводке, два расчета разъехались. Дальше уже дело техники – посмотреть глазами, кто прав.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Как я боролся с галлюционированием ИИ?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Прогнать тесты через ИИ могут все, а вот сделать так, чтобы результатам можно было доверять, – это уже сложнее. Вот что мне помогло.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Три независимых свидетеля.</span> Эталон считал тремя способами: Claude, Gemini и Python‑оракул. Если все сошлись – результату можно доверять, а если разошлись – кейс разбирал вручную.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Истину считал код.</span> Python‑оракул – детерминированный код, который не умеет галлюцинировать, – главный арбитр. Модели нужны для тест‑дизайна и понятных выкладок, код – чтобы выносить окончательный вердикт.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Расчёт «вслепую».</span> Моделям при генерации эталона я не показывал реальный результат калькулятора – иначе они просто подтверждали любую ошибку.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Пошаговая арифметика и автосверка.</span> Модель была обязана показать каждый промежуточный шаг и выгрузить их в JSON. Код проверяет не только итог, но и все шаги: так я ловил случаи, когда ответ верный, а путь к нему – нет. Ответы без подробных выкладок сразу отбраковывал.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Инварианты.</span> Проверял свойства, которые должны выполняться при любых входных данных (например, неотрицательность или монотонность) – для этого использовал hypothesis.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Якорные кейсы.</span> 17 кейсов я заранее посчитал вручную – это «якоря». Если модель или оракул не воспроизводили якорь, останавливался и разбирал, что сломалось в самом конвейере, прежде чем доверять ему остальные кейсы.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Перепроверки. </span>Ключевые кейсы проверял несколько раз: если ответ менялся от прогона к прогону – значит данные были недостоверны.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Сверка единиц измерений.</span> Код проверял, чтобы часы не путались с днями, проценты были согласованы. Часть расхождений появлялась именно из‑за разных единиц – эта проверка их ловила.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Результаты тестирования</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Из <span class='font-weight-bold'>1150 проверок калькулятор дал сбой в 23 случаях: 5 критичных, 9 средних, 9 косметических дефектов.</span> Самое ценное – что нашлись именно незаметные баги: калькулятор не сбоил масштабно, а слегка неверно считал. Такие дефекты хуже всего ловятся вручную: число выглядит правдоподобно, глаз замыливается – и ты просто идёшь дальше.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>По времени вышло так: без ИИ на эту работу ушло бы около 122 часов, с ИИ – примерно 27.</span> Нейросеть оказалась способна забрать большую часть рутины, оставив мне 27 часов интеллектуальной исследовательской работы.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#ddf3ed"}}} --></p>
<p class="has-background" style="background-color:#ddf3ed">Расчетные системы – <a href="https://quality-lab.ru/testing-fintech/" data-type="page" data-id="29753">отдельная боль тестирования</a>: их страшно трогать, потому что логика в них капризная, а баги очень дорогие. Мы в «Лаборатории качества» часто тестируем биллинги, тарификаторы, скоринг, прогнозные калькуляторы, финансовые и актуарные модели. Обращайтесь за бесплатной консультацией &#8212; поделимся опытом поможем решить вашу задачу. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Вывод:</span> <a href="https://quality-lab.ru/blog/kakie-zadachi-v-testirovanii-pora-otdat-ii-chtoby-poluchit-rezultat-a-ne-novye-problemy/" data-type="post" data-id="30207">ИИ отлично справляется с рутиной</a>: генерирует вариации по методике (классы эквивалентности, границы), расписывает пошаговую арифметику, сводит данные в матрицы и формулирует гипотезы о причинах расхождений. Но ему нельзя доверять как единственному источнику истины в расчётах, поручать оценку покрытия или «голосование» за правильный ответ – это зона ответственности тестировщика. По сути, ИИ – быстрый и талантливый стажёр, которого нужно тщательно контролировать.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>]]></description>
<link>https://quality-lab.ru/blog/ii-v-testirovanii-uskorenie-proverki-kalkulyatora-s-3-nedel-do-3-dnej/</link>
<pubDate>Fri, 21 Aug 2026 12:09:47 +0300</pubDate>
</item>
<item>
<title>Почему индустриальный подход к качеству важнее Agile-ритуалов</title>
<description><![CDATA[<p><a href="https://www.software-testing.ru/about/authors/4532-amotovilov" mce_href="https://www.software-testing.ru/about/authors/4532-amotovilov" target="_blank" style="">Артём Мотовилов</a><br /><a href="https://habr.com/ru/articles/995772/" mce_href="https://habr.com/ru/articles/995772/" target="_blank" style="">Оригинальная публикация</a></p><p><img src="https://software-testing.ru/images/stories/library/11hs/industrial-approach-to-quality/industrial-approach-to-quality1.png" mce_src="https://software-testing.ru/images/stories/library/11hs/industrial-approach-to-quality/industrial-approach-to-quality1.png" alt="" /></p><h2>Предисловие</h2><p>Эта статья&nbsp;— не&nbsp;критика Agile или&nbsp;Kanban как&nbsp;подходов и не&nbsp;попытка доказать, что&nbsp;в&nbsp;IT «всё делают неправильно». Я делюсь наблюдениями из&nbsp;собственного опыта работы с&nbsp;качеством в&nbsp;промышленности, энергетике, а&nbsp;затем&nbsp;— в&nbsp;IT‑продуктах.</p><p>Речь пойдёт не&nbsp;о&nbsp;терминах и инструментах, а&nbsp;о&nbsp;том, как&nbsp;часто теряется системное мышление, когда сложные управленческие модели упрощаются до&nbsp;ритуалов. </p><p>Если у&nbsp;вас уже выстроена работа и всё стабильно&nbsp;— это отлично. Если нет&nbsp;— возможно, некоторые наблюдения покажутся полезными</p>]]></description>
<link>https://software-testing.ru/library/around-testing/processes/4533-industrial-approach-to-quality</link>
<pubDate>Tue, 18 Aug 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Не разрешайте ИИ читать .env-файлы</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/env1.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/env1.jpg" width="140" mce_style="float: left;" style="float: left;" />Автор:</strong> Филип Рик (Filip Hric)<br /><strong><a href="https://filiphric.com/dont-let-ai-read-your-env-files" mce_href="https://filiphric.com/dont-let-ai-read-your-env-files" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p>
<p>ИИ-ассистенты для написания кода - Claude Code, Cursor и GitHub Copilot, - становятся частью повседневного рабочего процесса. Они читают файлы, понимают кодовую базу и помогают писать код быстрее. Но есть проблема — они также могут читать .env-файлы. В последнее время в соцсетях <a href="https://www.linkedin.com/posts/abhishekray00_i-dont-know-if-this-screenshot-is-real-but-activity-7404195631377883136-MzfR" mce_href="https://www.linkedin.com/posts/abhishekray00_i-dont-know-if-this-screenshot-is-real-but-activity-7404195631377883136-MzfR">ходит история об этом</a>, и я сам столкнулся с этим на практике:</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-automation/4506-dont-let-ai-read-your-env-files</link>
<pubDate>Sun, 16 Aug 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Кейс о вайбкодинге корпоративной системы и её тестировании</title>
<description><![CDATA[<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'><em>Личный кейс нашего ведущего эксперта Олега о том, как ему удалось добиться качества и стабильности рабочей системы, которую он сам же и навайбкодил без полноценного ТЗ и команды разработки.</em></span> </p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:paragraph --></p>
<p>В один прекрасный день руководитель финансовой службы обратилась ко мне с вопросом: «У Иры отпускные за март на 4 700 рублей больше, чем должно быть. Гляньте, пожалуйста». Я открыл код, нашёл функцию расчёта отпускных, проверил формулу – она была правильной.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Через час нашёл вторую функцию расчёта отпускных. Она пряталась в модуле выгрузки отчётов и её логика отличилась, а я даже не подозревал о существовании этого куска функционала. Тут до меня дошло: так и устроен <a href="https://quality-lab.ru/blog/ispolzuete-ii-dlya-napisaniya-koda-obyasnyaem-kak-ego-pravilno-testirovat/" data-type="post" data-id="30745">сгенерированный ИИ</a> продукт. Да, он работает, им ежедневно пользуются больше ста человек, но в нём есть куски, о которых не знает никто, включая создателя.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"id":30934,"width":"296px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-42.png" alt="Тестирование ИИ кода" class="wp-image-30934" style="width:296px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-42.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-42-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-42-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-42-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Эта статья – о том, что с такими продуктами делать. В первую очередь для тестировщиков, которым их приносят. Во вторую – для владельцев, которые пока не видят разницы с обычной разработкой.&nbsp;</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Кому не зайдёт? </span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Если вы пишете код руками и не собираетесь это менять – статья не про вас. Если вы уже выстроили тестирование сгенерированных продуктов как процесс – тоже, вы всё это проходили. Я написал для тех, кто посередине: <span class='font-weight-bold'>продукт уже есть, а понимания ещё нет</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Постановка эксперимента</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Передо мной стояла задача создать <span class='font-weight-bold'>внутреннюю систему для небольшой компании</span>, с помощью которой можно было бы вести <span class='font-weight-bold'>учёт трудозатрат, управлять экономикой проектов, рассчитывать отпуска, зарплаты, выплаты, окупаемость и многое другое.</span> Работа с деньгами и персоналом – одна из самых рискованных областей: любая ошибка здесь особенно критична. Поэтому проект использовали как <span class='font-weight-bold'>экспериментальную площадку для практики</span> – чтобы накопить опыт для основной деятельности компании: обеспечения качества программных продуктов.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Условия оказались непростыми. Технического задания практически не было – только табличка и 20‑минутное видео с пояснениями к ней. Остальные требования поступали устно, по одному предложению. Команды тестирования не было.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30935,"width":"371px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-49_11zon.png" alt="Тестирование ИИ-продуктов" class="wp-image-30935" style="width:371px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-49_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-49_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-49_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-49_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Руководитель отлично понимал, что хочет получить, но с генерацией кода дела не имел. Я умел генерировать, но не знал, как на практике считаются многие штуки в 1С. Домен у одного, руки у другого, чертежа нет ни у кого.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0">Такие условия не создавали намеренно – они сложились сами собой. <a href="https://quality-lab.ru/blog/transforming-chaos-into-order/" data-type="post" data-id="5152">ТЗ</a> не подготовили из‑за нехватки времени, тестировщика не привлекали, так как решили проверить, получится ли справиться силами двух человек, для которых эта задача не была основной. Именно сейчас, оборачиваясь назад, такой подход можно трактовать как своеобразный «дизайн эксперимента», а тогда это воспринималось как обычный рабочий вторник.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Что в итоге получилось?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Первая рабочая версия системы появилась за полторы недели</span> – её я собирал по вечерам. Уже <span class='font-weight-bold'>через полтора месяца она заменила восемь Excel‑файлов и стала единым источником данных по проектам и выплатам</span>. По скорости такая разработка в разы быстрее обычной, а по стоимости – дешевле на порядок. В целом опыт считаю положительным: его можно повторить, если учесть сделанные выводы.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Теперь о цене вопроса. <span class='font-weight-bold'>За первый месяц закрыл больше двадцати исправлений, и две трети из них касались не мелких визуальных недочётов, а ошибок в расчётах.</span> Работа над устранением ошибок продолжается до сих пор – вероятно, <span class='font-weight-bold'>в <a href="https://quality-lab.ru/blog/ispolzuete-ii-dlya-napisaniya-koda-obyasnyaem-kak-ego-pravilno-testirovat/" data-type="post" data-id="30745">подобных проектах</a> багфиксинг становится не финальным этапом, а постоянным режимом работы.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30936,"width":"311px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="500" height="500" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle__39_-removebg-preview_11zon.png" alt="Вайбкодинг" class="wp-image-30936" style="width:311px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle__39_-removebg-preview_11zon.png 500w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle__39_-removebg-preview_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle__39_-removebg-preview_11zon-150x150.png 150w" sizes="(max-width: 500px) 100vw, 500px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Лучше всего суть подхода описывает такая аналогия: <span class='font-weight-bold'>вайбкодинг – это как строить дом из гипсокартона.</span> Стену можно возвести за час: она выглядит как настоящая, её можно покрасить, повесить на неё полку. Но при этом неизвестно, какая из стен несущая, а какая – просто декорация. </pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0">И прораб этого тоже не знает, потому что прорабом выступает сам разработчик. В моём контексте «гипсокартон» – это локально правдоподобная конструкция, чья реальная надёжность остаётся неизвестной.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Проблемы вайбкодинг-продуктов</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>За время работы с системой я успел столкнуться с разными странностями: где-то логика была размазана по нескольким модулям, где-то одна и та же задача решалась по-разному, а где-то я просто не понимал, почему система делает именно так. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В какой-то момент понял, что это уже не набор случайных косяков, а вполне закономерные проблемы, которые повторяются из раза в раз. Поэтому решил структурировать их и разобрать по порядку. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Требование, сформулированное в одном предложении, обходится дороже, чем кажется на первый взгляд</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Например, вся постановка задачи для подсистемы начисления отпусков сводилась к фразе: «Сделай начисление отпусков».</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Пробелы в требованиях не остаются пустыми: часть из них мы достраиваем исходя из собственного понимания, часть – автоматически заполняется типовым решением. Со стороны это выглядит как готовая функция, а не как нерешённый вопрос, поэтому никто не задаёт уточняющих вопросов.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Так, система начала начислять отпускные дни с первого рабочего дня всем сотрудникам – в том числе подрядчикам, которым отпуск не положен. В течение трёх недель система корректно, на первый взгляд, вела расчёт, и я не проверял эти данные: просто не видел здесь зоны риска. Руководитель знал правильный подход, но не догадывался, что вопрос уже «закрыт» без его участия.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Демо‑версия обходится дешевле, чем подробное описание требований, – и в этом кроется ловушка</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Когда показать продукт быстрее, чем его описать, <a href="https://quality-lab.ru/blog/kak-zapisat-trebovaniya-i-zachem-razlichat-brd-srs-i-backlog/" data-type="post" data-id="26762">требования</a> перестают фиксироваться в тексте. Они проявляются только как реакция на готовое решение: «А тут надо сделать иначе». В итоге приёмка превращается в способ уточнения требований, каждая итерация порождает новые задачи, и продукт разрастается фрагментарно – без единого замысла.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30937,"width":"288px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-44_11zon.png" alt="вайбкодинг техническое задание" class="wp-image-30937" style="width:288px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-44_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-44_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-44_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-44_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Добавить новую функцию можно за сорок минут – поэтому их и добавляют. А вот про архитектуру забывают: она не фигурирует ни в одном коротком запросе. У вас ситуация может быть противоположной: если заказчик заранее готовит ТЗ, часть этих проблем снимается.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Изначально в проекте была продумана архитектура, но после десятка итераций по наращиванию функционала от первоначального замысла почти ничего не осталось.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Вайбкодер, не погружённый в предметную область, не замечает нелогичных значений</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Обычный разработчик, прописывая формулу вручную, нередко спотыкается на неясных моментах. В моём случае такого «момента проверки» не было: система сразу выдавала готовое число. Например, показатель окупаемости проекта – 47 % – выглядел вполне убедительно. Но когда финансист начала разбираться и задавать вопросы о логике расчёта, после нескольких раундов уточнений выяснилось, что исходная формула в системе была неверной.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30967,"width":"290px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="707" height="660" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-59.png" alt="Rectangle-59" class="wp-image-30967" style="width:290px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-59.png 707w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-59-300x280.png 300w" sizes="(max-width: 707px) 100vw, 707px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Даже мой солидный опыт – в том числе в судебной бухгалтерии, управлении департаментами и ИТ – не гарантировал корректность расчётов. Это был не первый и, вероятно, не последний случай, когда из‑за недочётов в логике выглядели неочевидными даже базовые вещи.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Суть проблемы проста: автоматизированная генерация убирает необходимость глубоко вникать в то, что создаётся. Для интерфейсов это удобно, а в бизнес‑расчётах – крайне рискованно.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Локально всё выглядит логично, а в общей картине – не согласовано</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Каждая сессия генерации словно новая бригада: рабочие видят только ту комнату, где трудятся, и не знают про остальные. Нужен расчёт для отчёта – бригада ставит новую «стену», не подозревая, что этажом ниже такая уже есть.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Отсюда вытекает другая проблема: правка в одном месте ломает что‑то рядом. Нет общего замысла, связи между модулями возникают случайно, а о них узнаёшь только в момент сбоя. Например, при исправлении округления в ведомости сломалась сверка с табелем: оказалось, они использовали одну функцию. Об этом не знал никто.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Пустые и редкие сценарии часто остаются вне зоны внимания</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30939,"width":"274px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-40_11zon.png" alt="Тестирование ИИ-кода" class="wp-image-30939" style="width:274px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-40_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-40_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-40_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-40_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Например, сотрудник уволился 12‑го числа, а система начислила ему зарплату за полный месяц. Или при переходе с декабря на январь у части сотрудников обнулились остатки отпуска. </pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Ещё один случай – перерасчёт задним числом незаметно изменил уже выплаченные суммы. В реальной работе такие ситуации – обычная рутина, но в сгенерированном коде они не предусмотрены: система просто «не знает» о их существовании.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Дело в том, что генерация опирается на типовой код, а он покрывает только стандартный, «идеальный» сценарий. Граничные и редкие случаи появляются лишь тогда, когда их специально оговаривают. В моём проекте никто не прорабатывал требования до уровня граничных значений, не учитывал нетипичные ситуации. Попытки закрыть эти пробелы в процессе генерации не дали результата: для полноценной проработки таких нюансов нужен был эксперт в предметной области.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Деньги, даты и округления нередко ведут себя непредсказуемо</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30940,"width":"277px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-51_11zon.png" alt="вайбкодинг приложения" class="wp-image-30940" style="width:277px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-51_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-51_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-51_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-51_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Так, денежные значения оказались в формате float: на экране отображалось 15 234,50, а в выгрузке – 15 234,49. Такой расхождение финансист не одобрит – и это справедливо.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Ещё одна проблема проявилась с расчётами ближе к полуночи: они «уезжали» в соседний месяц. Причина была в разнице часовых поясов: сервер работал в UTC+3, а у нас разница с Москвой превышала пять часов. Этот нюанс я не учёл заранее – столкнулся с ним уже на практике.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Тип данных зачастую выбирают, ориентируясь на типовые примеры, а не на специфику предметной области. В шаблонном коде деньги – просто число. Но в зарплатной системе такой подход чреват претензиями от бухгалтерии.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Повторное нажатие приводило к повторному начислению – и никаких следов операции не оставалось</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Так, из‑за двойного нажатия на кнопку «Рассчитать» выплата задвоилась. Ситуация получилась неприятная.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Защита от повторной отправки, журнал изменений и возможность отката недоделанной операции – это те требования, которые редко проговаривают отдельно. Они не входят в формулировку «сделай кнопку», поэтому в системе они так просто не реализовываются.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Хуже самих дублей было их расследование: логов не было, правки задним числом никак не фиксировались. В итоге многие ошибки оставались в статусе «финансист видела, но воспроизвести нельзя».</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Сгенерированные автотесты проверяют код, а не бизнес‑задачу</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>В проекте были <a href="https://quality-lab.ru/blog/kakie-zadachi-v-testirovanii-pora-otdat-ii-chtoby-poluchit-rezultat-a-ne-novye-problemy/" data-type="post" data-id="30207">тесты</a> – и они показывали «зелёный» результат. Но строились они на основе самой реализации: просто фиксировали, что функция возвращает ожидаемое с точки зрения кода значение. Из‑за этого ошибка в формуле расчёта окупаемости прошла все проверки: тест воспринимал неверный результат как норму. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Тест, созданный на базе кода, не способен обнаружить, что сам код ошибочен. Это может выявить только внешний эталон – расчёт, выполненный независимо. В моём случае такого эталона изначально не было.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Чек‑лист тестировщика ИИ‑продукта</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><em>Этот раздел – главная цель статьи, а возможно, и всего эксперимента. Шесть месяцев назад у меня было представление о том, как качественно тестировать сгенерированное ПО. Но реальный опыт вайбкодинга серьёзно изменил мой подход к стратегии тестирования таких продуктов. </em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Эталон и требования</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Начинайте не с продукта, а с опроса заказчика – зафиксируйте требования в виде текста. Пробелы в техническом задании уже заполнены типовыми решениями, и без чётко прописанных требований вы будете сверять одно додуманное решение с другим.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Постройте с носителем домена эталонные кейсы: 5–10 сущностей, посчитанных руками в таблице. Сгенерированный расчёт правдоподобен по виду; отличить верное число от похожего на верное можно только внешним пересчётом.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Пройдите по каждой фиче с вопросом «а это кто решил?» и составьте список допущений. Каждое односложное требование незаметно обрастает молчаливыми решениями, часть из которых неверна.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Найдите фичи, которых никто не просил. Генерация порой добавляет «полезное» сверх запроса, а неучтённая фича – это дополнительный источник багов.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Сверьте словарь: одинаково ли заказчик и код понимают «ставку», «период», «начислено». Вайбкодер без домена закрепляет в коде первое попавшееся значение термина.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Дубли логики и согласованность</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Найдите все места, где считается одна и та же величина: поиском по коду, по названиям полей, по выгрузкам. Каждая сессия генерации могла построить свой расчёт, не зная о уже существующем.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Сверьте одно и то же число на всех экранах и во всех выгрузках до копейки. Дублированные расчёты расходятся в округлениях и версиях формулы.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>После каждого исправления прогоняйте эталонные кейсы целиком, а не только чистые места. Связи между модулями случайны; правка в одном месте ломает соседнее без предупреждения.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Закладывайте регресс как основной режим работы, а не как этап перед релизом. Продукт меняется со скоростью генерации, и вчерашний прогон ничего не говорит о сегодняшней сборке.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Бизнес-расчёты</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Пересчитайте каждую формулу независимо – вне системы, на эталонных кейсах. Даже если расчёт выполняется и число выглядит корректно, сама формула может быть ошибочной.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Проверяйте состав формулы, а не только результат: что входит в ставку, в базу, в период. Генерация берёт типовую формулу, а не формулу вашей компании.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Прогоните сценарии с нулевыми и пустыми данными: сотрудник без ставки, проект без списаний, месяц без рабочих дней. Именно в таких случаях чаще всего заканчивается «счастливый путь» – и проявляются скрытые ошибки.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Прогоните отрицательные и «обратные» значения: возврат, удержание, отмена. В типовом коде их нет – значит, скорее всего, нет и у вас.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Проверьте перерасчёт задним числом после уже проведённой выплаты. Это редкий сценарий с максимальной ценой ошибки; ИИ не строит его без прямой просьбы.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Проверьте события в середине периода – приём, увольнение, смену ставки, например, 12‑го числа. Пропорциональные расчёты чаще всего упрощаются до целых периодов – именно это генерация нередко пропускает.&nbsp;</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Деньги и округления</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Проверьте тип данных для денежных значений и требуйте его замены, если используется float. В типовых примерах деньги часто представляют как число с плавающей точкой, но в реальных расчётах это приводит к расхождениям в копейках между отображением на экране и выгрузкой данных.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Проверьте момент округления: до суммирования или после, и одинаково ли во всех местах. Дублированные расчёты округляются каждый по-своему.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Сверьте итоги: сумма строк должна совпадать с итоговой строкой в каждой ведомости и выгрузке. Нередко итог считают отдельным сгенерированным кодом – по своей логике. Бывает и так, что сумма рассчитывается только в браузере и не участвует в дальнейших вычислениях.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Гоняйте расчёты на больших суммах и большом числе строк. Ошибка плавающей точки растёт с объёмом и на демо-данных невидима.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Проверьте единицы там, где их больше одной: часы и деньги, ставка в час и в месяц. Поле с именем rate генерация трактует как ей удобнее – в разных местах по-разному.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Даты, периоды, границы</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Прогоните переход через границу года: остатки, стажи, нумерацию периодов. Годовая граница – редкий сценарий; в типовом коде она либо пустая, либо неверная.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Запустите расчёты около полуночи, а также в первый и последний день месяца. Разница между временем сервера (UTC) и местным временем офиса – это неявное допущение, о котором часто не задумываются, но оно может приводить к ошибкам.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Проверьте, включаются ли граничные даты в расчёт – в частности, попадает ли последний день периода в вычисления. Формулировки вроде «с… по…» в разных частях системы могут трактоваться по‑разному, и это нередко приводит к расхождениям.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Проверьте расчёты для февраля, високосных годов и месяцев разной длины – особенно в пропорциональных вычислениях. Деление «на 30» – частое упрощение из типовых примеров, но в реальных расчётах оно даёт погрешности.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Проверьте интервалы, пересекающие границу месяца, – например, отпуск с 28‑го по 3‑е или разбитый больничный. Логика разрезания периодов нетривиальна, и автоматизированные решения нередко подменяют её упрощёнными подходами.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Дубли операций, история, откаты</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Нажмите каждую «денежную» кнопку быстро дважды. Идемпотентность – это неявное требование: его обычно не прописывают в задаче «сделай кнопку», поэтому в реализации его часто упускают.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Прервите операцию посередине – закройте вкладку или отключите сеть – и проверьте, в каком состоянии остались данные. Частично применённая операция без отката – частая проблема: о транзакционности обычно не просят отдельно, поэтому её нередко не реализуют.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Измените данные задним числом и проследите, какой след это оставит в системе. Журналирование не появляется само по себе – без него баг остаётся в статусе «видели, но воспроизвести не можем».&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Проверьте, можно ли установить, кто и когда изменил число. В финансовых системах анонимные правки – это не просто неудобство, а полноценный инцидент.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Запросите логи ошибок и убедитесь, что они есть и содержат полезную информацию. Наблюдаемость – ещё одно неявное требование: без логов разбираться в проблемах приходится, опираясь лишь на воспоминания пользователей.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Доступы и данные</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Проверьте каждую роль на доступ к чужим зарплатам – в том числе через прямые ссылки и запросы в обход интерфейса. Ролевая модель нередко реализуется упрощённо: скрывают кнопку, но не защищают сами данные.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Отправьте запрос в обход формы и проверьте, как работает валидация на бэкенде. Часто проверки реализуют только на фронтенде – потому что они видны пользователю, а бэкенд при этом остаётся недостаточно защищённым.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Требуйте предоставления обезличенного тестового контура до начала работ. Нередко такие продукты сразу запускают на реальных данных о зарплатах – и любое тестирование в такой среде само по себе становится инцидентом.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Проверьте выгрузки и отчёты на наличие лишних полей. Нередко в выгрузку автоматически попадает вся модель целиком – в том числе данные, доступ к которым у ролей не предусмотрен.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Объём и код</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Прогоните расчёты на реалистичном объёме данных – например, за год и по сотням сотрудников. Запросы, которые без проблем работают на демо‑данных, на реальных объёмах нередко дают сбои.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Проверьте систему на наличие мёртвого кода – функций и эндпоинтов, до которых нельзя добраться из интерфейса. Такие элементы могут оставаться в системе, быть доступными извне, при этом о них зачастую не знает даже разработчик.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Не считайте зелёные автотесты подтверждением корректности – разберитесь, на чём они основаны. Если тест создан на базе реализации, он фактически закрепляет её ошибки как норму.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>&nbsp;Требуйте пересборки тестов на основе эталонных кейсов, а не текущего кода. Только внешний эталон способен выявить неверную формулу – сам по себе код не имеет точки отсчёта для самопроверки.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Считайте продукт частично новым после каждой доработки. Скорость изменений опережает скорость обновления документации – фиксируйте реальное поведение системы, а не изначальные планы.&nbsp;</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Что бы я сделал иначе?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li>Ещё до начала генерации я бы <span class='font-weight-bold'>выделил час на встречу с руководителем и зафиксировал эталонные кейсы</span>: вручную просчитал данные по десяти сотрудникам – с отпускными, выплатами и окупаемостью.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Завёл бы «<span class='font-weight-bold'>карту продукта</span>» – перечень модулей и мест, где прописана каждая формула, – и регулярно обновлял бы её после каждой доработки.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Перестроил бы процесс приёмки</span>: фичу считал бы принятой только после прогона эталонных кейсов.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Вместе с кодом запрашивал бы список принятых допущений</span> и согласовывал его с руководителем заранее – до возможных инцидентов.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Денежные расчёты выделил бы в отдельный модуль</span>. После любой правки проверял бы код, чтобы не появлялись дублирующие реализации.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Привлекал бы тестировщиков уже на второй неделе работы</span>: на поздних этапах им приходится восстанавливать требования по уже найденным багам – это заметно дороже.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Журнал изменений и логи подключал бы до первого запуска</span>, а не после того, как появится невоспроизводимый баг.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Можно ли считать эксперимент удачным?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Если вдуматься в детали этого рассказа, то можно прийти к выводу, что генерация ПО &#8212;  это опасный путь. Но на то он и эксперимент, чтобы получить результат и сделать из него выводы, которые позволят поменять подход. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Теперь мои промпты содержат четкие ограничения и глубокие технические детали, каждый коммит дотошно вычитывается, изначальная архитектура приведена к былому монолиту и каждое изменение теперь лишь укрепляет систему.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30942,"width":"260px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-40.png" alt="вайбкодинг гайд" class="wp-image-30942" style="width:260px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-40.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-40-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-40-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-40-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Сделало ли это вайбкодинг чуть дольше и сложнее? Безусловно! Исчезла иллюзия, будто достаточно набросать пару строк текста – и сразу появится рабочая функция.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Сейчас я снова опираюсь на глубокую техническую экспертизу: подхожу к задаче как опытный разработчик, просчитывая последствия каждого шага. При этом контролирую каждую строчку, и именно это даёт уверенность в результате и чувство контроля над проектом. Я на своём опыте увидел, как продуманная QA-система помогает держать качество вайбкодинг-продукта на достойном уровне.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'><em>Важно! Дом из гипсокартона – всё равно дом. Но полагаться на его прочность без проверки я не советую. Проверять можно своими силами, но быстрее и надёжнее, когда этим занимаются профессионалы.</em></span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#c0f0dc"}}} --></p>
<p class="has-background" style="background-color:#c0f0dc">В «Лаборатории Качества» мы <a href="https://quality-lab.ru/outsourcing/" data-type="page" data-id="26">тестируем</a> в том числе продукты, созданные с помощью ИИ: восстанавливаем требования, строим эталонные кейсы и помогаем разработчикам контролировать качество. Если у вас уже реализован такой проект – покажите его нам на бесплатной консультации.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>]]></description>
<link>https://quality-lab.ru/blog/navajbkodili-sebe-organizacionno-finansovuyu-sistemu-i-teper-eyo-testiruem/</link>
<pubDate>Fri, 14 Aug 2026 12:50:12 +0300</pubDate>
</item>
<item>
<title>Методы убийства ИТ-продукта: мнение QA-инженера</title>
<description><![CDATA[<p>Автор: <a href="https://www.linkedin.com/in/julia-vorobeva-96b7bb366?utm_source=share_via&amp;utm_content=profile&amp;utm_medium=member_ios" mce_href="https://www.linkedin.com/in/julia-vorobeva-96b7bb366?utm_source=share_via&amp;utm_content=profile&amp;utm_medium=member_ios" target="_blank" style="">Воробьева Юлия</a></p>
<p>Всем привет! Меня зовут Юлия, и уже 6 лет я занимаюсь тестированием. За свою карьеру я успела принять участие в разных проектах компаний от стартапов до гигантов индустрии, тестировала бэк, фронт, мобилки, веб и даже устройства интернета вещей, успела дорасти до тимлида и начать осваивать автоматизацию.</p><p>В этой статье я поделюсь своим опытом QA-инженера и расскажу о самых распространенных ошибках, которые могут убить ИТ-продукт на корню. Я собрала примеры из реальной жизни, чтобы показать, как даже самые мелкие недочеты могут обернуться огромными проблемами.</p><p><img src="https://software-testing.ru/images/stories/library/11hs/methods-of-killing-an-it-product.png" mce_src="https://software-testing.ru/images/stories/library/11hs/methods-of-killing-an-it-product.png" alt="" /></p><p>Все хотят успешный ИТ-продукт. Но создание успешного ИТ-продукта – это настоящее искусство, требующее от команды не только технических навыков и софт скилов, но и глубокого понимания потребностей пользователей. Правда убить продукт намного легче, чем сделать качественный. Далее расскажу, какие методы убийства я встречала чаще всего. В конце составила чек-лист, как спасти ИТ-продукту жизнь…</p>]]></description>
<link>https://software-testing.ru/library/around-testing/processes/4531-methods-of-killing-an-it-product</link>
<pubDate>Thu, 13 Aug 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Курсор, куда ты лезешь? Эх, не прокатило...</title>
<description><![CDATA[<p>Дала я, значит, Курсору задачку — автотесты написать. Причем расписала все вводные:</p><p></p><blockquote><p>Напиши мне автотесты на задачу такую-то</p><p>Писать надо тут: (полный путь к папке)</p><p>Как писать таск-тесты, почитай тут — ...\task-test.md</p><p>Что должно быть в тестах: ...</p></blockquote><p></p><p>Сидит, пыхтит. А я смотрю в IDE, он Java-класс меняет, и еще новый пишет, но уже Test. А мне это не нужно, я конкретные тесты хочу, не юниты. Я ж ему даже md-файл дала! Причем он написал нужные мне тесты, но потом его понесло...</p><p>В итоге останавливаю процесс и говорю "куда ты лезешь?". А он мне на голубом глазу такой "ой, и правда...":</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8AgduxYTb0le3yIj4NZfFrUMJIMwtYShyOZTq6GrGVkGtkqlixH9Zc0sHMlwpkV8g3ql8z9xqEqkcSQ92rhJiGOlXj9WXDbFbt1QlQTW3sFeNwSl13tcy_F5pMKz2UK0Mq7z5jzchgwaXjHrvUAlTXKQgQst-DPHf7KlLJPuj8mLbbV6GQmo2JLjpYpE/s1230/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202026-08-12%20161426.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="603" data-original-width="1230" height="157" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8AgduxYTb0le3yIj4NZfFrUMJIMwtYShyOZTq6GrGVkGtkqlixH9Zc0sHMlwpkV8g3ql8z9xqEqkcSQ92rhJiGOlXj9WXDbFbt1QlQTW3sFeNwSl13tcy_F5pMKz2UK0Mq7z5jzchgwaXjHrvUAlTXKQgQst-DPHf7KlLJPuj8mLbbV6GQmo2JLjpYpE/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202026-08-12%20161426.png" width="320" /></a></div><br /><p>Сразу вспоминается тот анекдот про «не прокатило» ????</p><p>Вот примерно поэтому за ИИ нужно всегда проверять, что он там понаделал)</p>]]></description>
<link>http://okiseleva.blogspot.com/2026/08/blog-post.html</link>
<pubDate>Wed, 12 Aug 2026 16:31:05 +0300</pubDate>
</item>
<item>
<title>Пишем тесты с Claude Code, часть 1: первичные результаты</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/claude-code.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/claude-code.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Баз Дейкстра (Bas Dijkstra)<br /><strong><a href="https://www.ontestautomation.com/writing-tests-with-claude-code-part-1-initial-results/" mce_href="https://www.ontestautomation.com/writing-tests-with-claude-code-part-1-initial-results/" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод: </strong>Ольга Алифанова</p><p>В <a href="https://www.software-testing.ru/library/testing/testing-tools/4501" mce_href="https://www.software-testing.ru/library/testing/testing-tools/4501" style="">недавней статье</a> я писал о том, как использовал Claude Code для анализа кода RestAssured.Net и выполнения рефакторинга, используя написанные вручную тесты в качестве страховочной сетки. В той статье я упомянул, что не хочу, чтобы Claude трогал сами тесты, и объяснил, почему. Тем не менее, мне было любопытно самому выяснить, на что способен Claude с точки зрения написания тестов и насколько оправдано доверие, которое всё больше людей возлагают на тесты, созданные LLM.</p>
<p>В этой статье я поделюсь первыми шагами в этом направлении, а также своими мыслями и ходом рассуждений на этом пути. Вы увидите, как я создаю начальный набор тестов для небольшого API на Spring Boot, который я написал для использования в своих воркшопах, и как я оценивал результат. В следующей статье я покажу, как улучшил набор тестов на основе своих наблюдений, снова используя Claude Code.</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-tools/4503-writing-tests-with-claude-code</link>
<pubDate>Tue, 11 Aug 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Почему реклама не приносит заявки: QA-основы, которые должен понять каждый маркетолог</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p>После публикации <a href="https://quality-lab.ru/blog/kak-marketologu-gotovit-sajty-i-prilozheniya-k-akciyam-i-pochemu-nelzya-slepo-doveryat-svoim-ajtishnikam/" data-type="post" data-id="30656">первой</a> и <a href="https://quality-lab.ru/blog/mobilnyj-marketing-nachinaetsya-s-qa-kak-testirovanie-vliyaet-na-moderaciyu-i-rejting-prilozheniya/" data-type="post" data-id="30701">второй</a> статей о маркетинге и QA, я получила несколько сообщений от маркетологов с вопросами о пользе тестирования в продвижении цифровых продуктов. Кто‑то был согласен, что в маркетинге полезно посмотреть на продукт с точки зрения QA, а кто‑то, наоборот, написал мне, что я слишком заморачиваюсь и это ответственность айтишников.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Именно поэтому я решила написать ещё один материал, где максимально просто и доступно объясняю, почему связка маркетинга и тестирования – это настоящая подушка безопасности, особенно в нестабильное кризисное время, когда каждый рубль рекламного бюджета буквально на вес золота.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Я уже рассказывала, что именно работа в «Лаборатории качества» заставила меня взглянуть на тестирование иначе. Я тоже была далека от этой темы, хоть и продвигала и классифайды, и электронные площадки, и интернет‑магазины (эх, мне бы тогда мои сегодняшние мозги). <span class='font-weight-bold'>Чем больше я вникала в тестирование, тем чётче понимала, сколько недоразумений могут избежать маркетологи, если возьмут на себя хоть немного ответственности не только за продвижение, но и за качество цифрового продукта, который продвигают. </span>Это не значит, что нужно пытаться тестировать самим. Нужно просто уметь доносить свои мысли и задачи IT‑специалистам или директору, чтобы согласовать ресурсы на проверку.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30887,"width":"383px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-32_11zon.png" alt="тестирование сайта перед запуском рекламы" class="wp-image-30887" style="width:383px;height:auto" title="" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-32_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-32_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-32_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-32_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Эта статья – выжимка из того, что я поняла, сидя бок о бок с тестировщиками и подслушивая, как они разбирают клиентские проекты. <br><br>Я не тестировщица, а маркетолог, так что писать буду без зауми. Зато с конкретными примерами и советами. В конце статьи вы узнаете, как провести тестирование сайта перед запуском рекламы даже без технического бэкграунда.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Ошибки сайта снижающие конверсию</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Я стала чётко видеть, что <span class='font-weight-bold'>многие сливают рекламные бюджеты не из‑за плохих креативов и не из‑за «сложной» аудитории, а из‑за сырых продуктов, на которых идёт трафик</span>. Из моего опыта: один знакомый предприниматель лил трафик на лендинг с холодильным оборудованием, у которого при этом не работала форма обратной связи на всех андроидах (у него был айфон, он пару недель даже не замечал подвоха), а другой в своём небольшом маркетплейсе косметики запустил акцию с промокодами, которые неправильно насчитывали скидку. У первого, кстати, дела ещё ничего, а второй, к сожалению, решил закрыть проект буквально пару месяцев назад.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30888,"sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image size-full"><img decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-33_11zon.png" alt="почему падает конверсия сайта" class="wp-image-30888" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-33_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-33_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-33_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-33_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Каждый раз я смотрела на всё это и думала: «Жесть, что же за айтишники у них работают, почему так криво и косо вышло». Хотя, если подумать, то, возможно, несчастные разработчики и так тянут на себе всё, что можно, и просто не успевают предусмотреть косяки из‑за переработок и замыленного глаза. А ещё часто такие спецы и вовсе тянут ещё 5+ проектов одновременно.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Так вот, теперь, когда я вижу такие примеры, то сразу понимаю, что <span class='font-weight-bold'>там не были предусмотрены ресурсы на тестирование</span>, а ещё <span class='font-weight-bold'>их маркетологи, скорее всего, не осознают, почему падает конверсия сайта и насколько сильно баги могут топить рекламные кампании</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Проверка лендинга перед запуском рекламы</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Различные эксперты очень любят писать о том, как готовить площадки к приёму трафика: что нужно оптимизировать тексты, блоки, расписать боли, тестировать цвета кнопок и вкладываться в дизайн. Но я скажу одно: <span class='font-weight-bold'>нужно <a href="https://quality-lab.ru/blog/shtat-gibrid-ili-autsors-testirovaniya-chestnyj-razbor-ekonomiki-qa-komand-v-2026/" data-type="post" data-id="29877">закладывать ресурсы на QA</a>. И чем больше бизнес, чем сложнее сайт, интернет‑магазин или приложение, тем более незыблемым должно быть это правило.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Ваш модный оптимизированный лендинг ничего не спасёт, если он загрузится как зря в одной из моделей Android‑смартфона, которым, как окажется потом, очень любит пользоваться именно ваша ЦА. Не забывайте о законе подлости. Он всегда срабатывает в самый неподходящий момент.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Начинаем с азов</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Так что такое QA, если вкратце и без технических наворотов? Представьте, что вы запускаете промо‑акцию. Перед этим вы проверяете, как отображаются баннеры, куда ведут ссылки, начисляются ли промокоды, понимает ли ЦА условия акции. Это и есть базовый QA: проверка, что всё работает так, как надо и что технические ошибки сайта не помешают пользователю.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Только в разработке это делают более системно: с чек‑листами, регрессионными проверками (чтобы новое не сломало старое), <a href="https://quality-lab.ru/blog/kak-nagruzochnoe-testirovanie-zashhishhaet-biznes-ot-ubytkov/" data-type="post" data-id="29802">нагрузочным тестированием</a> (чтобы наплыв пользователей не обвалил сайт) и контрольными точками (Quality Gates), после которых можно безопасно запускать на площадку трафик. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Для маркетинга это значит: меньше сюрпризов, предсказуемая конверсия и экономия бюджета.</span></p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:html --></p>
<div style="max-width:900px;margin:50px auto;font-family:Arial,Helvetica,sans-serif;">
<h2 style="font-size:32px;font-weight:700;color:#1f2937;text-align:center;margin-bottom:30px;">
Важные вопросы<br />
</h2>
<details style="margin-bottom:18px;border:1px solid #e5e7eb;border-radius:16px;padding:0;background:#fff;box-shadow:0 8px 24px rgba(0,0,0,.05);overflow:hidden;">
<summary style="cursor:pointer;padding:22px 26px;font-size:21px;font-weight:700;color:#1f2937;outline:none;">
Зачем разбираться в QA, если у нас есть тестировщики?<br />
</summary>
<div style="padding:0 26px 24px 26px;font-size:17px;line-height:1.8;color:#4b5563;">
<p>Потому что тестирование и QA решают немного разные задачи.</p>
<p><span class='font-weight-bold'>Тестирование</span> помогает найти ошибки здесь и сейчас – перед релизом или в рамках конкретной задачи.</p>
<p><span class='font-weight-bold'>QA (обеспечение качества)</span> помогает сделать так, чтобы подобных ошибок возникало как можно меньше. Это работа с процессами, рисками и профилактикой: заранее проверить форму, корзину, скорость работы, интеграции, требования законодательства и другие критичные места.</p>
<p>Проще говоря:</p>
<div style="margin:20px 0;padding:18px;background:#f8fafc;border-left:5px solid #d61f26;border-radius:10px;font-size:16px;">
<img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f525.png" alt="????" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <span class='font-weight-bold'>Тестировщик</span> – пожарный, который тушит возгорание.</p>
<p><img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f6e1.png" alt="????" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <span class='font-weight-bold'>QA</span> – пожарная сигнализация, система предотвращения пожаров и план эвакуации.
</div>
<p>Лучший результат достигается тогда, когда работают оба подхода.</p>
</div>
</details>
<details style="margin-bottom:18px;border:1px solid #e5e7eb;border-radius:16px;padding:0;background:#fff;box-shadow:0 8px 24px rgba(0,0,0,.05);overflow:hidden;">
<summary style="cursor:pointer;padding:22px 26px;font-size:21px;font-weight:700;color:#1f2937;outline:none;">
Должен ли именно маркетинг защищать бюджет на QA?<br />
</summary>
<div style="padding:0 26px 24px 26px;font-size:17px;line-height:1.8;color:#4b5563;">
<p>Да, потому что именно маркетинг отвечает за эффективность вложенных в привлечение клиентов средств.</p>
<p>Представьте обычную воронку:</p>
<div style="margin:20px 0;padding:20px;background:#f8fafc;border-radius:12px;border-left:5px solid #d61f26;line-height:2;font-size:16px;">
<p><img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f4e2.png" alt="????" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Реклама <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f440.png" alt="????" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Показы <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f446.png" alt="????" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Клики <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f310.png" alt="????" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Сайт <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f4dd.png" alt="????" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Форма <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f6d2.png" alt="????" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Корзина и оплата</p>
</div>
<p>Если техническая проблема возникает на любом из последних этапов, рекламный бюджет уже потрачен. Пользователь приходит, пытается оставить заявку или оформить заказ, сталкивается с ошибкой и уходит к конкурентам. Чаще всего об этом узнают значительно позже – когда падает конверсия, дорожает стоимость заявки, а в системе аналитики нет очевидного объяснения произошедшему.</p>
<p>QA позволяет проверить критичные этапы заранее и убедиться, что воронка не «протекает» ещё до запуска рекламной кампании.</p>
<div style="margin-top:20px;padding:18px;background:#fff7f7;border-left:5px solid #d61f26;border-radius:10px;font-size:16px;">
<p><img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f4a1.png" alt="????" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Проще и значительно дешевле убедиться, что форма, корзина и оплата работают корректно <span class='font-weight-bold'>до запуска рекламы</span>, чем искать причины потери бюджета уже после того, как кампания завершилась.</p>
</div>
</div>
</details>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Кейсы из моей реальной практики</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><em>Нет более ценных и дорогих ошибок, чем те, которые допускаешь ты сам. Долгое время я не любила о таком писать, но мне нравится тренд на новую искренность, поэтому я тоже поделюсь интересными провалами из своей профессиональной жизни.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Спасибо за заявку, мы вам не перезвоним</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Я управляла отделом продвижения, мы работали сразу за несколько проектов. Среди них была и небольшая региональная сеть медицинских центров: нормальный сайт на 1С‑Битрикс, онлайн‑запись на приём, всё интегрировано со специализированной медицинской CRM. Человек заходит, выбирает врача, время, оставляет заявку – она улетает в систему, администратор видит и подтверждает. <span class='font-weight-bold'>Стабильная четверть записей шла именно через сайт</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>И в один прекрасный день <span class='font-weight-bold'>интеграция с CRM отвалилась</span>. Вначале мы подумали, что заявки с сайта просто перестали приходить. К тому же нас начал упрекать директор медцентра, что всё из‑за недостаточного продвижения (упс, но мы как раз тогда урезали косты на наружку и перевели всё в интернет‑рекламу). При этом <span class='font-weight-bold'>на сайте всё выглядело правдоподобно, не подкопаешься: человек заполняет форму, видит «Спасибо, мы вам перезвоним!», уходит ждать звонка.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Естественно, мы решили сами проверить точки контакта и обнаружили, что <span class='font-weight-bold'>наши заявки падают, но остаются без ответа</span> – нужно было решать проблему. Штатного тестировщика у них не было. <span class='font-weight-bold'>Был один айтишник, который и так вечно был в мыле</span>, поэтому заявку на разбор ситуации он взял в работу, как смог. Решал он её <span class='font-weight-bold'>пять дней</span>. Пять. Дней.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30889,"width":"392px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-35.png" alt="QA для маркетологов" class="wp-image-30889" style="width:392px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-35.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-35-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-35-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-35-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">А вот это время у меня дёргался глаз из‑за массовых жалоб пациентов. Ох, если бы они жаловались только с помощью звонков на рецепшн или сообщений в ЛС сообществ медцентра… <br><br>Многие не стали пасовать и писали негативные отзывы про невозможность записаться сразу – на Яндекс Карты, Google Карты, «ПроДокторов» и так далее. Вывезли мы тогда негатива немерено.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Часть людей вообще не звонили – они просто решили, что этот медцентр забил на них, и уходили к конкуренту молча. Навсегда.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Самое страшное в этой истории даже не пять дней простоя. Самое страшное – что никто не заметил поломку сразу. </span>Сайт‑то работал. Кнопки нажимались. «Спасибо за заявку» показывалось. С точки зрения обычного глаза – всё ок. Проблема была невидимой ровно до момента, пока мы сами не протестировали форму, как могли.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0">Теперь я понимаю, что, <span class='font-weight-bold'>если бы там стоял банальный мониторинг – простенький автотест, который раз в час делает тестовую заявку и проверяет, доехала ли она до CRM, – поломку поймали бы через час, а не через 5 дней.</span> Вот это и есть <span class='font-weight-bold'>QA для маркетологов</span>: сделать так, чтобы вы узнавали о проблемах раньше своих клиентов.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Встречают по обложке, а провожают по уму</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Пришёл к нам директор по развитию. Запускали электронную B2B площадку, дали 350 тысяч рублей бюджета на тест.</span> Две недели команда работала, чтобы сделать экстренный запуск: изучение ЦА, гипотезы, боли, подбор площадок, парсинг баз, разработка креативов, многочасовая настройка – мне даже пришлось отпуск переносить. В итоге запустились в обозначенный срок, немного выдохнули, но начались очень странные дела.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Через день заметили, что трафик идёт, а заказов нет</span> (никто, в принципе, и не рассчитывал на тонны лидов, так как аудитория узкая, сложная, специфическая), но <span class='font-weight-bold'>на седьмой день картина та же: трафик идёт, переходят на площадку и уходят в никуда</span>. Паника, нервозность, программисты злятся на маркетинг, потому что из‑за нас у них сбои, а мы просто в прострации: все кому не лень, как обычно, трепали нервы именно рекламщикам, задавая вопросы, где заявки и куда мы слили деньги.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Мы провели небольшой ресёрч и выяснили, что <span class='font-weight-bold'>лендинг работал отлично</span>. Всё было красиво, эффектно (полный энтерпрайз и всё такое), но вот <span class='font-weight-bold'>сама площадка внутри была сырой</span>. Потом мы узнали, что<span class='font-weight-bold'> часть ЦА в определённые часы просто не могла зарегистрироваться, а кого‑то и вовсе оттолкнула сырая «внутренность» площадки, особенно на контрасте с эффектным лендингом. </span>Пара крупных сделок от привлечённых клиентов каким‑то чудом позволили окупить рекламный бюджет, но это скорее чудо, чем система. А самое обидное – понимать, сколько мы с ребятами вложили сил в подготовку рекламной кампании и что в итоге из‑за отсутствия QA всё так скомкано прошло. Тест решили не масштабировать. А зря.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30890,"width":"422px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-36_11zon.png" alt="почему реклама не работает" class="wp-image-30890" style="width:422px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-36_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-36_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-36_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-36_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<pre class="wp-block-preformatted has-background" style="background-color:#e6f9f0">Теперь я понимаю, что нам нужно было тактическое отступление: тест дал нам классные данные, которые позволили переосмыслить проблему. <br><br><span class='font-weight-bold'>Можно было подключить QA на аутсорсе, повысить качество самой площадки, возможно, натянуть на неё внешность с элементами дизайна из лендинга – и дело бы пошло вполне бойко</span>.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Ещё пара кейсов ЛК, когда за QA пришли именно маркетологи (и были правы)</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><em>Я вижу, что, к сожалению, среди многих моих коллег, до сих пор нет чёткого понимания, зачем вообще QA нужен маркетингу. Но бывают и приятные исключения. Моя цель, чтобы таких исключений стало больше. Кстати, если вы маркетолог и работаете в тесной связке с тестировщиками, отзовитесь в комментариях и я виртуально пожму вам руку.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Кейс с горящим рекламным бюджетом</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Пришла к нам <span class='font-weight-bold'>директор по маркетингу из e-commerce</span>. Запускали <span class='font-weight-bold'>большую распродажу</span>, залили серьёзный бюджет в платный трафик. Затем заметили, что <span class='font-weight-bold'>более 65% кликов были именно с мобильных устройств</span>, но заказов оттуда &#8212; ноль.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Наши тестировщики за полдня прогнали путь покупки по разным моделям и браузерам. Выяснили, что <span class='font-weight-bold'>именно на мобильных (а это был основной трафик распродажи) при добавлении второго товара в корзину слетала вёрстка и кнопка оформления уезжала за пределы экрана.</span> То есть люди просто не могли сделать заказ. Наша команда тогда вовремя нашли и многие другие ошибки интернет-магазина, связанные с каталогом.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0">Маркетолог пришла к нам не потому, что разбиралась в тестировании. Она пришла, потому что нутром почуяла: «цифры не сходятся, тут что-то техническое, мне нужен кто-то, кто это докажет или опровергнет». И это было правильное решение.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Кейс с промокодом</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Интернет-маркетолог одного бренда</span>  <span class='font-weight-bold'>запустил акцию с эксклюзивным промокодом</span> на несколько десятков тысяч подписчиков е-mail рассылки. А промокод&#8230; не применялся! Опечатка в настройке, регистр символов, неважно. <span class='font-weight-bold'>Люди вводят код из письма – промокод недействителен.</span> И вот вам не просто потерянные продажи, а ещё и подорванное доверие подписчиков, которых компания собирала годами. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0">Маркетолог этой компании сел и начал искать в интернете причину проблемы, так и нашёл нас. Ему удалось защитить дополнительный бюджет на QA-аудит и наши инженеры действительно нашли много неприятных сюрпризов. Оказывается, с бонусной системой было полное фиаско – из-за недочётов в расчётах сумма всегда округлялась в большую сторону, что не билось с экономикой, заложенной в акционные мероприятия. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Немного о репутации и доверии к бренду</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Зачем нужно тестирование сайта? Заметьте: во всех историях <span class='font-weight-bold'>технический сбой бьёт не по айтишникам, а затрагивает репутационные риски и деньги на маркетинг</span>. Репутация бренда – это не какая‑то абстракция. Это сумма маленьких впечатлений, которые остаются у каждого, кто сталкивается с вашим продуктом. И любое техническое недоразумение – вроде не сработавшей кнопки, ошибки формы заявки или сброшенной корзины – сразу портит это впечатление.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Чаще всего недовольные даже не пишут в поддержку: они просто уходят, унося с собой негатив. А кто‑то потом оставляет отзыв в открытых источниках – и он годами отпугивает новых клиентов. Особенно обидно, когда сбой случается в самый ответственный момент: человек уже решился, достал карту, заполнил форму – и тут всё ломается. Именно такие ситуации запоминаются сильнее всего.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30886,"width":"382px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-17_11zon.png" alt="ошибки сайта снижающие конверсию" class="wp-image-30886" style="width:382px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-17_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-17_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-17_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/08/Rectangle-17_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">QA помогает этого избежать. <span class='font-weight-bold'>Его задача – не в идеальном коде, а в том, чтобы пользователь не разочаровался в тот миг, когда больше всего доверяет бренду.</span> <br><br>Это надёжная защита и репутации, и рекламного бюджета: лучше заранее проверить ключевые сценарии, чем потом разбираться с падением конверсии и негативными отзывами.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Поговорим о классическом маркетинге</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Ваш сайт не приносит заявки? Прежде чем рассуждать об ИИ, виртуализации, зомби-воронках и других ноу-хау, неплохо бы вспомнить старую школу. <span class='font-weight-bold'>Цифровой маркетинг базируется на классическом и это не изменить.</span> Специалисты, у которых есть база в виде прочитанных книг Питера Друкера, Филиппа Котлера или Джека Траута, мыслят совсем иначе, чем выращенный на случайных вебинарах или экспертных блогах. Я в этом глубоко убеждена.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Так вот, я уже упоминала в <a href="https://quality-lab.ru/blog/mobilnyj-marketing-nachinaetsya-s-qa-kak-testirovanie-vliyaet-na-moderaciyu-i-rejting-prilozheniya/" data-type="post" data-id="30701">предыдущей статье</a> про <span class='font-weight-bold'>Модель 4P (Marketing Mix)</span>. Хочу более подробно объяснить свои мысли. Концепция была предложена профессором <span class='font-weight-bold'>Джеромом Маккарти </span>в далёком 1960 году и до сих пор используется как базовая модель в маркетинге. Она описывает четыре группы управляемых факторов, с помощью которых компания формирует рыночное предложение и влияет на спрос.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:table --></p>
<figure class="wp-block-table">
<table class="has-fixed-layout">
<tbody>
<tr>
<td><span class='font-weight-bold'>Элемент</span></td>
<td><span class='font-weight-bold'>Что означает</span>?</td>
<td><span class='font-weight-bold'>На какие вопросы отвечает</span>?</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Product (Продукт)</span></td>
<td>Товары или услуги, которые компания предлагает рынку</td>
<td>Что продаем? <span class='font-weight-bold'>Какого качества продукт?</span> Какую проблему решаем? Чем отличаемся?</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Price (Цена)</span></td>
<td>Стоимость продукта и ценовая стратегия</td>
<td>Сколько стоит?<span class='font-weight-bold'> Оправдана ли цена?</span> Какие скидки и условия оплаты?</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Place (Место, распространение)</span></td>
<td>Где и как клиент получает продукт</td>
<td>Где купить? Как доставляется? Какие каналы продаж используются?</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Promotion (Продвижение)</span></td>
<td>Коммуникации с рынком</td>
<td>Как узнают о продукте? Как убедить купить?</td>
</tr>
</tbody>
</table><figcaption class="wp-element-caption">Модель 4P (Marketing Mix)</figcaption></figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Так вот, есть часть маркетологов, которые считают, что эта модель не подходит для цифровых продуктов. Но я категорически не согласна.</span> Простота важнее навороченных терминов и новомодных методик. Просто подумайте сами: <span class='font-weight-bold'>что, в IT нет продукта? Есть! И когда его качеству не уделяют достаточно внимания, то сыпятся все остальные этапы</span> – и цена, и места распространения (привет, несоблюдение регуляторки или SLA), и, естественно, продвижение. Если не мудрствовать лукаво, то прекрасно видно, что система простая и достаточно универсальная. А самое важное в ней – помнить, что с продукта начинается всё, каким бы он ни был: физическим, цифровым, услугой и т. д. Именно здесь очень часто скрывается ответ на вопрос, почему реклама не работает.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'><a href="https://quality-lab.ru/qa-audit/" data-type="page" data-id="24392">Продукт</a> – первый элемент классического маркетинг‑микса 4P, и это не случайно.</span> Можно сколько угодно инвестировать в продвижение, выстраивать идеальную ценовую политику и искать новые каналы продаж, но <span class='font-weight-bold'>если сам продукт не решает задачу пользователя или работает нестабильно, остальные элементы не смогут компенсировать его недостатки. Именно поэтому тестирование становится важной частью подготовки продукта к выходу на рынок. </span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0">QA помогает убедиться, что сервис соответствует ожиданиям пользователей, работает без критических ошибок и готов выдерживать реальные сценарии использования. Это фундамент, на котором строится успешный маркетинг.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Трудности перевода</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Чтобы грамотно говорить о качестве цифрового продукта, маркетологу важно уметь доносить свои мысли до IT‑команды. </span>Это один из самых недооценённых навыков в маркетинге и PR. Раньше я уже немного писала <span class='font-weight-bold'><a href="https://quality-lab.ru/blog/kak-marketologu-gotovit-sajty-i-prilozheniya-k-akciyam-i-pochemu-nelzya-slepo-doveryat-svoim-ajtishnikam/" data-type="post" data-id="30656">об этом здесь</a></span>.<span class='font-weight-bold'> Не нужно самому уметь тестировать – достаточно понимать суть процессов и вовремя замечать проблемы.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Разница видна на простых примерах. <span class='font-weight-bold'>Когда маркетолог не разбирается в технических нюансах</span>, диалог с разработчиком часто сводится к невнятному «кажется, заявки не приходят» и такому же поверхностному «всё работает, я проверял». <span class='font-weight-bold'>В итоге поломка остаётся незамеченной</span>: фраза «я проверял» нередко означает, что кнопку нажали один раз – на своём ноутбуке в Chrome, не учитывая остальные сценарии.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>А если маркетолог немного ориентируется в теме, разговор получается совсем другим: <span class='font-weight-bold'>он сразу даёт чёткую картину</span> – например, сообщает, что конверсия из заявки в звонок упала на 40% при неизменном трафике, и просит проверить, доходят ли заявки до CRM, причём сделать это через реальный пользовательский сценарий – в том числе с мобильного устройства и в Safari. Тут уже не получится отмахнуться: <span class='font-weight-bold'>есть конкретная гипотеза, симптом и зона поиска проблемы</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Есть несколько базовых вещей, которые полезно знать каждому маркетологу</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Важно понимать, что такое сквозной сценарий </span>– это весь путь пользователя от первого контакта с рекламой до финального действия: например, от клика по объявлению до получения подтверждения заявки. Сбой может возникнуть на любом этапе, поэтому проверять нужно всю цепочку целиком.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Стоит учитывать и <a href="https://quality-lab.ru/blog/regress-v-e-commerce-s-7-dnej-do-4-chasov-kak-stabilnost-platformy-podnyala-konversiyu-fashion-marketplejsa-na-8/" data-type="post" data-id="27488">эффект регрессии</a>:</span> когда в одном месте что‑то чинят или добавляют, в другом может неожиданно что‑то сломаться. Поэтому после любых изменений на сайте – даже если речь идёт о простой замене баннера – стоит быстро перепроверить ключевые сценарии. Чаще всего проблемы как раз и появляются после таких «незначительных» правок.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Ещё один важный момент – <a href="https://quality-lab.ru/blog/cross-browser-compatibility-testing/" data-type="post" data-id="2730">кросс‑браузерность</a> и кросс‑девайсность.</span> Фраза «у меня всё работает» не значит, что всё в порядке: она отражает ситуацию только на одном устройстве и в одном браузере. А у вашей аудитории – сотни разных комбинаций гаджетов, операционных систем и браузеров. Особенно часто проблемы возникают в Safari на iPhone или на старых версиях Android. Если большая часть трафика приходит с мобильных устройств, а проверку делали только на десктопе, по сути, ничего не проверили.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Наконец, полезно знать про <a href="https://quality-lab.ru/blog/kak-provodit-smoke-i-regress-testirovanie-bez-instrukcij/" data-type="post" data-id="15213">smoke‑тест</a></span> – быструю проверку самых критичных функций перед запуском. По сути, это ответ на вопрос «не дымит ли?». Всего пять минут такой проверки перед стартом акции или вливанием бюджета могут уберечь от потери дневного рекламного бюджета.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Экстренный чек-лист для маркетолога</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:html --></p>
<div style="max-width:950px;margin:50px auto;font-family:Arial,Helvetica,sans-serif;background:#ffffff;border:1px solid #e5e7eb;border-radius:18px;box-shadow:0 10px 30px rgba(15,23,42,.06);overflow:hidden;">
<div style="background:linear-gradient(135deg,#475569,#334155);padding:28px 32px;color:#fff;">
<div style="font-size:20px;font-weight:700;line-height:1.3;">
<img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f680.png" alt="????" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Аудит сайта перед рекламой
</div>
<div style="margin-top:10px;font-size:16px;line-height:1.6;opacity:.95;">
Что проверить перед запуском, если в команде нет тестировщика.
</div>
</div>
<div style="padding:30px;">
<div style="margin-bottom:26px;padding-bottom:24px;border-bottom:1px solid #edf2f7;">
<div style="font-size:18px;font-weight:700;color:#334155;margin-bottom:10px;">
✓ Пройдите путь клиента полностью
</div>
<div style="font-size:16px;line-height:1.8;color:#475569;">
Не просто откройте страницу. Пройдите весь сценарий: кликните по рекламе, заполните форму, оставьте заявку или оплатите хотя бы символическую сумму. Убедитесь, что всё действительно работает.
</div>
</div>
<div style="margin-bottom:26px;padding-bottom:24px;border-bottom:1px solid #edf2f7;">
<div style="font-size:18px;font-weight:700;color:#334155;margin-bottom:10px;">
✓ Проверьте мобильную версию
</div>
<div style="font-size:16px;line-height:1.8;color:#475569;">
Тестируйте не через офисный Wi-Fi, а с обычного мобильного интернета. Желательно проверить сайт как минимум на iPhone и Android — часть ошибок проявляется только на отдельных устройствах или браузерах.
</div>
</div>
<div style="margin-bottom:26px;padding-bottom:24px;border-bottom:1px solid #edf2f7;">
<div style="font-size:18px;font-weight:700;color:#334155;margin-bottom:10px;">
✓ Убедитесь, что заявки доходят до CRM
</div>
<div style="font-size:16px;line-height:1.8;color:#475569;">
Страница «Спасибо» ещё не означает успешную отправку. Проверьте, появилась ли заявка в CRM и может ли её увидеть менеджер.
</div>
</div>
<div style="margin-bottom:26px;padding-bottom:24px;border-bottom:1px solid #edf2f7;">
<div style="font-size:18px;font-weight:700;color:#334155;margin-bottom:10px;">
✓ Проверьте форму с разными данными
</div>
<div style="font-size:16px;line-height:1.8;color:#475569;">
Введите длинное имя, телефон с +7 и без него, разные адреса электронной почты, оставьте часть полей пустыми. Форма должна корректно обрабатывать любые сценарии.
</div>
</div>
<div style="margin-bottom:26px;padding-bottom:24px;border-bottom:1px solid #edf2f7;">
<div style="font-size:18px;font-weight:700;color:#334155;margin-bottom:10px;">
✓ Проверьте промокоды и акции
</div>
<div style="font-size:16px;line-height:1.8;color:#475569;">
Введите промокод самостоятельно. Убедитесь, что скидка применяется корректно, цена пересчитывается, а система учитывает срок действия, пробелы и регистр символов.
</div>
</div>
<div style="margin-bottom:26px;padding-bottom:24px;border-bottom:1px solid #edf2f7;">
<div style="font-size:18px;font-weight:700;color:#334155;margin-bottom:10px;">
✓ Оцените скорость загрузки
</div>
<div style="font-size:16px;line-height:1.8;color:#475569;">
Особенно внимательно проверьте рекламные лендинги. Если страница открывается дольше нескольких секунд, часть пользователей просто не дождётся её загрузки.
</div>
</div>
<div style="margin-bottom:26px;padding-bottom:24px;border-bottom:1px solid #edf2f7;">
<div style="font-size:18px;font-weight:700;color:#334155;margin-bottom:10px;">
✓ Проверьте аналитику
</div>
<div style="font-size:16px;line-height:1.8;color:#475569;">
Убедитесь, что счётчики аналитики, пиксели и события действительно отправляются. Без корректных данных оптимизировать рекламу практически невозможно.
</div>
</div>
<div style="margin-bottom:0;">
<div style="font-size:18px;font-weight:700;color:#334155;margin-bottom:10px;">
✓ Повторите проверки после любых изменений
</div>
<div style="font-size:16px;line-height:1.8;color:#475569;">
Даже небольшая правка текста, формы или интеграции способна сломать рабочий сценарий. После каждого обновления заново проходите ключевой путь пользователя.
</div>
</div>
<div style="margin-top:36px;background:#f8fafc;border:1px solid #e2e8f0;border-left:5px solid #64748b;padding:24px;border-radius:14px;">
<div style="font-size:18px;font-weight:700;color:#1e293b;margin-bottom:12px;">
<img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f4a1.png" alt="????" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Важно
</div>
<div style="font-size:16px;line-height:1.8;color:#475569;">
Этот чек-лист поможет найти самые распространённые проблемы перед запуском рекламы, но он не заменяет полноценное тестирование. Если цена ошибки высока, гораздо дешевле заранее проверить сайт или приложение силами QA-инженеров, чем потерять рекламный бюджет, клиентов и продажи уже после запуска кампании.
</div>
</div>
</div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Если хотя бы половину этого списка вы начнёте делать регулярно – вы уже обгоните 80% коллег. </span>Серьёзно. Не нужно, чтобы маркетолог становился тестировщиком: чек‑лист из базовых проверок – это просто личная гигиена и страховка для рутинных запусков. Её вполне достаточно, чтобы вовремя заметить очевидные проблемы и не сливать бюджет на очевидных ошибках.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Но в ряде случаев без независимого QA не обойтись:&nbsp;</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>когда цена ошибки высока</span> (крупная распродажа, запуск продукта, большой рекламный бюджет);</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>когда метрики не сходятся</span> и непонятно, где теряется конверсия;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>когда внутренняя IT‑команда перегружена</span> или объективно не успевает всё проверить; </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>а также <span class='font-weight-bold'>когда нужен свежий, беспристрастный взгляд</span>.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Ну и куда без мягкой рекламы?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#c0f0dc"}}} --></p>
<p class="has-background" style="background-color:#c0f0dc">Мы в <span class='font-weight-bold'>«<a href="https://quality-lab.ru/outsourcing/" data-type="page" data-id="26">Лаборатории Качества</a>»</span> как раз помогаем не превращать технические сбои в репутационные проблемы и слитые бюджеты. <span class='font-weight-bold'>Для маркетолога это значит конкретный набор решений:</span> мониторинг, который заметит сбой интеграции или формы задолго до того, как о нём узнают клиенты; проверка сквозных сценариев и работы на разных устройствах перед масштабным запуском; точечный анализ, когда метрики не сходятся и непонятно, где теряется конверсия. <span class='font-weight-bold'>Начните с бесплатной консультации.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:paragraph --></p>
<p>Но даже без нашей помощи я советую вам ответственно относиться к технической подготовке площадок для приёма трафика, так как, если что‑то ломается на финальном этапе, отвечать за это в итоге приходится именно маркетологам – деньгами и репутацией бренда.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Если дочитали – расскажите, сталкивались ли вы с техническими проблемами, которые влияли на продвижение? Очень интересно, насколько это общая боль.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>]]></description>
<link>https://quality-lab.ru/blog/pochemu-reklama-ne-prinosit-zayavki-qa-osnovy-kotorye-dolzhen-ponyat-kazhdyj-marketolog/</link>
<pubDate>Fri, 07 Aug 2026 10:57:11 +0300</pubDate>
</item>
<item>
<title>Как мы научили AI разбирать упавшие автотесты и заводить баги в Трекере</title>
<description><![CDATA[<p>Автор: Олег Малышев, <a href="https://t.me/OlegMalyshevBlog/188" mce_href="https://t.me/OlegMalyshevBlog/188">телеграмм-канал автора про QA,QA Auto, AI, Вайбкодинг</a> лидер стека тестирования в компании «ТехВилл»<br mce_bogus="1"></p><p>
Всем привет, меня зовут Олег. В прошлой статье <a href="https://software-testing.ru/library/testing/testing-automation/4528-swagger-" mce_href="https://software-testing.ru/library/testing/testing-automation/4528-swagger-" style="">я рассказывал, как генерить автотесты из Swagger и тест-кейсов</a> при помощи OpenAPI Generator + Cursor AI / Claude Code и как с этого всего автоматически снимать покрытие через Swagger Coverage.</p><p>В этой статье я хочу рассказать, как мы разбираем упавшие автотесты при помощи интеграции ТестОпс с Яндекс Трекером, MCP TestOps, MCP Яндекс Трекера и Cursor AI / Claude Code.</p><p>Но начнем не с AI. Сначала расскажу про сам процесс: зачем нам дефекты в TestOps, как мы руками разбираем запуск автотестов, почему без matcher-правил это быстро превращается в рутину и что именно мы потом автоматизировали.</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-automation/4529-ai</link>
<pubDate>Tue, 04 Aug 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>10 советов по созданию тестов Playwright при помощи Cursor</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/cursor-playwright-tips1.png" mce_src="https://software-testing.ru/images/stories/library/11hs/cursor-playwright-tips1.png" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Филип Рик (Filip Hric)<br /><strong><a href="https://filiphric.com/cursor-playwright-tips" mce_href="https://filiphric.com/cursor-playwright-tips" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><p>Если вы следите за сферой AI-ассистентов для программирования, то, скорее всего, заметили, насколько быстро всё развивается. Новые модели выходят каждый месяц, и все пытаются выявить «правильный способ» работы с этими инструментами. Я провёл последние пару месяцев, создавая тесты на Playwright с помощью Cursor, и, честно говоря, прошел через множество проб и ошибок. Некоторые вещи работали отлично, другие… не очень.</p>
<p>Я решил собрать всё, чему научился, в этом посте. Давайте разберёмся.</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-automation/4502-cursor-playwright-tips</link>
<pubDate>Sun, 02 Aug 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>QAOps: как объединить QA и DevOps, чтобы ускорить релизы без потери качества</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p>ИИ ускорил разработку, но качество продуктов от этого не стало лучше. Команды теперь выпускают обновления чаще и быстрее закрывают задачи, но проверять всё вовремя не успевают. Из‑за этого накапливается много объёмных изменений в коде, а ошибки нередко обнаруживают уже после релиза.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Поэтому компании стали по‑новому смотреть на тестирование. В статье расскажем о подходе QAOps: почему он особенно важен сейчас, с какими сложностями сталкиваются при его внедрении и какие приёмы реально помогают выпускать обновления быстрее и без потери качества, а также получать обратную связь и не допускать, чтобы ускорение разработки приводило к росту ошибок.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30837,"width":"310px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/8487260a-682c-422a-8617-491d7055c247-3-1_11zon-1024x1024.png" alt="что такое QAOps" class="wp-image-30837" style="width:310px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/8487260a-682c-422a-8617-491d7055c247-3-1_11zon-1024x1024.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/8487260a-682c-422a-8617-491d7055c247-3-1_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/8487260a-682c-422a-8617-491d7055c247-3-1_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/07/8487260a-682c-422a-8617-491d7055c247-3-1_11zon-768x768.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/8487260a-682c-422a-8617-491d7055c247-3-1_11zon-1536x1536.png 1536w, https://quality-lab.ru/wp-content/uploads/2026/07/8487260a-682c-422a-8617-491d7055c247-3-1_11zon-2048x2048.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Мы полгода собирали данные: анализировали метрики, общались с командами, изучали отчёты – от международных (DORA, GitClear) до российских опросов. И теперь готовы поделиться выводами, которые можно сразу применять в работе – без абстрактных советов и обещаний мгновенного результата. <br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Что такое QAOps?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Официального определения <a href="https://quality-lab.ru/blog/qaops-testirovanie-kotoroe-menyaet-pravila-igry/" data-type="post" data-id="24670">QAOps</a> нет. Впервые термин прозвучал на Selenium Conf в 2018 году, и до сих пор многие в индустрии считают его просто эффектной аббревиатурой: мол, QA и так входит в DevOps, не стоит приклеивать «Ops» к каждому слову. Мы не спорим о названиях – нам важнее суть. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Если коротко, речь о трёх вещах.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Во‑первых, проверки становятся частью пайплайна</span> – никакой работы «в голове» тестировщика и никаких Excel‑файлов «Регресс_final_v3».</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Во‑вторых, у QA есть чёткие права и обязанности в конвейере</span>: доступ к сборкам, логам и метрикам продакшена, а вместе с тем – ответственность за то, чтобы проверки действительно работали.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>В‑третьих, обратная связь приходит за минуты, а не в конце спринта</span>.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Если обобщить, QAOps – это подход, при котором контроль качества встраивается в конвейер CI/CD, а тестирование идёт непрерывно на всех этапах разработки. В отличие от привычной модели, когда QA подключают ближе к финалу, здесь тестировщики, разработчики и <a href="https://quality-lab.ru/blog/quality-devops-kak-ubrat-ochered-i-uskorit-relizy/" data-type="post" data-id="29235">DevOps</a> работают как единая команда. Основа подхода – автоматизированные проверки, мониторинг и быстрые циклы обратной связи.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Чем QAOps отличается от DevOps?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>QAOps</span> нередко воспринимают как ещё одно название <span class='font-weight-bold'>DevOps</span>, однако это не совсем так. Хотя <span class='font-weight-bold'>оба подхода тесно связаны и используют общие практики автоматизации</span>, они решают разные задачи и расставляют разные приоритеты. Понимание этих различий помогает определить роль QA в современном процессе разработки и понять, почему одного DevOps уже недостаточно для обеспечения качества в условиях частых релизов и активного внедрения ИИ в разработку.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="max-width:1000px;margin:40px auto;font-family:Arial,Helvetica,sans-serif;">
<table style="width:100%;border-collapse:collapse;border:none;">
<tr>
<td style="width:38%;vertical-align:top;padding:0;border:none;">
        <!-- DevOps --></p>
<div style="background:#ffffff;border:1px solid #e5eaf2;border-radius:16px;overflow:hidden;box-shadow:0 8px 24px rgba(0,0,0,0.06);">
<div style="background:#4b5563;color:#ffffff;padding:20px;font-size:28px;font-weight:bold;text-align:center;">DevOps</div>
<div style="padding:18px 22px;border-top:1px solid #eef2f7;font-size:18px;background:#ffffff;">Автоматизация доставки</div>
<div style="padding:18px 22px;border-top:1px solid #eef2f7;font-size:18px;background:#fafbfd;">CI/CD</div>
<div style="padding:18px 22px;border-top:1px solid #eef2f7;font-size:18px;background:#ffffff;">Скорость релизов</div>
<div style="padding:18px 22px;border-top:1px solid #eef2f7;font-size:18px;background:#fafbfd;">Инфраструктура</div>
<div style="padding:18px 22px;border-top:1px solid #eef2f7;font-size:18px;background:#ffffff;">DevOps-инженер</div>
</p></div>
</td>
<td style="width:4%;vertical-align:middle;text-align:center;padding:0 10px;border:none;font-size:48px;font-weight:bold;color:#d61f26;">
        →
      </td>
<td style="width:38%;vertical-align:top;padding:0;border:none;">
        <!-- QAOps --></p>
<div style="background:#ffffff;border:1px solid #e5eaf2;border-radius:16px;overflow:hidden;box-shadow:0 8px 24px rgba(0,0,0,0.06);">
<div style="background:linear-gradient(135deg,#d61f26,#b8141b);color:#ffffff;padding:20px;font-size:28px;font-weight:bold;text-align:center;">QAOps</div>
<div style="padding:18px 22px;border-top:1px solid #eef2f7;font-size:18px;background:#ffffff;">Автоматизация качества</div>
<div style="padding:18px 22px;border-top:1px solid #eef2f7;font-size:18px;background:#fafbfd;">CI/CD + тестирование</div>
<div style="padding:18px 22px;border-top:1px solid #eef2f7;font-size:18px;background:#ffffff;"><span style="color:#d61f26;font-weight:bold;">Скорость и качество</span></div>
<div style="padding:18px 22px;border-top:1px solid #eef2f7;font-size:18px;background:#fafbfd;">Инфраструктура + QA</div>
<div style="padding:18px 22px;border-top:1px solid #eef2f7;font-size:18px;background:#ffffff;">QA + DevOps + разработчики</div>
</p></div>
</td>
</tr>
</table>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Почему мы решили написать про внедрение QAOps?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Всё началось с цифры, которая никак не выходила из головы. <span class='font-weight-bold'><a href="https://www.faros.ai/research/ai-acceleration-whiplash" rel="nofollow">Faros AI</a></span> сняли данные с <span class='font-weight-bold'>22 000</span> разработчиков из <span class='font-weight-bold'>4 000</span> команд. Картина получилась показательная: там, где активно применяли ИИ‑инструменты, росло число мерджащихся пул‑реквестов. При этом медианное время ревью подскакивало на <span class='font-weight-bold'>441%</span>, а доля PR, которая уходила в мастер без проверки, увеличилась на <span class='font-weight-bold'>31%</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"id":30839,"width":"263px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/Rectangle-22_11zon-1024x1024.png" alt="QAOps для СТО" class="wp-image-30839" style="width:263px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/Rectangle-22_11zon-1024x1024.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/Rectangle-22_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/Rectangle-22_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/07/Rectangle-22_11zon-768x768.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/Rectangle-22_11zon.png 1307w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Задумайтесь: никто сознательно не отказывался от ревью. Просто ревьюеры банально не успевали, и такая ситуация постепенно стала привычной. Мы показывали эти цифры техническим руководителям и получали типичную реакцию: короткую паузу и признание, что у них похожая картина.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>В течение нескольких месяцев мы разбирались: это новая проблема, порождённая эпохой ИИ, или просто обострился давний разрыв между QA и DevOps? Ответ оказался простым – второе. Поэтому нам стало интересно изучить актуальные отчёты на эту тему и проверить, что происходит на <a href="https://quality-lab.ru/cases/" data-type="page" data-id="24565">реальных проектах</a>. Ниже – основные выводы, к которым мы пришли.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Почему QAOps стал особенно важен в эпоху ИИ?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Потому что левая половина конвейера ускорилась примерно вдвое, а правая – нет. Ниже – цифры: они говорят лучше любых слов.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>По данным отчёта </span><a href="https://dora.dev/dora-report-2025/" rel="nofollow"><span class='font-weight-bold'>DORA</span></a><span class='font-weight-bold'> за 2025 год</span> (опрошено около 5 000 респондентов), ИИ используют 90% разработчиков. Впервые за всё время наблюдений внедрение ИИ положительно связано с пропускной способностью поставки – и по‑прежнему отрицательно со стабильностью. Авторы отчёта формулируют это прямо: ИИ сильную команду делает сильнее, слабую – делает ещё более хаотичной и малоэффективной.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Отчёт </span><a href="https://cursor.com/insights" rel="nofollow"><span class='font-weight-bold'>Cursor</span></a><span class='font-weight-bold'> о привычках разработчиков (январь 2025 – май 2026)</span> показывает: скорость написания кода выросла вдвое – с 3,6 до 8,6 тысяч строк в неделю. При этом пул‑реквесты стали в 2,5 раза крупнее, а доля PR объёмом от 1 000 строк выросла с 8% до 14%.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Анализ </span><a href="https://www.gitclear.com/ai_assistant_code_quality_2025_research" rel="nofollow"><span class='font-weight-bold'>GitClear</span></a><span class='font-weight-bold'> по 211 миллионам изменённых строк выявил тревожную динамику</span>: доля «перемещённых» строк (то есть признаков рефакторинга) упала с примерно 25% в 2021 году до менее 10% в 2024‑м. При этом доля копипасты выросла с 8,3 % до 12,3%. 2024 год стал первым, когда копипасты в коммитах стало больше, чем рефакторинга, а количество дублирующихся блоков увеличилось в восемь раз.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>С точки зрения безопасности картина тоже непростая. </span>По данным <a href="https://www.veracode.com/resources/analyst-reports/2025-genai-code-security-report/" rel="nofollow"><span class='font-weight-bold'>Veracode</span></a>, при проверке более 100 моделей на 80 задачах в 45% случаев в код попадала уязвимость из OWASP Top 10. Атаки типа XSS не блокировались в 86% случаев. Самое важное: модели лучше справляются с синтаксисом, но не становятся безопаснее. Это не временная трудность, а системная проблема.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>А согласно </span><a href="https://survey.stackoverflow.co/2025" rel="nofollow"><span class='font-weight-bold'>Stack Overflow</span></a>, 66% тратят на отладку ИИ‑кода больше времени, чем на его написание, и лишь 3% по‑настоящему доверяют полученному результату.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Теперь посмотрим на российскую практику, чтобы картина была полной.&nbsp;</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>В </span><a href="https://ai4sdlc-research.space/ai-research-2025/#methods" rel="nofollow"><span class='font-weight-bold'>«Т‑Технологиях»</span></a><span class='font-weight-bold'> 58% инженеров пишут код с помощью ИИ, но доверяют ему лишь 11%.</span> При этом 64% отмечают рост личной продуктивности – однако общий процесс разработки от этого заметно не ускоряется. В самом Т‑Банке ИИ‑инструментами регулярно пользуются более 85% разработчиков – это свыше 12 000 человек. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>По данным </span><a href="https://ict.moscow/analytics/opros-o-primenenii-vaib-kodinga-dlia-professionalnoi-razrabotki-v-rossii-v-2025-godu/" rel="nofollow"><span class='font-weight-bold'>ICT.Moscow</span></a>, 76% опрошенных разработчиков уже применяли «вайб‑кодинг» в рабочих задачах. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><em>Если сложить всё вместе: кода стало вдвое больше, пул‑реквесты – крупнее, доверия к коду – меньше, а возможности проверки остались на прежнем уровне. Именно это и создаёт разрыв между QA и DevOps – только теперь он стал гораздо заметнее из‑за ускорения процессов.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading"><span class='font-weight-bold'>Отдельно про ИИ-код: почему старый регресс его не ловит</span>?</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Есть одна вещь, о которой в статьях про ИИ обычно умалчивают: модель ошибается не так, как человек. Человек допускает ошибки из‑за усталости или невнимательности – и они обычно локальные. Модель же ошибается уверенно, правдоподобно и системно. А ваши процессы регрессионного тестирования рассчитаны как раз на первый тип ошибок.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Мы собрали <a href="https://quality-lab.ru/blog/ispolzuete-ii-dlya-napisaniya-koda-obyasnyaem-kak-ego-pravilno-testirovat/" data-type="post" data-id="30745">отдельную памятку с конкретными рекомендациями</a>: на что смотреть при ревью ИИ‑кода, что обязательно прогонять в пайплайне, какие правила ввести для тестов и по каким красным флагам отклонять PR. В ней <span class='font-weight-bold'>больше 30 пунктов – в удобном формате чек‑листа: открыл, прошёл, увидел результат, закрыл</span>. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#bfe0f8"}}} --></p>
<p class="has-background" style="background-color:#bfe0f8"><span class='font-weight-bold'>Ссылка на интерактивный HTML придёт вам на почту. Чтобы получить его бесплатно, нажмите на кнопку, заполните форму и мы отправим вам его.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Шесть барьеров, которые мешают внедрить QAOps</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Большинство компаний понимают ценность QAOps, но далеко не всем удаётся получить ожидаемый эффект. Вместо ускорения релизов команды сталкиваются с нестабильными пайплайнами, ростом числа ложных срабатываний и снижением доверия к автоматизации. Ниже рассмотрим шесть барьеров, которые чаще всего мешают внедрению QAOps, и практики, помогающие их устранить. Данные мы собирали не из головы, а из своих реальных проектов.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Первый барьер: QA не пускают в пайплайн</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Симптом простой: тестировщик пишет девопсу «перезапусти джобу, пожалуйста» и полдня ждёт. Или не может приступить к работе, потому что нет доступа к артефактам.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Что делать:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>выдать QA базовые права – запускать и перезапускать пайплайн, читать логи, видеть артефакты и дашборды прода. Это решается одним тикетом, не нужно начинать с масштабных разговоров о доверии;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>добавить в Definition of Done пункт «проверки в пайплайне» и обязательно назначить ответственного: без владельца любой пункт остаётся просто пожеланием;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>ещё один шаг – вовлечь QA в груминг и дизайн‑ревью. Да, это не самая захватывающая часть работы, но профилактика дефектов по‑прежнему остаётся самым дешёвым и эффективным способом держать качество на уровне.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Второй барьер: автотесты есть, но им не доверяют</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30840,"width":"332px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/6c6aab64-f9be-4bc6-b1bf-560db52f20bf-3_11zon-1024x1024.png" alt="Автотесты и QAOps" class="wp-image-30840" style="width:332px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/6c6aab64-f9be-4bc6-b1bf-560db52f20bf-3_11zon-1024x1024.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/6c6aab64-f9be-4bc6-b1bf-560db52f20bf-3_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/6c6aab64-f9be-4bc6-b1bf-560db52f20bf-3_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/07/6c6aab64-f9be-4bc6-b1bf-560db52f20bf-3_11zon-768x768.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/6c6aab64-f9be-4bc6-b1bf-560db52f20bf-3_11zon-1536x1536.png 1536w, https://quality-lab.ru/wp-content/uploads/2026/07/6c6aab64-f9be-4bc6-b1bf-560db52f20bf-3_11zon-2048x2048.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Это один из самых опасных случаев: красный билд перестают воспринимать как сигнал проблемы и просто перезапускают. В итоге теряется сам смысл автоматических проверок (как из басни Эзопа про мальчика, который кричал «Волк!»).<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Что делать:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>измерить flaky rate – долю тестов, которые дают разный результат на одном и том же коммите. Цель – меньше 1%. На практике у многих команд этот показатель держится на уровне 5–15%, хотя почти никто его не отслеживает. Без цифры любые разговоры о доверии к тестам превращаются в спор о вкусах;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>ввести карантин: нестабильный тест автоматически убирают из блокирующего набора, заводят на него баг с чётким SLA. Если за две недели не починили – тест удаляют. Это болезненно, но эффективно;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>запретить практику «перезапусти, оно само пройдёт». Это вопрос дисциплины команды, а не технических настроек.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Третий барьер: прогон тестов длится четыре часа</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Если гейт медленнее, чем частота коммитов, – это не гейт, а тормоз. Люди научатся его обходить, и будут правы.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Что делать:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>разделить проверки на три эшелона. На этапе PR‑гейта должны проходить только быстрые проверки: юнит‑тесты, контракты, линтеры, SAST – всё, что укладывается в 10 минут. На этапе merge‑гейта – ключевые интеграционные тесты и smoke‑проверки, укладывающиеся в 30 минут. Всё остальное, включая UI и нагрузочные тесты, уходит в ночной прогон; </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>шардировать и параллелить: чаще всего это даёт больший эффект, чем тонкая оптимизация самих тестов, и обходится дешевле;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>гонять то, что относится к изменённым модулям (risk-based selection), а не весь набор на каждый чих;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>стоит вернуть классическую пирамиду тестирования: если 70% тестов идут через UI, никакая инфраструктура не спасёт от роста времени прогона и числа нестабильных результатов.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Четвёртый барьер: нет подходящих окружений и данных</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Классика жанра: один стенд, на нём три команды и вечное «Вась, не деплойся, я тестирую».</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Что делать:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>внедрять эфемерные окружения под каждый PR: подойдёт docker compose или namespace в Kubernetes. Даже неидеальная реализация сильно меняет ситуацию;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>тестовые данные как код: сиды в репозитории, генерация, обезличивание продовых. Не «выгружаем дамп руками раз в квартал» – это ещё и 152-ФЗ, если что;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>контрактные тесты вместо ожидания: они позволяют проверять взаимодействие сервисов без ожидания, пока соседняя команда поднимет интеграционный стенд.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Пятый барьер: отсутствие метрик, а значит, и разговора с бизнесом</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Пока нет цифр, просьбы выделить ресурсы на «улучшение качества» звучат как эмоции, а не как обоснованные аргументы.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Метрики QAOps: что действительно стоит измерять:&nbsp;</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>метрики DORA плюс rework rate – долю незапланированных деплоев ради отладки пользовательских проблем. DORA добавила её как пятую метрику именно потому, что в эпоху ИИ код производится быстрее, чем проверяется;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Escaped defects: сколько дефектов нашли пользователи, а не вы;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>время от коммита до сигнала;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Flaky rate.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Всё. Не надо <a href="https://quality-lab.ru/blog/perestante-schitat-bagi-sovremennye-metriki-testirovaniya-dlya-it-komand/" data-type="post" data-id="30560">сорока метрик</a>. Достаточно этого набора, которые CTO реально смотрит раз в две недели.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Шестой барьер (бонусный): нехватка зрелых инженерных практик</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Тут врать не буду: это самое дорогое. Инженер, который умеет одновременно в тест-дизайн, в пайплайн и в Kubernetes, – редкий зверь и стоит соответственно. Вариантов три: растить внутри (9–12 месяцев, с риском, что уйдёт, как только вырастет), нанимать (дорого и долго) или взять экспертизу на аутсорсе на время постановки процесса.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Снизит ли QAOps затраты и ускорит ли релизы?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Вот честный ответ: эффект не появляется сразу и сам по себе. Первые два‑три месяца затраты даже растут – приходится вкладываться в инфраструктуру, переделывать тесты, выделять время сотрудников на настройку пайплайна вместо разработки новых функций. Если кто‑то обещает экономию с первого месяца – скорее всего, вам просто продают идею.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Зато позже появляются реальные выгоды.&nbsp;</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Снижается стоимость дефектов</span>: чем раньше находят ошибку, тем дешевле её исправить. Не будем опираться на расхожую фразу про «в 100 раз дороже в проде» – у неё спорная методология. Лучше посчитать на своих данных: возьмите 10 последних инцидентов в проде и сложите часы всех, кто в них участвовал – от разработчиков до поддержки и менеджмента. Обычно сумма выходит внушительная.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Падает rework rate</span> – доля незапланированных доработок. По сути, это прямые потери: люди вынуждены делать одну и ту же работу дважды. Просто раньше эти траты не считали отдельно.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Сокращается время ожидания.</span> В большинстве команд задача реально находится «в работе» всего несколько часов в неделю, а остальное время уходит на ожидание стенда, ревью, регресса или релизного окна. QAOps не заставляет людей работать быстрее – он убирает простои. Именно отсюда и берётся эффект «в два раза быстрее», а не из того, что разработчики начнут печатать код стремительнее.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Наконец, снижается цена «героических» решений</span>: ночных регрессий перед релизом, подхода «выкатим и посмотрим», а заодно – выгорания и текучки кадров. Всё это тоже стоит денег, просто они прячутся в другой статье бюджета – например, в расходах на подбор персонала.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dbeded"}}} --></p>
<p class="has-background" style="background-color:#dbeded"><em>И сразу скажем, когда с QAOps заигрывать не стоит. Если релизы выходят раз в квартал по жёсткому регламенту и изменить это нельзя, то ускорять конвейер бессмысленно – он упрётся в бумажные процессы. Если продукт создан для проверки гипотезы и через пару месяцев его планируют закрыть, то тут проще действовать проще и прямолинейнее. И ещё один важный момент: если у вас пока нет CI, сначала стоит внедрить его. Это база, без которой дальше двигаться сложно.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Можно ли внедрять QAOps с аутсорс-подрядчиком по QA?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"id":30842,"width":"314px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/Rectangle-24_11zon-1-1024x1024.png" alt="QAOps с аутсорс подрядчиком по тестированию" class="wp-image-30842" style="width:314px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/Rectangle-24_11zon-1-1024x1024.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/Rectangle-24_11zon-1-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/Rectangle-24_11zon-1-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/07/Rectangle-24_11zon-1-768x768.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/Rectangle-24_11zon-1.png 1291w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Нас часто спрашивают об этом – и почти всегда с негласным ожиданием услышать «да, всё получится». Будем честны: получится, но далеко не в любой ситуации и <a href="https://quality-lab.ru/blog/shtat-gibrid-ili-autsors-testirovaniya-chestnyj-razbor-ekonomiki-qa-komand-v-2026/" data-type="post" data-id="29877">не с любым подрядчиком</a>.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Вот на что стоит обратить внимание до подписания договора.&nbsp;</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li>У внешней команды должен быть прямой доступ к вашему пайплайну – не нужно обмениваться билдами по почте. </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Её инженеры должны быть в ваших рабочих каналах и участвовать в стендапах, а не ограничиваться еженедельными отчётами. </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>С вашей стороны обязательно должен быть ответственный за качество – нельзя просто переложить эту задачу на подрядчика. </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Договор стоит строить вокруг конкретных результатов и измеримых метрик, а не количества отработанных часов. </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Заранее продумайте, что и когда останется в вашей команде после ухода подрядчика – нужен понятный план передачи знаний и процессов. </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>И, конечно, важно чётко зафиксировать модель доступа к данным и подписать NDA. Для финтеха и госсектора тут есть дополнительные нюансы: стоит учитывать, из каких регионов работает команда и как организован доступ к защищённым контурам.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dbeded"}}} --></p>
<p class="has-background" style="background-color:#dbeded"><em>Если хотя бы четыре из этих условий не выполняются, вы покупаете просто дополнительные руки, а не внедрение QAOps. Это вполне допустимо как решение, но не стоит называть это трансформацией и рассчитывать на соответствующие результаты.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">А ваша команда готова к внедрению QAOps?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Эффективность этого подхода напрямую зависит <span class='font-weight-bold'>от <a href="https://quality-lab.ru/qa-audit/" data-type="page" data-id="24392">зрелости процессов</a>: наличия CI/CD, уровня автоматизации тестирования, качества инженерных практик и культуры взаимодействия между разработкой, QA и DevOps</span>. Если базовые процессы ещё не выстроены, то попытка внедрить QAOps может лишь добавить сложности, а не ускорить релизы.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Чтобы помочь оценить текущий уровень готовности, мы подготовили схема зрелости команд и практический чек-лист. Они помогут понять, на каком этапе находится ваша команда, какие элементы уже работают эффективно, а какие стоит развивать в первую очередь, чтобы переход к QAOps принёс ожидаемый результат.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Лестница зрелости команды разработки</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:html --></p>
<div style="max-width:600px;margin:30px auto;font-family:Arial,Helvetica,sans-serif;">
<div style="display:flex;align-items:center;background:#fff;border:1px solid #e5eaf2;border-left:4px solid #cfd7e3;border-radius:10px;padding:12px 16px;box-shadow:0 4px 12px rgba(0,0,0,.04);">
<div style="width:32px;height:32px;background:#eef2f7;border-radius:8px;text-align:center;line-height:32px;font-weight:bold;font-size:13px;color:#667085;flex-shrink:0;margin-right:14px;">01</div>
<div>
<div style="font-size:17px;font-weight:bold;color:#1f2937;margin-bottom:2px;">Ручное тестирование</div>
<div style="font-size:13px;line-height:1.4;color:#667085;">Тестирование полностью зависит от специалистов.</div>
</p></div>
</p></div>
<div style="text-align:center;font-size:20px;color:#d61f26;font-weight:bold;margin:6px 0;line-height:1;">↓</div>
<div style="display:flex;align-items:center;background:#fff;border:1px solid #e5eaf2;border-left:4px solid #cfd7e3;border-radius:10px;padding:12px 16px;box-shadow:0 4px 12px rgba(0,0,0,.04);">
<div style="width:32px;height:32px;background:#eef2f7;border-radius:8px;text-align:center;line-height:32px;font-weight:bold;font-size:13px;color:#667085;flex-shrink:0;margin-right:14px;">02</div>
<div>
<div style="font-size:17px;font-weight:bold;color:#1f2937;margin-bottom:2px;">Автоматизация</div>
<div style="font-size:13px;line-height:1.4;color:#667085;">Автотесты для регресса и критических сценариев.</div>
</p></div>
</p></div>
<div style="text-align:center;font-size:20px;color:#d61f26;font-weight:bold;margin:6px 0;line-height:1;">↓</div>
<div style="display:flex;align-items:center;background:#fff;border:1px solid #e5eaf2;border-left:4px solid #cfd7e3;border-radius:10px;padding:12px 16px;box-shadow:0 4px 12px rgba(0,0,0,.04);">
<div style="width:32px;height:32px;background:#eef2f7;border-radius:8px;text-align:center;line-height:32px;font-weight:bold;font-size:13px;color:#667085;flex-shrink:0;margin-right:14px;">03</div>
<div>
<div style="font-size:17px;font-weight:bold;color:#1f2937;margin-bottom:2px;">CI</div>
<div style="font-size:13px;line-height:1.4;color:#667085;">Автопроверки при каждом изменении кода.</div>
</p></div>
</p></div>
<div style="text-align:center;font-size:20px;color:#d61f26;font-weight:bold;margin:6px 0;line-height:1;">↓</div>
<div style="display:flex;align-items:center;background:#fff;border:1px solid #e5eaf2;border-left:4px solid #cfd7e3;border-radius:10px;padding:12px 16px;box-shadow:0 4px 12px rgba(0,0,0,.04);">
<div style="width:32px;height:32px;background:#eef2f7;border-radius:8px;text-align:center;line-height:32px;font-weight:bold;font-size:13px;color:#667085;flex-shrink:0;margin-right:14px;">04</div>
<div>
<div style="font-size:17px;font-weight:bold;color:#1f2937;margin-bottom:2px;">CI/CD</div>
<div style="font-size:13px;line-height:1.4;color:#667085;">Тестирование в непрерывной поставке.</div>
</p></div>
</p></div>
<div style="text-align:center;font-size:20px;color:#d61f26;font-weight:bold;margin:6px 0;line-height:1;">↓</div>
<div style="display:flex;align-items:center;background:#fff;border:1px solid #e5eaf2;border-left:4px solid #cfd7e3;border-radius:10px;padding:12px 16px;box-shadow:0 4px 12px rgba(0,0,0,.04);">
<div style="width:32px;height:32px;background:#eef2f7;border-radius:8px;text-align:center;line-height:32px;font-weight:bold;font-size:13px;color:#667085;flex-shrink:0;margin-right:14px;">05</div>
<div>
<div style="font-size:17px;font-weight:bold;color:#1f2937;margin-bottom:2px;">Continuous Testing</div>
<div style="font-size:13px;line-height:1.4;color:#667085;">Проверки на каждом этапе разработки.</div>
</p></div>
</p></div>
<div style="text-align:center;font-size:20px;color:#d61f26;font-weight:bold;margin:6px 0;line-height:1;">↓</div>
<div style="display:flex;align-items:center;background:linear-gradient(135deg,#d61f26,#b8141b);border-radius:10px;padding:12px 16px;box-shadow:0 6px 16px rgba(214,31,38,.25);">
<div style="width:32px;height:32px;background:rgba(255,255,255,.18);border-radius:8px;text-align:center;line-height:32px;font-weight:bold;font-size:13px;color:#fff;flex-shrink:0;margin-right:14px;">06</div>
<div>
<div style="font-size:18px;font-weight:bold;color:#fff;margin-bottom:2px;">QAOps</div>
<div style="font-size:13px;line-height:1.4;color:#fff;">Качество — ответственность всей команды.</div>
</p></div>
</p></div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Короткий тест для оценки готовности процессов к QAOps</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Двенадцать вопросов, отвечать честно (0 – нет, 1 – частично, 2 – да).</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>1.&nbsp; Каждый коммит автоматически собирается и прогоняет тесты.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>2.&nbsp; Красный билд блокирует мёрж технически, а не по договорённости.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>3.&nbsp; Блокирующий набор проходит меньше чем за 15 минут.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>4.&nbsp; Flaky rate известен в цифрах и меньше 1%.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>5.&nbsp; Тесты лежат в том же репозитории, что и код, и ревьюятся так же, как код.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>6.&nbsp; Окружение и тестовые данные поднимаются автоматически.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>7.&nbsp; У QA есть доступ к пайплайну, логам и метрикам прода.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>8.&nbsp; QA участвует в обсуждении требований до того, как написан код.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>9.&nbsp; В пайплайне есть SAST и проверка зависимостей. Если у вас ИИ-код – это не опция.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>10. Вы знаете свои метрики DORA за последний квартал.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>11.&nbsp; Вы знаете, сколько дефектов за квартал нашли пользователи, а не вы.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>12. Откат релиза занимает меньше 15 минут, и это проверено на учениях, а не в теории.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Считаем сумму:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>17–24 балла. </span>У вас уже QAOps, вопрос в шлифовке. Идите оптимизировать время обратной связи и покрытие рисков, а не читать статьи вроде этой.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#f0f3c9"}}} --></p>
<p class="has-background" style="background-color:#f0f3c9"><span class='font-weight-bold'>9–16 баллов. </span>Самое подходящее состояние. Фундамент есть, эффект будет максимальным. Большинство команд, которые я смотрел, живут здесь.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#f2cfd8"}}} --></p>
<p class="has-background" style="background-color:#f2cfd8"><span class='font-weight-bold'>0–8 баллов. </span>Про QAOps говорить рано. Чините CI и стабильность тестов, вернётесь через квартал. Внедрение поверх этого фундамента только ускорит развал – ровно по DORA.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Вместо вывода</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>QAOps – это не волшебная кнопка и не какая-то супер методика. Суть в простом: <span class='font-weight-bold'>если вы стали быстрее писать код, но не ускорили его проверку, то вы не стали эффективнее</span> – вы просто передвинули «узкое место» с этапа разработки на ревью и регресс. <span class='font-weight-bold'>И это очень <a href="https://quality-lab.ru/blog/shifting-left-strategiya-kogda-celesoobrazno-pereklyuchatsya-v-testirovanii/" data-type="post" data-id="14215">дорого обходится</a>, так как чем позже находят баг, тем больше времени и денег уходит на его исправление.</span><br /><span class='font-weight-bold'>Улучшить ситуацию можно без подвигов – с помощью вполне понятных шагов, которые мы подробно описали выше. </span>Например, грамотно настроить права доступа, сделать быструю проверку на 10 минут, отдельно разбирать нестабильные тесты, использовать временные окружения под каждую задачу и сократить количество метрик до самых необходимых и понятных.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Мы в «Лаборатории Качества» уже <span class='font-weight-bold'>более 17 лет помогаем выстраивать такие процессы</span>. За это время реализовали более <span class='font-weight-bold'>530 проектов по тестированию, работаем в 40 регионах России и СНГ</span>. Мы сначала проводим аудит и показываем реальную картину по вашему проекту, затем настраиваем QAOps под ваш пайплайн и передаём экспертизу вашей команде – чтобы дальше вы работали самостоятельно.<span class='font-weight-bold'> </span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#c0f0dc"}}} --></p>
<p class="has-background" style="background-color:#c0f0dc"><span class='font-weight-bold'>Если хотите сначала просто разобраться, есть ли у вас эта проблема и насколько она серьёзная, – предлагаем бесплатную стратегическую консультацию. </span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>]]></description>
<link>https://quality-lab.ru/blog/qaops-kak-obedinit-qa-i-devops-chtoby-uskorit-relizy-bez-poteri-kachestva/</link>
<pubDate>Thu, 30 Jul 2026 17:37:29 +0300</pubDate>
</item>
<item>
<title>Как я сделала отчет о дифференциальном тестировании через Cursor</title>
<description><![CDATA[<p>Автор: <a href="https://software-testing.ru//edu/tutor/5" mce_href="https://software-testing.ru/edu/tutor/5">Ольга Назина (Киселёва)</a>, автор курса&nbsp;<a href="https://software-testing.ru/edu/3-online/56-school-for-beginer" mce_href="https://software-testing.ru/edu/3-online/56-school-for-beginer">Школа для начинающих тестировщиков</a></p>
<p>Я хочу рассказать, как я сделала отчет о дифференциальном тестировании (сравнение двух функций на одних данных) через ИИ. Знаю, что многие уже применяют ИИ и в хвост и в гриву, но также много тех, кто пока не умеет этого делать.</p><p><img src="https://software-testing.ru/images/stories/library/11hs/Cursor/cursor1.png" mce_src="https://software-testing.ru/images/stories/library/11hs/Cursor/cursor1.png" alt="" /></p><div><figcaption>Картинка на заставку, конечно же, тоже сделала через ИИ (нанобанано)</figcaption></div><p>Поэтому я хочу показать на конкретном примере из жизни, где еще несколько лет назад пришлось бы делать красивый отчет в ручную, а теперь его делает робот за пару минут. Возможно, это вдохновит вас тоже попробовать сделать нечто похожее =))</p>]]></description>
<link>https://software-testing.ru/library/around-testing/processes/4530-cursor</link>
<pubDate>Wed, 29 Jul 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Мои 12 недель в году. Часть 34 (Вернулась на работу! ДР мужа и детей: Кате 1 годик, Леше 2)</title>
<description><![CDATA[<p>&nbsp;</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtqa7NNEFNpoYGRqwj72wUrRkcqfswpa1UV2PICQ1-qpJL3lO4B37guLdYfw5tCp8UTHcB-h-NEipy-389sG6bCFTk2OK2WoQXff-1pcOxGyjkL4n0VGU-xqQMGUiXFop9YFDp4l9yiePZ6FJ-S2LvXMYAACYPY-xMSWstzi-mSXg5QoYq10AJs3Nd3Hc/s1280/photo_2026-07-06_15-26-29.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="853" data-original-width="1280" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtqa7NNEFNpoYGRqwj72wUrRkcqfswpa1UV2PICQ1-qpJL3lO4B37guLdYfw5tCp8UTHcB-h-NEipy-389sG6bCFTk2OK2WoQXff-1pcOxGyjkL4n0VGU-xqQMGUiXFop9YFDp4l9yiePZ6FJ-S2LvXMYAACYPY-xMSWstzi-mSXg5QoYq10AJs3Nd3Hc/s320/photo_2026-07-06_15-26-29.jpg" width="320" /></a></div><br /><p></p><p style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><a href="https://okiseleva.blogspot.ru/2017/06/12.html" style="color: #6699cc; font-family: arial, tahoma, helvetica, freesans, sans-serif; text-decoration: none;">Первый опыт</a><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif">, </span><a href="http://okiseleva.blogspot.com/2017/09/12-2.html" style="color: #6699cc; font-family: arial, tahoma, helvetica, freesans, sans-serif; text-decoration: none;">второй</a><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif">, </span><a href="http://okiseleva.blogspot.com/2017/12/12-3.html" style="color: #6699cc; font-family: arial, tahoma, helvetica, freesans, sans-serif; text-decoration: none;">3</a><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif">, </span><a href="http://okiseleva.blogspot.com/2018/03/12-4.html" style="color: #6699cc; font-family: arial, tahoma, helvetica, freesans, sans-serif; text-decoration: none;">4</a><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif">, <a href="https://okiseleva.blogspot.com/2018/06/12-5.html" style="color: #6699cc; text-decoration: none;">5</a>, <a href="https://okiseleva.blogspot.com/2018/09/12-6.html" style="color: #6699cc; text-decoration: none;">6</a>, <a href="https://okiseleva.blogspot.com/2018/12/12-7.html" style="color: #6699cc; text-decoration: none;">7</a>, <a href="https://okiseleva.blogspot.com/2019/03/12-8.html" style="color: #6699cc; text-decoration: none;">8</a>, <a href="https://okiseleva.blogspot.com/2019/06/12-9.html" style="color: #6699cc; text-decoration: none;">9</a>, <a href="https://okiseleva.blogspot.com/2019/09/12-10.html" style="color: #6699cc; text-decoration: none;">10</a>, <a href="https://okiseleva.blogspot.com/2019/12/12-11.html" style="color: #6699cc; text-decoration: none;">11</a>, <a href="https://okiseleva.blogspot.com/2020/03/12-12.html" style="color: #6699cc; text-decoration: none;">12</a>, <a href="https://okiseleva.blogspot.com/2020/06/12-13.html" style="color: #6699cc; text-decoration: none;" target="_blank">13</a>, <a href="https://okiseleva.blogspot.com/2020/09/12-14.html" style="color: #336699; text-decoration: none;" target="_blank">14</a>, <a href="https://okiseleva.blogspot.com/2021/04/12-15.html" style="color: #336699; text-decoration: none;" target="_blank">15</a>,&nbsp;</span></p><p style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif"><a href="https://okiseleva.blogspot.com/2021/07/12-16.html" style="color: #336699; text-decoration: none;" target="_blank">16</a>, <a href="https://okiseleva.blogspot.com/2021/11/12-17.html" style="color: #336699; text-decoration: none;" target="_blank">17</a>, <a href="https://okiseleva.blogspot.com/2022/02/12-18.html" style="color: #336699; text-decoration: none;" target="_blank">18</a>, <a href="https://okiseleva.blogspot.com/2022/06/12-19.html" style="color: #336699; text-decoration: none;" target="_blank">19</a>, <a href="https://okiseleva.blogspot.com/2022/09/12-20.html" style="color: #336699; text-decoration: none;" target="_blank">20</a>, <a href="https://okiseleva.blogspot.com/2022/12/12-21.html" style="color: #336699; text-decoration: none;" target="_blank">21</a>, <a href="https://okiseleva.blogspot.com/2023/03/12-22.html" style="color: #336699; text-decoration: none;" target="_blank">22</a>, <a href="https://okiseleva.blogspot.com/2023/06/12-22-dump-sqa-days.html" style="color: #336699; text-decoration: none;" target="_blank">23</a>, <a href="https://okiseleva.blogspot.com/2023/09/12-24.html" style="color: #336699; text-decoration: none;" target="_blank">24</a>, <a href="https://okiseleva.blogspot.com/2023/12/12-25-sqa-days.html" style="color: #336699; text-decoration: none;" target="_blank">25</a>, <a href="https://okiseleva.blogspot.com/2024/04/12-26-3.html" style="color: #336699; text-decoration: none;" target="_blank">26</a>, <a href="https://okiseleva.blogspot.com/2024/07/12-27-css.html" style="color: #336699; text-decoration: none;" target="_blank">27</a>, <a href="https://okiseleva.blogspot.com/2024/10/12-28-graphql.html" style="color: #336699; text-decoration: none;" target="_blank">28</a>, <a href="https://okiseleva.blogspot.com/2025/01/12-28.html" style="color: #336699; text-decoration: none;" target="_blank">29</a>, <a href="https://okiseleva.blogspot.com/2025/04/12-30-chatgpt.html" style="color: #336699; text-decoration: none;" target="_blank">30</a>, <a href="https://okiseleva.blogspot.com/2025/07/12-31-sqa-days.html" style="color: #336699; text-decoration: none;" target="_blank">31</a>, <a href="https://okiseleva.blogspot.com/2025/11/12-32.html" style="color: #336699; text-decoration: none;" target="_blank">32</a>, <a href="https://okiseleva.blogspot.com/2026/03/12-33.html">33</a></span></p><p><br /></p><h3 style="text-align: left;">Что это за техника</h3><p>Вы собираетесь с друзьями в группу и ставите себе цели на 12 недель (3 месяца). Это могут быть как рабочие, так и личные задачи. Такие, которые вы вроде как хотите сделать, но вечно откладываете, так как «некогда, потом, щас, вот только мелочевку разгребу и тот пожарчик потушу».</p><p>Настало время заняться тем, чем действительно хочется!&nbsp; Отталкиваясь от глобальных целей, составляете план на неделю. И раз в неделю встречаетесь с группой и обсуждаете, сколько успели, сколько нет. Какой план на следующую неделю. Я, правда, уже давно не встречаюсь, а просто веду файлик "что сделано", откуда потом и просматриваю всё, что успела за цикл.</p><p><br /></p><h3 style="text-align: left;">Результаты кратко</h3><p>Основной план:</p><p>- ???? книга по тайм-менеджменту — написать 2 главы</p><p>- ???? сделать 1 урок нового курса</p><p>- ???? 1 статья на Хабр</p><p>- ???? 2 видео на ютуб</p><p>На самом деле очень круто вышло, с учетом того, что в этом цикле было 3 дня рождения в семье + смена нянь (а поиск новой — это время + потом помогать первое время надо) + болезни + ломалась коляска (а с погодками без коляски никак)...</p><p>А еще я на работу вышла! Из декрета. Достаточно внезапно получилось, я спрашивала о такой возможности3 месяца назад, и тут мне предложили, а я и согласилась, и в середине цикла уже вернулась на работу. Теперь вливаюсь в новый режим, пытаюсь совмещать работу и курсы (пока получается плохо)</p><p>Тем не менее я написала не просто 2 главы новой книги, а целых 5! И статьи на Хабр сделала, и даже про ютуб не забыла! С курсами пока тяжело идет, да. Но я буду стараться)))</p><p>Так что пока вливаюсь. Но все таки кое-что успела:</p><p></p><ol style="text-align: left;"><li>Книга 5, ChatGPT:</li><ol><li>сдала в издательство</li><li>добили картинки с художницами</li><li>расставила картинки "диалоговые" во всей книге</li><li>начали редактуру! Вычитали 14 глав</li><li>начали верстку, так как она сложная</li></ol><li>Книга 6, тайм-менеджмент — написала 5 глав ????</li><li>Курс по автоматизации в Postman:</li><ol><li>Закончила перезапись всех 14 уроков</li><li>Переписала кусок в уроке 14, когда загрузка стала платной</li><li>Перезаписала почти весь урок 1, так как там много обновилось</li></ol><li>Статьи на Хабр — 2 статьи ????</li><li>Пополнила свой youtube-канал — 3 видео ????</li><li>Нашла помощника с монтажом</li><li>Побывала на&nbsp;TechWriter Days 3</li><li>Инструменты 12 недель — продолжаю вести файлик DONE, это все еще очень круто</li><li>Хожу в спортзал ????</li><li>Нашли новую дневную няню деткам.</li><li>Влад закончил 1 класс!&nbsp;</li><li>Отмечали ДР мужа!</li><li>Отмечали ДР Леши — 2 года уже!</li><li>Отмечали ДР Кати — 1 годик!</li><li>Фотосессия!</li><li>Сходили в театр с мужем!</li></ol><p></p><span><a name='more'></a></span><p><br /></p><p><br /></p><h3 style="text-align: left;">Результаты подробнее</h3><div><br /></div><div><h3 style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; margin: 0px; position: relative; text-align: left;">Книга 5: ChatGPT</h3></div><div><br /></div><div><br /></div><div>В прошлом цикле я уже давно закончила книгу и ждала художниц. Я их 3 месяца, блин, ждала! Поэтому оплатила Нано Банано и в следующей книге будет больше моего творчества...</div><div><br /></div><div>Тем не менее:</div><div><br /></div><div>????13 мая — сдала рукопись, ура! Вика всё закончила))</div><div><br /></div><div>????&nbsp; 9 июня — начали редактуру, Евгения прислала мне первые 5 глав.</div><div><br /></div><div>???? 22 июля — начали верстку. Людмила прислала мне верстку первых 4 глав. Редактура еще не закончена (мы на 14 главе тогда были), но верстку начали, так как она сложная.</div><div><br /></div><div>У меня всегда сложная верстка, потому что в моих книгах много картинок. А в книге про&nbsp;ChatGPT еще диалоги с роботом есть, их тоже надо как-то оформить. Вот и начали верстку заранее.&nbsp;</div><div><br /></div><div>Это даже хорошо! Глядишь, книга скоро выйдет)))</div><div><br /></div><div>А с картинками для диалогов тоже забавно вышло. Я сначала сделала сами картинки и художница их нарезала:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK43q4jE2tBqf5x14x0I7oFbaHC44yXqrBOskortfL5FtrBuTPTbPAsOQkANtRM4Gj0hS_6O2PItcVOnLXmPAVoLXtkNc861AIbSnkXbsrV7zqnMq3y4RRjHQxBejRmynDwAfvzlra49mudG70eIoBg0AMBslCzmLCWYhOzVyBhu9KX3KRIjLTUQRm82k/s1152/%D0%98%D0%98_%D0%BA%D0%B0%D1%82%D1%8F_%D0%B4%D0%BB%D1%8F_%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="928" data-original-width="1152" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK43q4jE2tBqf5x14x0I7oFbaHC44yXqrBOskortfL5FtrBuTPTbPAsOQkANtRM4Gj0hS_6O2PItcVOnLXmPAVoLXtkNc861AIbSnkXbsrV7zqnMq3y4RRjHQxBejRmynDwAfvzlra49mudG70eIoBg0AMBslCzmLCWYhOzVyBhu9KX3KRIjLTUQRm82k/s320/%D0%98%D0%98_%D0%BA%D0%B0%D1%82%D1%8F_%D0%B4%D0%BB%D1%8F_%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA.png" width="320" /></a></div><br /><div>А потом я уже догадалась спросить у Людмилы, как лучше — чтобы она просто в каждый диалог новую девочку вставляла или мне разметки сделать. Оказалось, что мне =))) Так что я в срочном режиме бегала по каждой главе и расставляла там нумерацию девочек и роботов для диалогов.</div><div><br /></div><div>В общем, много работы над книгой было в этом цикле, много!</div><div><br /></div><div><br /></div><div><br /></div><div><h3>Книга 6: тайм-менеджмент</h3></div><div><br /></div><div>В этом цикле я подала заявку на новую книгу, над которой уже начала работу ранее.</div><div>Показала свои наработки редактору, он говорит — присылай проспект!</div><div><br /></div><div>Сказано, сделано. Оформила план-проспект, сдала. Его согласовали и на 5-ой неделе, ну а я продолжила работу над книгой, отвлекаясь только когда по предыдущей что-то приходило на выверку.</div><div><br /></div><div>Пока у меня написано 5 глав, посмотрим, сколько будет в следующий раз!&nbsp;</div><div><br /></div><div>Я довольна результатом, хотя, конечно, с учетом планов написать ДВЕ книги в этом году, я капитально отстаю. Рассчитывала к лету уже сделать книгу по тайм-менеджменту, но... Это было слишком оптимистично ????</div><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Курсы</h3><div><br /></div><div><b>Автоматизация в Postman</b></div><div><br /></div><div>Я доделала то, что планировала исходно!</div><div><br /></div><div><div>Прошлый результат — 11 уроков готовы.</div><div>Текущий — 14 уроков готовы.</div></div><div><br /></div><div>Хотелось бы на этом и остановиться, но Постман стал подкидывать приколы, из-за которых я и ставила курс на паузу. Обновилась документация и теперь мне надо еще раз пересмотреть свои лекции и что-то, возможно, перезаписать.</div><div><br /></div><div>Загрузка из файла вдруг стала платной. Я переписала уже записанный и обработанный 14 урок — не весь, вставку сделала. Теперь надо сделать вставку в урок про загрузку из файла.</div><div><br /></div><div>Переписала кусок в первой лекции, где первый запрос, потому что внешний вид постмана тоже чуток обновился.</div><div><br /></div><div>В общем, почти готово, но не успела закрыть все в этот цикл. Конечно, "помешала" работа, так как последний месяц я привыкаю к новым реалиям и теперь сложнее выкроить время на курс. Но ничего, вольюсь и продолжу работать!</div><div><br /></div><div><br /></div><div><b>Новые курсы</b></div><div><b><br /></b></div><div>Пока на паузе, ждут, когда я доделаю постман. Есть пара идей из того, что я могу сделать относительно быстро (там, где я и так все знаю) и пара идей, где мне будет посложнее (продумать структуру и т.д.)</div><div><br /></div><div>Надеюсь, в следующем цикле я как минимум начну новый курс! ????</div><div><br /></div><div><br /></div><div><br /></div><div><b>Улучшалки по старым курсам</b></div><p><a href="https://testbase.ru/qa-engineer" target="_blank">ПОТ</a>:</p><p>Переписала лекцию автоматизации в GUI, так как селениум ИДЕ сдох</p><p><br /></p><p><a href="https://testbase.ru/learn/chatgpt" target="_blank">ChatGPT</a>:</p><p>1. Добавила раздел "мои истории"</p><p>2. Добавила туда ссылку на «ИИ, помоги мне настроить IDE»</p><p>3. Добавила туда ссылку на «Настраиваем IDEA с ИИ, часть 2»</p><p>4. Добавила туда ссылку на «Как я сделала отчет о дифференциальном тестировании через Cursor»</p><p>5. Добавила ссылку на "Анализируем данные в файле с помощью ИИ"</p><p><br /></p><p><a href="https://testbase.ru/learn/rest-api">Рест</a>:</p><p>1. В ДЗ 12 поменяла ссылку с гуглодоки на конфлюенс</p><p>2. В конфлюенсе убрала ссылку, которая работала только под впн (на http-статусы)</p><p>3. Исправила картинку "как в джире связывать задачи" в ДЗ 6</p><p><br /></p><p><br /></p><h3 style="text-align: left;">Хабр</h3><div>Хотела написать одну статью, а вышло 2, отличный результат! ????</div><p>1.&nbsp;Типы границ для классов эквивалентности —&nbsp;<a href="https://habr.com/ru/articles/1045436/">https://habr.com/ru/articles/1045436/</a></p><p>2. Как я сделала отчет о дифференциальном тестировании через Cursor <a href="https://habr.com/ru/articles/1058722/">https://habr.com/ru/articles/1058722/</a></p><p><br /></p><h3 style="text-align: left;">Блог</h3><p>Благодаря выходу на работу оживила свой блог =)))</p><p><br /></p><p><a href="https://okiseleva.blogspot.com/2026/06/ide.html" target="_blank">ИИ, помоги мне настроить IDE</a></p><p><a href="https://okiseleva.blogspot.com/2026/06/blog-post_25.html" target="_blank">Настраиваем IDEA с ИИ, часть 2</a></p><p><a href="https://okiseleva.blogspot.com/2026/07/idea-3.html" target="_blank">Настраиваем IDEA с ИИ, уточняем теорию, часть 3</a></p><p><br /></p><p><a href="https://okiseleva.blogspot.com/2026/07/blog-post.html" target="_blank">При общении с ИИ не усложняйте вопрос, это сожрет лишние токены</a></p><p><a href="https://okiseleva.blogspot.com/2026/07/blog-post_24.html" target="_blank">Анализируем данные в файле с помощью ИИ</a></p><p><a href="https://okiseleva.blogspot.com/2026/06/blog-post_30.html" target="_blank">Как ИИ нам проверку уязвимостей сломал</a></p><p><br /></p><p><a href="https://okiseleva.blogspot.com/2026/07/eamity.html" target="_blank">Как убрать поп-ап с параметром в ТeamСity</a></p><p><br /></p><p><br /></p><h3 style="text-align: left;">Youtube / ВК</h3><p><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">Мой канал — </span><a href="https://www.youtube.com/c/okiseleva" style="background-color: white; color: #336699; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; text-decoration: none;">https://www.youtube.com/c/okiseleva</a><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"> (</span><a href="https://vkvideo.ru/@club227447987" style="background-color: white; color: #336699; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; text-decoration: none;" target="_blank">Дубль в ВК</a><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">).</span></p><p><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">Обновления в этом цикле:</span></p><p>1. <a href="https://youtu.be/UU21j-DuQU4" target="_blank">Что такое регулярные выражения</a>&nbsp;</p><p>2. <a href="https://youtu.be/-vlYkjzsi5E">Заменит ли ИИ тестировщиков?</a>&nbsp;</p><p>3. <a href="https://www.youtube.com/watch?v=uYzETFE72rg" target="_blank">Как написать автотест на HTML в Postman-е</a></p><p><br /></p><h3 style="text-align: left;">Конференции</h3><p>Ездила ко конференцию техписов, мне это все очень близко, ведь я тоже занимаюсь документацией. Рассказа про конференцию здесь:&nbsp;<a href="https://okiseleva.blogspot.com/2026/04/techwriter-days-3.html" target="_blank">TechWriter Days 3. Как это было</a></p><p><br /></p><p><br /></p><h3>Вышла из декрета</h3><p>Я в марте ездила в офис и спрашивала начальницу Катю, не надо ли ей, чтобы я вышла, скажем, до осени. Заранее готовилась к лету, это всегда мертвый сезон на курсах. Но на тот момент мест особо не было, особенно краткосрочных.</p><p>А в начале июня Катя сама написала и спросила, актуально ли мне вернуться. Но, конечно, уже не до осени, а просто выйти из декрета. И я согласилась! У нас на тот момент «через неделю» должна была быть очередная госпитализация с дочкой, так что договорились, что я выйду через 2 недели.&nbsp;</p><p>Воу, вот это неждачик был о_О</p><p>Главное, сама договорилась, потом сама в шоке была)))) А потом началось веселье, за эти 2 недели:</p><p>- дети приболели = плохие ночи у нас</p><p>- у няни заболел ребенок и она день в день написала "сорри, сегодня не приду"</p><p>- няня сама заболела (аналогично)</p><p>- няню сбил самокатчик недалеко от нашего дома — жуть вообще, 17-летний пацан сбил и укатил в закат, думал, не найдут (нашли). Еще минус 3 дня, травмпункт + лекарства...</p><p>После каждого проишествия я думала — ну куда я лезу, как я работать то буду, когда тут такое??</p><p>Но ничего, прорвемся! Сейчас вот уже работаю, пока все хорошо, тьфу тьфу тьфу. Но сентябрь пугает, там и старшему в школу, и средний выйдет в ясли на весь день = привет, болезни! Ох, боязно!</p><p>Ну и работать Н часов подряд непривычно, конечно, вот из моих заметок:</p><p><i>Работала 8 часов, мозги сплавились (((&nbsp;</i></p><p>Так-то я на полставки вышла и работаю по 5ч, но пока не получается каждый день укладываться в этот срок, тут продолбаюсь, там не успею, вот и засиживаюсь. Но ничего, это первые месяцы такие, сложные. Уже начинаю потихоньку вливаться в режим. А там, глядишь, и время на курсы появится!</p><p><br /></p><h3>Магия утра</h3><p>Я когда-то пробовала жить по магии утра, но у меня не получилось. Мы тогда вставали в 6 утра, чтобы к 7 приезжать на работу. Какая тут магия, в 5 вставать? Так я на нее и забила.</p><p>А тут у меня дочка вставала, вставала спозаранку, а потом как стала спать! А я аккуратно выходила из спальни — мы лечим гемангиому, даем&nbsp; лекарство Атенолол, его надо давать строго по часам. Так что в 7 утра я встаю набрать шприц, потом обычно ложусь досыпать до 8, в 8 даю ей лекарство:</p><p>- Поднесла шприц, та рот во сне приоткрыла, пшик!</p><p>- И тут же соску дать ????</p><p>И тогда, если она еще спит и вставать не хочет, отворачивается на бок и досыпает своё. А я пару раз попробовала лечь, но лежись и пошевелиться лишний раз боишься, Катя ворочается, ты тут еще шумишь... Встанет в 8.20 и кажется, что из-за тебя.</p><p>Поэтому я стала в 8 выходить и хотя бы 20 минут... Работать! Да, работать, зато у меня каждый день теперь стабильный заход к книге есть. Ну, как каждый... Когда Катя спит)))</p><p>Вот выдержки из файла результатов:</p><p></p><blockquote><p><br /></p><p>Катя встала в 5.40, весь график сбился...</p><p>А потом внезапно до 8.30 и это такой кайф! Прочуствовала магию утра прям (9 нед)</p><p>Рабочий день... Но я встала в 7 утра, раньше Кати!</p><p>1. Заход к книге. даже парочка небольших, пока Катя спала</p><p></p></blockquote><p><br /></p><p>И потом такие же заметки:</p><p><br /></p><p></p><blockquote><p>Утром встала раньше Кати</p><p>1. Заход к книге! Хорошо идет утром</p><p></p></blockquote><p><br /></p><p>В общем, лет 8 магию утра отвергала, но, когда у тебя трое детей, ТИХОЕ утро — это чистый кайф! Даже если работать)))</p><p><br /></p><h3>Что еще</h3><p>Почитала питон-книгу! Хотела прочитать хотя бы 100 страниц, остановилась на 97.</p><p>Ого, так я даже выполнила свой план, оказывается. И сделала это в первые пару недель цикла. Потом болезни, не до книги было. А потом на работу вышла. И последний месяц+ не читала ее совсем. Это грустно, но пока я только настраиваю режим, хочется хотя бы работать успевать, а читать уже так, дополнительный бонус.</p><p><br /></p><p><br /></p><h3>Внерабочее</h3><p><br /></p><p><b>Няни</b></p><p>У нас ушла дневная няня и мы чуть ли не месяц искали замену. Вроде нашли Владимира, потом он отказался по своим причинам, снова искали... Нам тогда очень повезло, что вечерняя няня работала на полставки и согласилась приезжать после обеда, очень выручила нас.</p><p>Нас пара нянь прокинула. Сначала договариваемся на пробный день, а утром няня "ой, я не приеду". Но помучались, помучались, и нашли! Сейчас у нас есть Татьяна, ура!</p><p>Эти поиски выбивали меня из режима:</p><p><br /></p><p></p><blockquote><p>Няня нас прокинула прям с утра. Благо Владимир согласился приехать</p><p>Снова искала няню, ну и работать не хотелось</p></blockquote><p><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp;</span>...&nbsp;</p><blockquote><p>Нашли няню, вводили её в курс дела и тд.</p><p>Почти не работала, только текучка</p></blockquote><p></p><p><br /></p><p>Потом у нас няни болели, в итоге снова я с детьми. И снова все планы нафиг. Увы, у мамы малышей такое постоянно:</p><p><br /></p><p></p><blockquote><p>Всё пошло не так... У Кати снова сопли, я ночью не спала.</p><p>Легла спать, сдав детей. Потом долго тупила, в итоге не работала, но убралась</p><p>Плохо себя чувствовала, не работала.</p></blockquote><p></p><p><br /></p><p><br /></p><p><b>Дети и все вокруг</b></p><p>Ездили с Катей на госпитализацию, нас опять отпустили сразу. Сделали лазер и отпустили. Хотя в прошлый раз говорили, что положат на пару дней увеличить дозу лекарства, но в этот раз был другой врач, он отпустил.</p><p>Следующая госпитализация уже в сентябре. И тоже непонятно, положат, не положат... Посмотрим, что тут гадать!</p><p><br /></p><p>Ещё у нас в этот цикл коляска опять сломалась! Просто старший сын привык ездить спереди — пока Катя была совсем маленькой, люлька нужна перед тобой (у нас же длинная двойная коляска, а не широкая, где два места рядом). Да и Леше интересно все вокруг, поэтому ехать спереди тоже хорошо.</p><p>Но сейчас он уже весит прилично, а большие колеса на коляске сзади. Уже один раз колесо ломалось, но нам повезло, нагуглили ремонт на авито, и в тот же день привезли колесо, к вечеру забрали.</p><p>А второй раз сломалось в выходные, субботу или воскресенье. Починили только к среде! И вот это были жесткие несколько дней. Дети то привыкли спать на улице, а тут надо было выходить с обычной коляской (в ней Катя), Лешу за ручку...&nbsp;</p><p>Потом на сон возвращаться, укладывать дома — Леша то нормально укладывается, а вот Катю еще поди уложи.</p><p>Один из дней вообще треш был, у Татьяны ребенок свой заболел и она прийти не смогла. Коляска сломана, на улице дождь, красота... Благо другая няня смогла ее подменить, но и я носилась, помогала...</p><p>Как хорошо, что все эти неприятности были ДО выхода на работу, а! ????</p><p><br /></p><p><b>Праздники!</b></p><p>В этом цикле были майские праздники — я в них играла, отдыхала, но не работала. Плюс собрали кучу дней рождения.</p><p><br /></p><p><b>ДР Леши!&nbsp;</b></p><p>Ему уже 2 годика, вау! Мы сходили в местный Джоки Джоя с ним, он был в восторге от ватрушки:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFNLIUyPq2B3m1X9OdcMH-Q3TFPFrn2TpYQys3fD5Po_aX6wbFomzX0AEjqchyDP-DLa-bKtzWxs-4QjdixEIJR7UuFqdO3_mNINob63QbuhrTlZe5eLm-WGtPzJufIo8VangkDB2DMrgjox4iYDBwjWvprlkkiL2vWFh8LOXiZtmZozKvcyI44OkFBpQ/s1530/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1530" data-original-width="1148" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFNLIUyPq2B3m1X9OdcMH-Q3TFPFrn2TpYQys3fD5Po_aX6wbFomzX0AEjqchyDP-DLa-bKtzWxs-4QjdixEIJR7UuFqdO3_mNINob63QbuhrTlZe5eLm-WGtPzJufIo8VangkDB2DMrgjox4iYDBwjWvprlkkiL2vWFh8LOXiZtmZozKvcyI44OkFBpQ/s320/2.jpg" width="240" /></a></div><br /><p>Просто по кругу ходили, скатились, идем наверх, снова скатываемся. Сначала только с папой или мамой, потом решился один и тогда ты тащишь ватрушку наверх и потом бегом бежишь вниз встречать сына))) А он уже снова чешет наверх!</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVup60QiMpfmZ68YA6BgxmXT6o2GYQSfnLKcdi0iaui56_7GOUX4C_Il_YUCO1NsdeCDJqzlG9iX31MITlpr4VW7hvdkW-wHFwBiSC0Z12ZBjxW5_a1zHxDQrqHYTWXuliJ_9D7F3xL6vSQO9N1olBXOnP4SqdUP3px_VXyVVhZ1Qe-RLW4cJhAc-90Pg/s1530/2.1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1530" data-original-width="1148" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVup60QiMpfmZ68YA6BgxmXT6o2GYQSfnLKcdi0iaui56_7GOUX4C_Il_YUCO1NsdeCDJqzlG9iX31MITlpr4VW7hvdkW-wHFwBiSC0Z12ZBjxW5_a1zHxDQrqHYTWXuliJ_9D7F3xL6vSQO9N1olBXOnP4SqdUP3px_VXyVVhZ1Qe-RLW4cJhAc-90Pg/s320/2.1.jpg" width="240" /></a></div><br /><p>Но, главное, что ему очень понравилось, прям в восторге был! Мы ходили с няней, она развлекала Катюшу, пока мы катались с Лешей. А потом, когда все вышли, то дети поехали с няней спать младшие, а мы со старшим вернулись домой)))</p><p><br /></p><p><b>ДР мужа!&nbsp;</b></p><p>В кои-то веки выбрали куда-то ВМЕСТЕ. А то хотя бы один всегда дома, чтобы няне помочь собраться на улицу... А тут поехали в любимый «Изипаб», я там от души наелась, заказав всего самого любимого:</p><p></p><ul style="text-align: left;"><li>бородинские гренки с сырной намазкой — ммммм! И пусть я только однй гренку съела (не влезло просто), но взяла!</li><li>сырные кусочки с малиновым соусом</li><li>салатик с авокадо</li><li>биштекс с картошкой по деревенски</li><li>сладенький раф-кофе</li></ul><div>Красота!</div><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu2TTr3VKPoZc2jV2IUCdn7euCY6DckOxkOPi9aJp_trzc7zNsNfw5e3ZDtoMKOnj9PotRbjNd2eGUC7Ly0j44QVL2usm3NdZ-3RXBRwlAvklgSsP62KBRjuoPY0xckfrHVGzfPyd24hv7DRaCGclHaJa-XoMew1TSwkp6nhf5SkUsnyAC2AItoAtYbJA/s2040/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1530" data-original-width="2040" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu2TTr3VKPoZc2jV2IUCdn7euCY6DckOxkOPi9aJp_trzc7zNsNfw5e3ZDtoMKOnj9PotRbjNd2eGUC7Ly0j44QVL2usm3NdZ-3RXBRwlAvklgSsP62KBRjuoPY0xckfrHVGzfPyd24hv7DRaCGclHaJa-XoMew1TSwkp6nhf5SkUsnyAC2AItoAtYbJA/s320/1.jpg" width="320" /></a></div><div><br /></div><div>Правда, я поехала на пару часов, после чего откланялась и все же вернулась помогать няне. Но зато этот день поменял многое. Няня сказала, что может справиться и сама, и вот сейчас мы уже не всегда ей помогаем.&nbsp;</div><div><br /></div><div>Раньше то — детки собираются? Я навожу молоко, муж одевает Катю, няня Лешу... А теперь можно продолажать заниматься своими делами)))</div><div><br /></div><div>Но это пока лето и сильно одеваться не надо. Осенью, а особенно зимой, лучше помочь, чтобы детки не запарились, конечно.</div><div><br /></div><div>Ну и с прогулки обычно встречаем, и деткам, конечно, тут же надо попу на маме умостить))))</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgveOjp82knpCJXWmZuw74njw5xc-jod9hoYnFpxucahaS_Kus99-AiRyRg7js8H0BCyKnO78MdQTkNY1oifO7pmky-u53bFssJc2Er_PLGEqlqdTNM2_mlp8lbxcplFq3pD3N4CFJWD_Pm17VwqQyeLH2qnurpNITS3ABSL7Xw9TitmsqIsLf0e_aoxvQ/s1530/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1530" data-original-width="1148" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgveOjp82knpCJXWmZuw74njw5xc-jod9hoYnFpxucahaS_Kus99-AiRyRg7js8H0BCyKnO78MdQTkNY1oifO7pmky-u53bFssJc2Er_PLGEqlqdTNM2_mlp8lbxcplFq3pD3N4CFJWD_Pm17VwqQyeLH2qnurpNITS3ABSL7Xw9TitmsqIsLf0e_aoxvQ/s320/5.jpg" width="240" /></a></div><br /><div><br /></div><div><br /></div><div><br /></div><div><br /></div><b>ДР Кати!</b><div><br /></div><div>Красавице нашей уже годик! И вот она вроде только-только вставать начала, а уже чешет по всей квартире на ножках, а не на карачках)))</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtW3RF-pkFq8NAj1_dAA8vTZccMPD59c5INOyGwZ0pgP0S9Hh-BzhMeJwzzpRYvje4RGnTFMajknH-30I8nZF_3xOrLzQRLzRpPSDUgvzNlrJT0wRFZXJSoFNkbGisVuEo-OtAQ6Inh628hpfLRZYUM93yaesDMQCc3gfjnYdHnhI1mYVNPQOeXskGUTQ/s1530/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1530" data-original-width="1148" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtW3RF-pkFq8NAj1_dAA8vTZccMPD59c5INOyGwZ0pgP0S9Hh-BzhMeJwzzpRYvje4RGnTFMajknH-30I8nZF_3xOrLzQRLzRpPSDUgvzNlrJT0wRFZXJSoFNkbGisVuEo-OtAQ6Inh628hpfLRZYUM93yaesDMQCc3gfjnYdHnhI1mYVNPQOeXskGUTQ/s320/3.jpg" width="240" /></a></div><br /><div>Лишний повод для встречи с друзьями! На Лешино ДР мы особо не звали гостей, а Кате пока рано во всякие развлекательные комнаты, так что мы собрали друзей и отмечали сами))) Зато повидались с друзьями, и принцессу все потискали!</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi25YQJkpSt1HW51M3xcBpzQLjN_uWeFpe1HXq6naO94cRIrFlOxfWaKxm90oqqqbSP4fmarPeIjvRzeDq2sLLMZHTXXk9LXIVxI6UCYIiCowNpqUKsQbSLqLwmpIJkTQ3DjTFSjL4NRGhORpah1pjR9air87RaXhSkWDGra1MxAgf3TRI1YufdNmoBA1M/s1530/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1530" data-original-width="1148" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi25YQJkpSt1HW51M3xcBpzQLjN_uWeFpe1HXq6naO94cRIrFlOxfWaKxm90oqqqbSP4fmarPeIjvRzeDq2sLLMZHTXXk9LXIVxI6UCYIiCowNpqUKsQbSLqLwmpIJkTQ3DjTFSjL4NRGhORpah1pjR9air87RaXhSkWDGra1MxAgf3TRI1YufdNmoBA1M/s320/4.jpg" width="240" /></a></div><br /><div><p><br /></p><p><b>Фотосессия!</b></p><p>Ну и на фотосессию сходили. Фото на обложке поста как раз оттуда )))</p><p>Прикольно было то, что как раз там Катя делала первые шаги, жаль только, что именно эти моменты особо не захватили на фото ((( А я очень надеялась на это. Но зато там у каждого был шарик с возрастом, забавно вышло:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS_pcvoMkOAZ7EjwCua_A6cF90_yx9uCJUhI2NaXRff4nmnyu_qERbkcsmHTmR7EGxaLfFWxVFYLLAlXKjcBLyBKWyglR7cSgF9_P00muObYAiDg3oDspP_ra9AfvCk_K7JTeVGJvRs0xt1NzyXn7-hX1Js-QoXfsfrdwcXlZo8WjXIYUWA9R43XdVzK4/s1280/7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1280" data-original-width="861" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS_pcvoMkOAZ7EjwCua_A6cF90_yx9uCJUhI2NaXRff4nmnyu_qERbkcsmHTmR7EGxaLfFWxVFYLLAlXKjcBLyBKWyglR7cSgF9_P00muObYAiDg3oDspP_ra9AfvCk_K7JTeVGJvRs0xt1NzyXn7-hX1Js-QoXfsfrdwcXlZo8WjXIYUWA9R43XdVzK4/s320/7.jpg" width="215" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><p>И детки были в восторге от шариков, активно игрались с ними)))</p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjem2TIEpTWHyAHJ5ZXPJ9k5gKYuieeKzJe14cS_-Q9DSxKRUsty6ZzEpURjabEzx2SPTlYzsmikjEJfXc6CsQyyjdngbJJ-hlypkUVMEi3Ic45ySMNoX_p-4u7K7fcoEU615pb1pEcXteaNb1GxDkFKSk9E_1N4fctxEnZOp2Adb0kIy9OD3I7mU6EuCY/s1280/6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1280" data-original-width="853" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjem2TIEpTWHyAHJ5ZXPJ9k5gKYuieeKzJe14cS_-Q9DSxKRUsty6ZzEpURjabEzx2SPTlYzsmikjEJfXc6CsQyyjdngbJJ-hlypkUVMEi3Ic45ySMNoX_p-4u7K7fcoEU615pb1pEcXteaNb1GxDkFKSk9E_1N4fctxEnZOp2Adb0kIy9OD3I7mU6EuCY/s320/6.jpg" width="213" /></a></div><br /><p>Ну и в целом удобно, что у нас фотостудия недалеко, в пешей доступности, можно хотя бы раз в год устраивать такой фотосет, смотреть как детки меняются!</p><p><br /></p><p><b>Уборка</b></p><p>Не обошлось и без генеральной уборки:</p><p><br /></p><p></p><blockquote><p>Выгребла всё с антресолей, упаковали всю зиму в один кофр, который я с вб принесла, больше часа это всё разгребали!</p><p>Вычистила угол кухни с пакетами, вынесла мусор.</p><p>Разгребла вещи на вешалках в угловом шкафу.</p><p>Разгребла вещи справа от угла, и антресоль, и вешалки все перебрала.</p></blockquote><p></p><p><br /></p><p>А угловой шкаф, это в который я в полный рост помещаюсь)) В общем, капитально так подрагребла вещи, это радует!</p><p><br /></p><p><b>Театр</b></p><p>Сходили в театр — Элементарно, Хадсон.&nbsp;</p><p>До сих пор вспоминаю рыжую банду и как они играли музыку там))) Хотя прошло уже много времени!</p><p>В театр сходили как раз благодаря няне, когда она отпустила нас вместе на ДР и сказала, что может сама справиться, мы взяли билеты и вот, сходили! Замечательное шоу вышло, я очень довольна)</p><p><br /></p><p><b>Спорт</b></p><p>Занимаюсь в зале. Наш зал закрывался на время и тренировки перенесли в другой. Ходила туда пешком по полчаса, тоже мини-тренировка! В целом летом это удобно, не по дорожке унылой чтобы ходить, а гулять и наслаждаться прогулкой)))</p><p>А сейчас стала заниматься 1 раз с тренером и пытаюсь 1 раз сама прийти. Получается не всегда, так как пока сложно вписать в расписание ВООБЩЕ ВСЕ. Вот сегодня если пойду в зал, будет некогда делать детям печеньки на завтрак, поработать могу не успеть... Поэтому пока в раздумьях.</p><p>Но в целом 1-2 раза точно хожу, уже прогресс!</p><p><br /></p><h3 style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; margin: 0px; position: relative;">Проверка планов, поставленных в прошлый раз</h3><div style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><br /></div><div style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><div>Основные цели:</div><div><ul style="line-height: 1.4; list-style: disc; margin: 0.5em 0px; padding: 0px 2.5em;"><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b><b><b><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b></b></b></b>Книга по ChatGpt </b>— сдать в редактуру → сдала, и уже половину вычитали!</li><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b><b><b><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b></b></b></b>Книга по тайм-менеджменту</b> — написать 3 главы, по одной в месяц норм план! — написала 5 глав ????</li><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b>????Курсы </b>— сделать 1 тему нового курса — пока постман даже не закончила (((</li><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b><b><b><b><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b></b></b></b></b>Статья на Хабр </b>— ну хоть одну! — даже 2! ????</li></ul></div><div><br /></div><div>Найс ту ду:</div><div><ul style="line-height: 1.4; list-style: disc; margin: 0.5em 0px; padding: 0px 2.5em;"><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b><b><b><b><b><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b></b></b></b></b></b>Youtube-канал</b> — 2 шт — уменьшаем цель до реально достижимой)) — и ведь ровно 2 видео и залила!</li><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b><b><b><b><b><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b></b></b></b></b></b>Книга по Python</b> — прочитать 100 страниц — прочитала 97, но ведь прям как и хотела примерно!&nbsp;</li><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b><b><b><b><b><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b></b></b></b></b></b>Встретиться с друзьями </b>— дни рождения сильно помогли в этом))</li><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b><b><b><b><b><b><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b></b></b></b></b></b></b>Курс по постману</b> — сделать ещё 3 лекции (не верю в полную перезапись с учетом новогодних праздников и начала садика = болезней) — доделала все лекции, осталось обновить то, что вновь неактуально)</li></ul></div></div><div style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><br /></div><div style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><h3 style="margin: 0px; position: relative;"><br /></h3><h3 style="margin: 0px; position: relative;">Планы на следующие 12 недель</h3><div><br /></div><div>Основные цели:</div><div><ul style="line-height: 1.4; list-style: disc; margin: 0.5em 0px; padding: 0px 2.5em;"><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b>Книга по ChatGpt </b>— закончить редактуру</li><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b>Книга по тайм-менеджменту</b> — написать 3 главы, по одной в месяц норм план!</li><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b>Курсы </b>— закончить с постманом уже!</li><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b>Курсы </b>— сделать 1 тему нового курса</li><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b>Статья на Хабр </b>— ну хоть одну!&nbsp;</li></ul></div><div><br /></div><div>Найс ту ду:</div><div><ul style="line-height: 1.4; list-style: disc; margin: 0.5em 0px; padding: 0px 2.5em;"><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b>Youtube-канал</b> — 2 шт&nbsp;</li><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b>Книга по Python</b> — прочитать 100 страниц (хочется снова к ней вернуться)</li><li style="border-color: currentcolor; border-image: none; border-style: none; border-width: medium; margin: 0px 0px 0.25em; padding: 0px;"><b>Встретиться с друзьями&nbsp;</b></li></ul><div><br /></div><div><br /></div></div></div><h3 style="text-align: left;">Резюме</h3><p>Я каждый раз так поражаюсь, перечитывая начало файла с результатами — как?! Это было в этом цикле?!! Офигеть!!!</p><p>Смена нянь была, кажется, так давно... Как хорошо, что это уже в прошлом! И как круто, что столько всего успела, несмотря на смену нянь, болезни и все прочее.</p><p>Я думаю, отличный вышел результат, а дальше будет только лучше!</p></div>]]></description>
<link>http://okiseleva.blogspot.com/2026/07/12-34-1-2.html</link>
<pubDate>Mon, 27 Jul 2026 08:44:07 +0300</pubDate>
</item>
<item>
<title>Рефакторинг кода RestAssured.Net с Claude Code</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/claude-code.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/claude-code.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Баз Дейкстра (Bas Dijkstra)<br /><strong><a href="https://www.ontestautomation.com/refactoring-the-rest-assured-net-code-with-claude-code/" mce_href="https://www.ontestautomation.com/refactoring-the-rest-assured-net-code-with-claude-code/" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод: </strong>Ольга Алифанова</p><p>Как некоторые из вас, вероятно, знают, воркшопы и обучающие курсы, которые я провожу, выступления, которые делаю, и статьи, которые пишу, как правило, сосредоточены на фундаментальных навыках тестирования ПО, разработки и автоматизации тестирования, а не на <a href="https://software-testing.ru/library/testing/general-testing/4116-some-perspective-on-testing-trends" mce_href="https://software-testing.ru/library/testing/general-testing/4116-some-perspective-on-testing-trends">последних технологиях и трендах</a>. Я просто не очень-то «работаю» с трендами. Тем не менее, я много читаю о том, что думают и пишут по поводу этих технологий другие, поскольку я независимый консультант и просто не могу позволить себе не следить за тем, что происходит в индустрии.</p><p>До недавнего времени я в основном избегал активного использования инструментов ИИ, за исключением ChatGPT, который помог мне составить персональный план тренировок на выносливость для велоспорта. Так было до тех пор, пока я не начал всё чаще слышать, как люди обсуждают Claude Code и насколько он хорош, особенно с новой моделью Opus 4.6. Это подтолкнуло меня проверить самому, действительно ли он полезен, и эта статья, вероятно, первая из цикла, где я буду делиться своими наблюдениями и выводами.</p>
<p>Конечно, можно было бы начать с создания чего-то с нуля (или «vibe coding», как сейчас модно говорить), но мне не кажется, что это хороший способ понять, что именно ИИ может дать для моей работы. В конце концов, я не занимаюсь созданием принципиально новых вещей, а помогаю людям выполнять уже существующие и важные задачи — в моём случае это тестирование и автоматизация — лучше и эффективнее.</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-tools/4501-claude-code</link>
<pubDate>Sun, 26 Jul 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Анализируем данные в файле с помощью ИИ</title>
<description><![CDATA[<p><span style="font-family: Arial, sans-serif; font-size: 11pt; white-space: pre-wrap;">Тестирую задачу на поиск дубликатов. Дубликаты определяются по конкретным правилам, и коэффициент соответствия зависит от того, попадает ли фамилия / имя / отчество в соответствующий справочник, или нет.</span></p><span id="docs-internal-guid-2c31840c-7fff-b0f4-2b9f-79830d5f2213"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">А еще в компонентах ФИО бывают опечатки, и это тоже влияет на коэффициент. А длина компонента на это влиять, наоборот, НЕ должна…</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">В общем, для тестирования мне нужно проанализировать справочник фамилий и набрать себе оттуда тестовых данных под разные сценарии — короткая фамилия, длинная, и так далее.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Раньше мне нужно было бы изучать это все на глаз или размышлять, как самой написать код. Но сейчас эту работу можно отдать ИИ! Причем я пошла к обычному текстовому чату с моими вопросами (а не к Курсору), и его вполне хватило.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLzkoVjOZqujQgVt9TIaS9ZbkR7Z2oHcnRfTOau7Cg816YKDOZUe3j-HXcwkoUaKgYo-sTpCyrkU7NPoTEn2IMsbDEUwiw9GI-hQErS9ertqTqhWu7KPGSzsd46FQ0sIeW52PCkflfZXI9h4-MKY0FnHQ47wj4xOjcijydWJS5w1NxW2MXjg3u_Kc1cWk/s320/4_1_Anna_%D0%9D%D0%B5%20%D0%B1%D0%BE%D0%B9%D1%81%D1%8F,%20%D1%8F%20%D1%82%D0%B5%D0%B1%D0%B5%20%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D1%83.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="266" data-original-width="320" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLzkoVjOZqujQgVt9TIaS9ZbkR7Z2oHcnRfTOau7Cg816YKDOZUe3j-HXcwkoUaKgYo-sTpCyrkU7NPoTEn2IMsbDEUwiw9GI-hQErS9ertqTqhWu7KPGSzsd46FQ0sIeW52PCkflfZXI9h4-MKY0FnHQ47wj4xOjcijydWJS5w1NxW2MXjg3u_Kc1cWk/s320/4_1_Anna_%D0%9D%D0%B5%20%D0%B1%D0%BE%D0%B9%D1%81%D1%8F,%20%D1%8F%20%D1%82%D0%B5%D0%B1%D0%B5%20%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D1%83.png" width="320" /></a></div><br /><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span></span></p><a name='more'></a></span><p></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Сначала я решила поискать самое длинное значение в справочнике. Справочник фамилий очень большой (вы себе даже не представляете, насколько они разнообразны!), так что я решила подсветить ИИ его вес, вдруг это важно:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">У меня есть файл на 17 мб, в нем данные вида (</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-style: italic; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">структура справочника изменена для статьи, но смысл отражает</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">):</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">НАЗИН;М;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">НАЗИНА;Ж;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Как табличка в несколько колонок. Как мне найти самое длинное значение в первое колонке?</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">У меня винда, греп не установлен, через winget есть аналоги нынче? или надо поставить цигвин?</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Ну да, раньше я анализировала файлы с помощью регулярных выражений и Cygwin, ещё до ИИ новомодных! Правда, файлики были поменьше размером, что тоже влияло. В общем, Cygwin чатик высмеял и предложил другие решения (</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-style: italic; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">ответ сокращен</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">):</span></p><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Ставить Cygwin в 2026 году точно не нужно — это тяжелое и устаревшее решение.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Поскольку у вас 17 МБ (это очень маленький объем для современных ПК) и уже открыта </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Giga IDE</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">, а на Windows есть встроенный </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">PowerShell</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">, решить эту задачу можно моментально и без установки лишнего софта.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Вот 3 простых и быстрых способа на выбор:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">——————————</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Способ 1. Написать 4 строчки кода прямо в IDE (Самый быстрый и удобный)</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">…</span></p><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">——————————</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Способ 2. Через встроенный Windows PowerShell (Без установки программ)</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">В Windows есть мощная консоль PowerShell, которая справится с этим в одну строчку.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">1. Откройте поиск Windows, введите PowerShell и запустите его.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">2. Скопируйте и выполните следующую команду (замените путь к файлу):</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Get-Content "C:\path\to\your\file.txt" | ForEach-Object { $_.Split(';')[0] } | Sort-Object Length -Descending | Select-Object -First 5</span></p><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Что делает эта команда:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Она читает файл, разбивает каждую строчку по </span><span style="color: #188038; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">;</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">, берет первый элемент, сортирует всё по длине от большего к меньшему и выводит топ-5 самых длинных значений (на случай, если будет несколько одинаковых по длине). Для файла 17 МБ это займет около 3–5 секунд.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">——————————</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Способ 3. Через Git Bash (Если вы ставили Git)</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">…</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Меня, конечно, заинтересовал первый способ, создать Scratch File в IDE и запустить его. Вот только он у меня не завелся, ошибку отдала чату, он вроде переписал, и снова не сработало…</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Я решила не тратить на это время и попробовала вариант с PowerShell. И ведь сработало же! Тогда я пошла искать нижнюю границу:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-style: italic; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">(цитирую способ 2, общалась с телеграм-ботом)&nbsp;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">хороший способ! а самую короткую запись как найти?</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Чатик и такой вариант написал, и разжевал все изменения:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Вариант для PowerShell (Топ-5 самых коротких, без пустых)</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Скопируйте и вставьте эту команду в синее окно PowerShell:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Get-Content "C:\path\to\your\file.txt" | ForEach-Object { $_.Split(';')[0].Trim() } | Where-Object { $_ -ne "" } | Sort-Object Length | Select-Object -First 5</span></p><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Что изменилось:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">1. Добавилось </span><span style="color: #188038; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">.Trim()</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"> — убирает случайные пробелы по краям.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">2. Добавился блок </span><span style="color: #188038; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Where-Object { $_ -ne "" }</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"> — он </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">выкидывает пустые значения</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">, чтобы они не мешались в топе.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">3. Из </span><span style="color: #188038; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Sort-Object</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"> убрали </span><span style="color: #188038; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">-Descending</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"> — теперь первыми идут самые короткие слова.</span></p><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Потом мне понадобилось немного усложнить логику:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">А если я хочу самое длинное первое слово среди тех, у кого в 3 колонке было значение "1"?</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">И снова скрипт на PowerShell отлично сработал. Также для проверки граничных значений мне надо было найти данные ровно на 6 символов, и тут чат помог:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Напиши скрипт, который выведет 10 первых строк файла, у которого в 1 ячейке 6 символов. И как его исправить, чтобы было меньше 4 символов? </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-style: italic; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">(это я решила сразу другую границу проверить)</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">А потом мне надо было найти путаницу букв, анаграммы. И при этом чтобы оба значения были справочные. Сначала я сходила к Курсору:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Можешь открыть файл C:\tmp\test.csv и найти там все строки, в которых в первой ячейке ПОЧТИ одинаковые данные, но буквы перепутаны местами?&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Например ШУМИЛИНА и ШУЛИМИНА обе есть в этом файле, расстояние - 1 буква. Я хочу видеть все такие строки и столько у каждой расстояние перепутанных букв (включая расстояние 0)</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Посмотрела, что он там пишет, а он написал:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Думаю, как сделать… Тут нужен скрипт на питоне! Пишу скрипт… Ой, питона нету, хм хм, тогда сделаю через PowerShell…</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Сделал, но немного не так, как мне бы хотелось. А токенов при этом выжрал ой-ей-ей! Поэтому я попробовала запросить скрипт у обычного чатика и вернулась к телеграм-боту.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Но для начала я установила питон, ведь ИИ сказал, что на нем будет лучше всего выполнить задачу. Потом уже пошла к боту:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Как мне найти все анаграммы в файле C:\tmp\fname.csv?</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Структура айла:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">ГАДАВИЯ;Ж;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">ГАДАД;М;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">То есть чтобы значение во второй ячейке (М/Ж) совпадало и слово в первой ячейке тоже совпадало, но у него 2 буквы перепутаны местами. Но чтобы оба слова при этом были из файла!</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Разбить ответ надо по расстоянию между перепутанными буквами: соседние буквы поменяли местами, через одну, и так далее.</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Через питон или павершелл</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">И ведь не зря питон поставила! Вот что сказал чат:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Для решения этой задачи </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Python</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"> подходит идеально. Написать такой алгоритм на PowerShell можно, но он будет работать значительно медленнее и код получится очень громоздким. На Python мы можем применить хитрую оптимизацию, благодаря которой скрипт найдет все пары за </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">долю секунды</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Python-скрипт</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Создайте на компьютере файл, например </span><span style="color: #188038; font-family: &quot;Roboto Mono&quot;, monospace; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">find_anagrams.py</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">, и вставьте в него следующий код:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">…</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Как запустить этот скрипт на Windows:</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"> …</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Что вы получите на выходе?</span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"> …</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Скрипт отработал на ура, столько данных мне собрал, сколько я бы никогда не наскребла вручную! А уж сколько нового я узнала о фамилиях и именах )))</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Потом я пошла тестировать дальше. И мне понадобились новые кейсы — когда оба значения справочные, но есть опечатка или пропуск буквы. И снова поиск таких данных вручную занял бы кучу времени, так что я пошла к ИИ, начать решила с пропуска:</span></p><br /><br /><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Напиши скрипт (питон или павершелл), который найдет в файле такие строки, где в первой ячейке одно и то же слово, но в одной из ячеек пропущена 1 буква — то есть одно слово включает в себя другое, но длиннее на 1 символ, но этот пропущенный символ может быть даже в середине строки.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">И вот уже он выдает мне скрипт на питоне! А потом дошли до опечаток:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Напиши скрипт (питон или павершелл), который найдет в файле такие строки, где в первой ячейке одно и то же слово, и ровно 1 символ у них отличается. Результат отсортировать по длине строки.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">ИИ и тут помог, выдав очередной скрипт на питоне. Вот только этот скрипт работал подозрительно долго, искал и искал данные, я уже чай попила, другие задачки поделала… Так и написала боту:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Этот скрипт ищет пары уже полчаса</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">И бот выдал мне оптимизированную версию!</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Ваш скрипт «завис», потому что даже с группировкой по длине, если в файле много слов одной длины (например, 100 000 имен длиной 7 символов), количество сравнений внутри этой группы всё равно остается огромным (N^2).</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Чтобы ускорить поиск пар с расстоянием Левенштейна = 1 для 3 миллионов строк, нужно отказаться от «честного» сравнения каждого с каждым. </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Используйте хеширование (метод «удаления одного символа»): </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">…</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Идея алгоритма: </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">…</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Оптимизированный скрипт: </span><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">…</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Потом я искала две опечатки и сразу указала в промпте, чтобы оптимизировал свой вариант:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Напиши скрипт (питон или павершелл), который найдет в файле такие строки, где в первой ячейке одно и то же слово, и ровно 2 символа у них отличаются. Результат отсортировать по длине строки, но чтобы работал не полчаса. В файле много строк, оптимизируй скрипт под это условие</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">И снова результат готов меньше, чем за минуту!</span></p><br /><br /><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial, sans-serif; font-size: 16pt; font-variant: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Итого</span></h2><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">ИИ — просто незаменимый помощник в работе! Я с его то помощью пару дней анализировала данные и составляла тест-кейсы, а сколько бы времени потратила без него?</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Мне все равно бы понадобилась автоматизация, чтобы найти граничные значения или тестовые данные “надо, чтобы она значения были в файле, но…”. Вот только сама бы я писала бы эти скрипты не пару минут, а пару часов каждый. И это в лучшем случае!</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial, sans-serif; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">По крайней мере те громоздкие питон-скрипты, с павершеллом и гуглом я бы справилась быстрее. Но в языке программирования помощь ИИ была просто спасением!</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><i style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">PS — эта статья написана в помощь студентам моего курса «</i><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><i><a href="https://testbase.ru/learn/chatgpt" style="color: #336699; text-decoration: none;" target="_blank">Применение ChatGPT в тестировании</a>»</i></span></p>]]></description>
<link>http://okiseleva.blogspot.com/2026/07/blog-post_24.html</link>
<pubDate>Fri, 24 Jul 2026 17:02:37 +0300</pubDate>
</item>
<item>
<title>Используете ИИ для написания кода? Объясняем, как его  правильно тестировать</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p>ИИ теперь пишет код быстрее разработчиков. По данным <a href="https://vmblog.com/news/new-relic-report-reveals-ai-generated-code-grades-higher-in-review-yet-triggers-rise-in-production-incidents/" rel="nofollow">New Relic</a>, <span class='font-weight-bold'>две трети</span> технических лидеров говорят, что нейросети уже создают или улучшают больше половины их еженедельного объёма кода. А <span class='font-weight-bold'>88% компаний</span> разрешили применять ИИ не для тестов, а в реальной работе. Скорость разработки выросла, но главная проблема теперь не в том, чтобы написать код, а в том, чтобы быть уверенным: его можно спокойно запускать в прод.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Исследование <a href="https://venturebeat.com/technology/43-of-ai-generated-code-changes-need-debugging-in-production-survey-finds" rel="nofollow">Lightrun</a> показало: почти <span class='font-weight-bold'>в половине случаев</span> код, который сделал ИИ, приходится править вручную уже после запуска – даже если до этого его проверили и протестировали. А громкий случай с <a href="https://venturebeat.com/technology/43-of-ai-generated-code-changes-need-debugging-in-production-survey-finds" rel="nofollow">Amazon</a> весной 2026 года (там из‑за изменений от ИИ случились сбои, которые привели к потере миллионов заказов) <span class='font-weight-bold'>заставили многих руководителей задуматься: если код всё чаще делает машина, можно ли проверять его так же, как человеческий? </span>Похоже, уже нельзя. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"id":30772,"sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-2-Photoroom_11zon.png" alt="Тестирование кода, созданного с помощью ИИ" class="wp-image-30772" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-2-Photoroom_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-2-Photoroom_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-2-Photoroom_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-2-Photoroom_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Мне стало интересно разобраться. В итоге я собрал лонгрид со статистикой, исследованиями и разборами инцидентов. Я тестировщик, которому интересно, что внедрять здесь и сейчас, так что где‑то мог переборщить с выводами. <br><br><span class='font-weight-bold'>Предупреждаю сразу – это очень объёмный материал. Добавьте в закладки, чтобы возвращаться, если не получится прочитать в один присест.</span></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Часть первая: аналитика</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>New Relic вместе с Hanover Research опросили американских техлидов. <span class='font-weight-bold'>94%</span> считают ИИ-код качественнее, чем человеческий. Но после релиза картина меняется.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="max-width:900px;font-family:Arial,Helvetica,sans-serif;color:#222;">
<h2 style="margin:0 0 8px;font-size:30px;font-weight:700;">
Что происходит после деплоя ИИ-кода<br />
</h2>
<p style="margin:0 0 30px;color:#666;font-size:16px;">
Опрос технических руководителей (New Relic × Hanover Research, 2026)
</p>
<table style="width:100%;border-collapse:separate;border-spacing:0 16px;">
<tr>
<td style="width:45%;padding-right:20px;font-weight:bold;vertical-align:middle;">
Рост времени сеньоров на устранение инцидентов
</td>
<td style="width:55%;vertical-align:middle;">
<div style="background:#ececec;border-radius:8px;height:36px;">
<div style="background:#E53935;width:86%;height:36px;border-radius:8px;color:#fff;font-weight:bold;text-align:right;line-height:36px;padding-right:12px;box-sizing:border-box;">
86%
</div>
</div>
</td>
</tr>
<tr>
<td style="padding-right:20px;font-weight:bold;">
Хотя бы один серьёзный отказ продакшена за последние 6 месяцев
</td>
<td>
<div style="background:#ececec;border-radius:8px;height:36px;">
<div style="background:#FB8C00;width:82%;height:36px;border-radius:8px;color:#fff;font-weight:bold;text-align:right;line-height:36px;padding-right:12px;box-sizing:border-box;">
82%
</div>
</div>
</td>
</tr>
<tr>
<td style="padding-right:20px;font-weight:bold;">
Рост числа инцидентов в продакшене, связанных с ИИ-кодом
</td>
<td>
<div style="background:#ececec;border-radius:8px;height:36px;">
<div style="background:#F9A825;width:78%;height:36px;border-radius:8px;color:#fff;font-weight:bold;text-align:right;line-height:36px;padding-right:12px;box-sizing:border-box;">
78%
</div>
</div>
</td>
</tr>
<tr>
<td style="padding-right:20px;font-weight:bold;">
Минимум четверть ИИ-кода требует серьёзной переработки
</td>
<td>
<div style="background:#ececec;border-radius:8px;height:36px;">
<div style="background:#1E88E5;width:74%;height:36px;border-radius:8px;color:#fff;font-weight:bold;text-align:right;line-height:36px;padding-right:12px;box-sizing:border-box;">
74%
</div>
</div>
</td>
</tr>
<tr>
<td style="padding-right:20px;font-weight:bold;">
Не столкнулись с подобными проблемами
</td>
<td>
<div style="background:#ececec;border-radius:8px;height:36px;">
<div style="background:#43A047;width:19%;height:36px;border-radius:8px;color:#fff;font-weight:bold;text-align:right;line-height:36px;padding-right:12px;box-sizing:border-box;">
19%
</div>
</div>
</td>
</tr>
</table>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dbeded"}}} --></p>
<p class="has-background" style="background-color:#dbeded"><em><span class='font-weight-bold'>Объяснение простое, но неприятное. </span>LLM отлично проходит обычные проверки на ревью: у кода предсказуемые паттерны, ровный стиль, нет синтаксических ошибок, имена переменных аккуратные. <a href="https://quality-lab.ru/blog/kakie-zadachi-v-testirovanii-pora-otdat-ii-chtoby-poluchit-rezultat-a-ne-novye-problemy/" data-type="post" data-id="30207">Нейросеть</a> просто умеет генерировать текст, который выглядит правильно. А процесс ревью как раз заточен на то, чтобы ловить то, что выглядит неправильно. Получается, он работает как детектор, который запросто пропускает красивую и правдоподобную ложь.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Важное уточнение!</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Примерно половина исследований, которые мне удалось найти по теме, продают решение ровно той проблемы, которую измеряют. Sonar продаёт верификацию – и обнаруживает «кризис верификации». New Relic продаёт обсервабилити – и обнаруживает, что обсервабилити стал обязательным минимумом. CodeRabbit продаёт ревью – и доказывет, что ИИ-код надо ревьюить в 1,7 раза внимательнее.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Самый честный пример – в том же отчёте Sonar: пользователи SonarQube, оказывается, <span class='font-weight-bold'>на 44% реже сталкиваются с отказами прода из-за ИИ-кода</span>. Может, и правда. Но эту цифру измерял тот, кто продаёт SonarQube.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Это не значит, что цифры врут: выводы слишком перекликаются между несвязанными друг с другом источниками. Но оговорку я сделать был должен.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Сколько кода в компаниях пишет ИИ?</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><a href="https://www.sonarsource.com/state-of-code-developer-survey-report.pdf" rel="nofollow">Sonar</a> опросил <span class='font-weight-bold'>1149</span> разработчиков в январе 2026 года: <span class='font-weight-bold'>42% коммитимого кода – это либо генерация ИИ, либо серьёзная помощь от него</span>. К 2027 году этот показатель, по прогнозам, <span class='font-weight-bold'>вырастет до 65%</span>. При этом <span class='font-weight-bold'>72% тех, кто пробовал ИИ, используют его каждый день</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>По данным New Relic, <span class='font-weight-bold'>67%</span> технических лидеров говорят, что ИИ генерирует или серьёзно перерабатывает <span class='font-weight-bold'>от 51% до 75%</span> недельного объёма кода в их организациях.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Мировые IT-гиганты в публичных заявлениях звучат ещё более впечатляюще: <span class='font-weight-bold'>Microsoft говорит примерно о 30% кодовой базы, Google – о 75% продакшн‑кода.</span> К такой статистике я отношусь с долей скепсиса: «ИИ коснулся кода» и «ИИ его написал» – это не одно и то же, а в пресс‑релизах эти вещи часто смешивают. <span class='font-weight-bold'>Но даже если снизить цифры вдвое, вывод остаётся тем же: процент машинного кода продолжает увеличиваться.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>По данным Sonar, проблема звучит особенно чётко: <span class='font-weight-bold'>96% разработчиков</span> не доверяют полной корректности кода, который пишет ИИ, но при этом только <span class='font-weight-bold'>48% всегда проверяют его перед коммитом</span>. Получается разрыв в <span class='font-weight-bold'>48 пунктов</span> между тем, что люди думают, и тем, что реально делают.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Ещё один важный, но часто упускаемый из виду факт: <span class='font-weight-bold'>53% разработчиков</span> считают, что <span class='font-weight-bold'>ИИ увеличивает их технический долг</span>. Причина в том, что такой код выглядит правильным, но на деле оказывается ненадёжным.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Вернер Фогельс, CTO AWS, называет это <span class='font-weight-bold'>verification debt</span> – это <span class='font-weight-bold'>время, которое приходится тратить, чтобы разобраться в коде, который ты сам не писал</span>. Сегодня это фактически главный навык в профессии. Опрос Sonar показал: <span class='font-weight-bold'>на первое место среди важнейших умений в эпоху ИИ участники ставят «ревью и валидацию ИИ‑кода» (47%)</span>, а не «умение грамотно составлять промпты» (42%).</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Что происходит с самим кодом?</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Моё любимое </span><a href="https://www.gitclear.com/recent_ai_developer_productivity_code_quality_research" rel="nofollow"><span class='font-weight-bold'>исследование</span></a><span class='font-weight-bold'>, потому что это не опрос. GitClear и GitKraken проанализировали 623 млн реальных изменений кода за 2023–2026. </span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<table style="width:100%;border-collapse:collapse;font-family:Arial,Helvetica,sans-serif;font-size:15px;line-height:1.5;border:1px solid #ddd;background:#fff;">
<thead>
<tr style="background:#202124;color:#fff;">
<th style="padding:14px;text-align:left;border:1px solid #202124;">Метрика</th>
<th style="padding:14px;text-align:center;border:1px solid #202124;width:140px;">Изменение</th>
<th style="padding:14px;text-align:left;border:1px solid #202124;">Что изменилось</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px;border:1px solid #e5e5e5;"><span class='font-weight-bold'>Дублирование блоков кода (5+ повторяющихся строк)</span></td>
<td style="padding:14px;text-align:center;border:1px solid #e5e5e5;">
<span style="display:inline-block;background:#FDE8E7;color:#C62828;padding:4px 10px;border-radius:14px;font-weight:bold;">▲ +81%</span>
</td>
<td style="padding:14px;border:1px solid #e5e5e5;">
с <span class='font-weight-bold'>40,3</span> до <span class='font-weight-bold'>73,0</span> на миллион изменённых строк. Максимальное значение за всю историю наблюдений.
</td>
</tr>
<tr style="background:#fafafa;">
<td style="padding:14px;border:1px solid #e5e5e5;"><span class='font-weight-bold'>Copy/Paste внутри коммита</span></td>
<td style="padding:14px;text-align:center;border:1px solid #e5e5e5;">
<span style="display:inline-block;background:#FDE8E7;color:#C62828;padding:4px 10px;border-radius:14px;font-weight:bold;">▲ +41%</span>
</td>
<td style="padding:14px;border:1px solid #e5e5e5;">
Разработчики значительно чаще копируют уже существующие участки кода.
</td>
</tr>
<tr>
<td style="padding:14px;border:1px solid #e5e5e5;"><span class='font-weight-bold'>Конструкции, маскирующие ошибки</span></td>
<td style="padding:14px;text-align:center;border:1px solid #e5e5e5;">
<span style="display:inline-block;background:#FDE8E7;color:#C62828;padding:4px 10px;border-radius:14px;font-weight:bold;">▲ +47%</span>
</td>
<td style="padding:14px;border:1px solid #e5e5e5;">
Количество потенциально опасных конструкций выросло почти в полтора раза.
</td>
</tr>
<tr style="background:#fafafa;">
<td style="padding:14px;border:1px solid #e5e5e5;"><span class='font-weight-bold'>Двухнедельный churn</span></td>
<td style="padding:14px;text-align:center;border:1px solid #e5e5e5;">
<span style="display:inline-block;background:#FDE8E7;color:#C62828;padding:4px 10px;border-radius:14px;font-weight:bold;">▲ +15%</span>
</td>
<td style="padding:14px;border:1px solid #e5e5e5;">
Код чаще переписывается вскоре после первоначального изменения.
</td>
</tr>
<tr>
<td style="padding:14px;border:1px solid #e5e5e5;"><span class='font-weight-bold'>Перемещённый код (рефакторинг)</span></td>
<td style="padding:14px;text-align:center;border:1px solid #e5e5e5;">
<span style="display:inline-block;background:#E8F5E9;color:#2E7D32;padding:4px 10px;border-radius:14px;font-weight:bold;">▼ −70%</span>
</td>
<td style="padding:14px;border:1px solid #e5e5e5;">
Доля изменённых строк снизилась с <span class='font-weight-bold'>13%</span> до <span class='font-weight-bold'>3,8%</span>.
</td>
</tr>
<tr style="background:#fafafa;">
<td style="padding:14px;border:1px solid #e5e5e5;"><span class='font-weight-bold'>Межфайловые вызовы функций</span></td>
<td style="padding:14px;text-align:center;border:1px solid #e5e5e5;">
<span style="display:inline-block;background:#E8F5E9;color:#2E7D32;padding:4px 10px;border-radius:14px;font-weight:bold;">▼ −35%</span>
</td>
<td style="padding:14px;border:1px solid #e5e5e5;">
С <span class='font-weight-bold'>343</span> до <span class='font-weight-bold'>223</span> вызовов на тысячу изменённых строк.
</td>
</tr>
<tr>
<td style="padding:14px;border:1px solid #e5e5e5;"><span class='font-weight-bold'>Работа с legacy-кодом</span></td>
<td style="padding:14px;text-align:center;border:1px solid #e5e5e5;">
<span style="display:inline-block;background:#E8F5E9;color:#2E7D32;padding:4px 10px;border-radius:14px;font-weight:bold;">▼ −74%</span>
</td>
<td style="padding:14px;border:1px solid #e5e5e5;">
С <span class='font-weight-bold'>1,7%</span> до <span class='font-weight-bold'>0,46%</span> изменений в коде, которого не касались больше года.
</td>
</tr>
</tbody>
</table>
<p style="margin-top:20px;font-size:15px;line-height:1.6;color:#555;">
<span class='font-weight-bold'>Вывод.</span> По сравнению с 2023 годом команды чаще дублируют код и используют copy/paste, но значительно реже занимаются рефакторингом, переиспользованием компонентов и улучшением legacy-кода. Это увеличивает технический долг и усложняет сопровождение проектов.
</p>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Хочу сделать пару оговорок – эти цифры в интернете часто перевирают, я и сам чуть не допустил ошибку.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Во‑первых, <span class='font-weight-bold'>часть популярных данных вообще из другого отчёта</span>. Например, фразы вроде «<span class='font-weight-bold'>копипаст вырос с 9,4% до 15,7%</span>» или «п<span class='font-weight-bold'>еремещённый код упал с 21%</span>» сравнивают показатели <span class='font-weight-bold'>с 2022 годом</span>, а он не входит в диапазон 2023–2026 годов. Эти цифры пришли из более раннего <a href="https://www.gitclear.com/coding_on_copilot_data_shows_ais_downward_pressure_on_code_quality" rel="nofollow">отчёта</a> GitClear «Coding on Copilot». Не стоит смешивать их в одном предложении: скажем, снижение рефакторинга на 70% считается от 13% (2023 год), а не от 21% (2022 год). Если считать от 21%, то падение вышло бы уже 82%.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Во‑вторых, и это важнее, GitClear заявляет, что <span class='font-weight-bold'>разработчики теперь «примерно в 5 раз охотнее продублируют код, чем отрефакторят»</span>. Но если взять их же цифры – 15,7 разделить на 3,8, – получится 4,1, а не 5. Либо в самом отчёте используется другая метрика, либо это просто округление в удобную сторону. При этом общий тренд реален: в 2022 году, по тем же данным, соотношение было обратным – 2:1 в пользу рефакторинга. Так что всегда проверяйте цифры, даже в исследованиях, которым доверяете.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Билл Хардинг, CEO GitClear, объясняет, как в коде прячутся ошибки: главная цель модели – удовлетворить промпт. Чтобы правильно обработать возможные ошибки, нужно заранее предусмотреть разные варианты входных данных – а это требует времени и токенов. Проще пойти коротким путём и написать код, который никогда не выбросит исключение. Так и появляются пустые catch‑блоки, которые молча «съедают» все проблемы.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>И ещё одна цифра, чтобы не завышать ожидания:<span class='font-weight-bold'> активные пользователи ИИ пишут в 4–10 раз больше кода, чем те, кто нейросети не использует.</span> Но значительная часть этой разницы существовала ещё до появления нейронок – просто это изначально более продуктивные разработчики. Если сравнивать их с самими собой год назад, реальный прирост составит примерно <span class='font-weight-bold'>25%</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Что происходит с безопасностью ИИ-кода?</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><a href="https://www.veracode.com/blog/spring-2026-genai-code-security/" rel="nofollow">Veracode</a> несколько лет подряд проверяет один и тот же набор из <span class='font-weight-bold'>80 задач с потенциальными уязвимостями на более чем 100 моделях</span>. Результаты весны 2026 года говорят сами за себя: <span class='font-weight-bold'>синтаксическая корректность выросла с примерно 50% до 95%, а вот уровень безопасности почти не изменился – security pass rate остался на уровне около 55%</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Проще говоря, модели научились писать код, который компилируется, но так и не научились делать его безопасным. И навороченность модели тут почти ни при чём: <span class='font-weight-bold'>будь то 20 миллиардов параметров или 400 – результат крутится вокруг тех же 55%</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Детали показательны: если в промпте нет чётких требований по безопасности, <span class='font-weight-bold'>в 45% задач ИИ добавляет уязвимость из OWASP Top 10</span>. Хуже всего дела обстоят с <span class='font-weight-bold'>Java</span> – там проваливают около <span class='font-weight-bold'>72% тестов</span>. Особенно плохо с XSS: в 86% подходящих случаев защита не срабатывает. Причина проста: чтобы защититься от XSS, нужно понимать контекст всего приложения, а нейронка видит лишь небольшой фрагмент.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Йенс Весслинг, CTO Veracode, точно подмечает суть явления «вайб‑кодинга»: разработчику не приходится специально прописывать требования к безопасности – он просто хочет получить рабочий код. В итоге решение о безопасности по умолчанию ложится на нейросеть, которая опирается на усреднённые данные из интернета.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">А что по галлюцинированию нейросетей?</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>В <a href="https://www.usenix.org/conference/usenixsecurity25/presentation/spracklen" rel="nofollow">исследовании</a> «We Have a Package for You!» (USENIX Security 2025) проверили <span class='font-weight-bold'>16 моделей на 2,23 млн примерах кода на Python и JavaScript</span>. Выяснилось, что <span class='font-weight-bold'>19,7%</span> рекомендованных пакетов просто не существуют – всего насчитали <span class='font-weight-bold'>205 474 выдуманных имён</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Самое тревожное: <a href="https://quality-lab.ru/blog/ii-v-testirovanii-po-2025-primenenie-rabochie-ai-instrumenty-v-rossii-i-budushhee-qa/" data-type="post" data-id="27556">галлюцинации</a> моделей <span class='font-weight-bold'>повторяются</span>. Если один и тот же промпт запустить 10 раз, в 43% случаев одни и те же придуманные пакеты появятся во всех десяти попытках. Такие имена можно заранее предсказать, зарегистрировать в npm или PyPI. Это и есть слопсквоттинг . И это не теория: например, пакет‑пустышка huggingface‑cli – без кода, README и SEO – за три месяца скачали больше 30 тысяч раз.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Апдейт 2026 года (arXiv:2605.17062) даёт смешанные новости. <span class='font-weight-bold'>С одной стороны, разброс ошибок уменьшился – с 5,2–21,7% до 4,62–6,10%. С другой – выяснилось, что 127 имён пакетов (109 в PyPI и 18 в npm) одинаково «придумывают» все пять протестированных моделей</span>. И вот это по-настоящему опасно. Единый набор выдуманных имён, который видят все модели, – это уязвимая зона, которую не получится выявить, проверяя только одну из них. Даже если взять другую LLM, это не поможет: у моделей схожие слепые зоны.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Ненадёжное исследование, которое обнажило истину</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Июль 2025-го, рандомизированное контролируемое испытание от <a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/" rel="nofollow">METR</a>. <span class='font-weight-bold'>Шестнадцать опытных разработчиков с опенсорс‑проектов решали 246 реальных задач в своих зрелых репозиториях.</span> Оказалось, что <span class='font-weight-bold'>с ИИ они тратили на 19% больше времени</span>. При этом до эксперимента разработчики <span class='font-weight-bold'>думали, что станут работать быстрее на 24%, а после, уже столкнувшись с замедлением, оценивали свой прирост продуктивности в 20%</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Позже METR признали проблему с методологией. Те разработчики, кому ИИ действительно помогал, не хотели участвовать в экспериментах без него – даже за 50 долларов в час. Из‑за такой выборки результаты исказились. Сейчас METR считают данные за 2025 год историческими, а свою обновлённую позицию формулируют просто: «<span class='font-weight-bold'>Мы не знаем, ускоряет ли ИИ разработчиков</span>».</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dbeded"}}} --></p>
<p class="has-background" style="background-color:#dbeded"><em><span class='font-weight-bold'>Вывод. </span>Смысл тут не в цифре <span class='font-weight-bold'>19%</span> – она уже не считается надёжной. Важнее разрыв в <span class='font-weight-bold'>39 пунктов между тем, что люди чувствуют, и тем, что показывают замеры</span>. Даже если ИИ и правда ускоряет работу, собственная оценка продуктивности больше не может служить точным ориентиром. Фраза «стало быстрее» теперь – не данные, а просто ощущение.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Чем приходится платить за скорость разработки?</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><a href="https://www.faros.ai/research/ai-acceleration-whiplash" rel="nofollow">Faros AI</a> проанализировала работу <span class='font-weight-bold'>22 000 разработчиков из 4000 команд</span> (март 2026) и сравнила периоды с низким и высоким использованием ИИ.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>С одной стороны объём работы вырос:&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>эпиков стало больше <span class='font-weight-bold'>на 66%</span>, </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>задач – <span class='font-weight-bold'>на 34%</span>, </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>пул‑реквестов – на <span class='font-weight-bold'>16,2%</span>,</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>доля принимаемого ИИ‑кода поднялась с <span class='font-weight-bold'>20% до 60%</span>.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Но есть и минусы. Сильно увеличился «лишний» труд:&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>churn кода – <span class='font-weight-bold'>на 861%</span>, </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>число дефектов на разработчика – <span class='font-weight-bold'>на 54%</span>, </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>длительность ревью – почти в <span class='font-weight-bold'>5,5 раза</span>,</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>размер пул‑реквестов вырос <span class='font-weight-bold'>на 51,3%</span>, а доля тех, что мержат без ревью, – <span class='font-weight-bold'>на 31,3%</span>.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Это не сознательный отказ от проверок: ревьюеры просто не успевают за потоком. И даже в командах с сильными инженерными практиками ситуация не лучше – процессы не рассчитаны на такой темп.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Данные <a href="https://linearb.io/resources/software-engineering-benchmarks-report" rel="nofollow">LinearB</a> (8,1 млн пул‑реквестов) подтверждают проблему: только <span class='font-weight-bold'>32,7% ИИ‑реквестов принимают без серьёзной доработки</span>, тогда как для человеческого кода этот показатель – <span class='font-weight-bold'>84,4%</span>. <span class='font-weight-bold'>То есть две трети ИИ‑изменений приходится переделывать или отклонять. Это и есть скрытая цена быстрой генерации кода</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Вывод после первой части:</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p><em>Раньше писать код было долго и дорого, а читать – быстро и дёшево. На этой разнице и держался весь процесс код‑ревью: сеньор успевал прочитать то, что написал джун, и всё работало само собой, без специальных ухищрений.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><em>Теперь эта привычная асимметрия буквально перевернулась. ИИ выдаёт тысячу строк за то время, пока вы читаете этот абзац. А скорость, с которой человек читает код, не изменилась с момента создания первого компьютера.</em></p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Часть вторая: какие дефекты должен искать QA в ИИ-коде?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Первое, что стоит принять: <span class='font-weight-bold'>ИИ‑код ошибается не так, как человеческий</span>. Человек косячит из‑за невнимательности, усталости или спешки – его ошибки обычно локальные и заметные: их ловят линтер, тесты или ревьюер, которому бросилась в глаза странность. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Искусственный интеллект ошибается из‑за нехватки контекста: его ошибки системные, выглядят аккуратно и уверенно – одинаково убедительно пишет и рабочий код, и ерунду. В DORA это сформулировали чётко: <span class='font-weight-bold'>инженер теперь должен относиться к каждому фрагменту кода от ИИ как к потенциально ошибочному, а проверка – это совсем другая задача, чем написание</span>. В New Relic суть уложили в одну фразу: <span class='font-weight-bold'>ИИ‑инструменты хорошо понимают исходный код, но не видят, как он работает в реальности</span>. Нейросеть видит синтаксис, но не понимает, как система ведёт себя под реальной нагрузкой, какие есть зависимости, где возможны гонки данных или сбои.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Вот основные типы проблем, которые создаёт ИИ, и как с ними справляться:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Незапрошенное поведение. </span>Нейросеть делает больше, чем просили: например, не просто выводит список, а сразу его сортирует, или чинит баг, попутно меняя три файла. Она стремится к «полноте», а не к точности. Чтобы это ловить, нужно смотреть на дифф и спрашивать не «правильно ли это», а «зачем это здесь». Помогают лимиты на размер PR и чёткие списки файлов, которые агенту разрешено менять.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Смещение к «счастливому пути». </span>Код нормально работает на обычных данных, но ломается на крайних значениях: пустом массиве, null, нуле, границе месяца, спецсимволах или при конкурентном доступе. В обучающих данных чаще встречаются примеры «как сделать правильно», а про «что пойдёт не так» пишут реже. Тут выручают property‑based и мутационное тестирование.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Галлюцинации с API и пакетами. </span>ИИ вызывает метод, которого вообще нет, или использует существующий метод, но с логикой из другой версии библиотеки. Код компилируется, импортируется, а ведёт себя неправильно. Защититься помогают lock‑файлы с хэшами, списки разрешённых зависимостей, SCA на каждый PR и правило: любой новый импорт в диффе – повод для пристального внимания.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Маскировка ошибок. </span>Пустые блоки catch, конструкции вроде except: pass, подмена реального падения на тихий дефолт. Это особенно коварно: система не падает, но выдаёт неверные результаты. При этом алерты молчат, мониторинг показывает норму, а данные постепенно портятся. Бороться с этим нужно жёсткими правилами статического анализа – не рекомендациями, а запретами.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Дублирование логики. </span>Появляется несколько похожих, но разных реализаций одной и той же функции. Как точно подметил Хардинг, ИИ каждый раз, когда нужно что‑то сделать, склонен создавать новый пакет. С этим лучше всего справляется порог дублирования в CI – это один из немногих случаев, когда детектор ловит проблему вовремя, когда исправить её ещё дёшево.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Архитектурный дрейф. </span>Код формально правильный, но не вписывается в общую систему: заводит свои способы логирования, обработки ошибок, форматы конфигов вместо того, чтобы использовать существующие. Такое почти всегда замечает только человек, который хорошо знает эту часть системы. Нейросеть оценивает уже написанный код, но редко видит неявные требования, которые никто не зафиксировал.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Тесты, подогнанные под баг. </span>Агент меняет поведение функции, тест становится красным, а агент «исправляет» тест, переписывая проверку под новое (неверное) поведение. В итоге всё снова зелёное. Это не злой умысел, а поиск самого простого пути к успешному результату. По той же причине агенты могут ослаблять CI: убирать тесты, пропускать линтер или снижать требования к покрытию. Важное правило: диффы тестов нужно проверять даже внимательнее, чем диффы кода. Зелёная галочка после правки двухсот тестов ничего не гарантирует.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Интеграционные отказы. </span>Схема ломается, контракт с внешними сервисами нарушается. Нейронка видела ваш сервис, но не видела, как его используют другие системы. Тут помогают контрактные тесты.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Целостность данных. </span>Тихая деградация базы: дубли транзакций, необработанные null, дрейф телеметрии. Самое опасное здесь именно то, что всё выглядит нормально: сервис не падает, а данные портятся месяцами и обнаруживаются только тогда, когда не сходятся отчёты или финансы. Защищают инварианты на данных – а не только на функциях.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Уязвимости и проблемы с комплаенсом. </span>Ошибки в авторизации, небезопасные токены, инъекции, пробелы в аудит‑трейле, непроверенные лицензии во вложенных зависимостях. Есть и новый тип риска, о котором предупреждает Османи, – prompt injection в функциях, созданных агентом. Если пользовательский текст попадает в запрос к LLM, уязвимость не видна в диффе: она проявится позже, когда придут конкретные данные. Это принципиально новый класс дефектов: нужно учиться тестировать, что произойдёт, если в такое поле ввести инструкцию для модели, – а большинство из нас этого пока не умеет.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Пошаговый гайд для тестирования ИИ-кода</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>Наши тестировщики подготовили пошаговый гайд «Особенности багов в ИИ‑коде и их тестирование» для тех, кто хочет иметь конкретный план для успешного поиска и устранения багов в коде, написанном с помощью ИИ. Это очень полезный и наглядный материал. Чтобы скачать его бесплатно, заполните форму и дождитесь письма с документом на электронную почту.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Часть третья: восьмиэтапная QA-система</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><em>Ключевая идея взята у Османи, потому что лучше и не скажешь: <span class='font-weight-bold'>усилие на проверку нужно соотносить со стоимостью ошибки</span>. Простые и чёткие проверки стоит делать как можно раньше. А человеческое внимание оставлять для того, что под силу только человеку.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Нулевой этап – провенанс</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Чтобы правильно работать с кодом, важно сразу понимать, <span class='font-weight-bold'>написан ли он человеком или с помощью ИИ. Без этого не выстроить чёткие правила проверки и не собрать корректные метрики. </span>Решить задачу можно простыми средствами: достаточно добавлять в коммиты метки вроде Assisted‑by: или Co‑authored‑by, автоматически проставлять отметку об использовании ИИ на Pull Request и предусмотреть в его шаблоне поле для фиксации того, какой инструмент применялся и какие предложения модели в итоге не взяли.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Так удаётся закрыть главную проблему. Дело в том, что современные ИИ‑агенты перед выдачей результата подробно рассуждают и перебирают варианты, но вся эта логика пропадает, как только формируется дифф. Раньше при код‑ревью смысл правок был понятен сразу – он как бы шёл вместе с кодом. В случае с ИИ‑кодом ситуация иная: ревьюер фактически становится первым человеком, который видит эти изменения, и вынужден заново восстанавливать логику «зачем это сделано». Именно из‑за этого сильно растёт время на проверку.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Исправить ситуацию несложно: достаточно попросить агента кратко зафиксировать, какую задачу он пытался решить и какие варианты отбросил, а затем приложить эту заметку к PR в виде decision log.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В перспективе стоит закрепить в шаблоне Pull Request три обязательных пункта: объяснение, зачем нужно изменение, описание того, что предложила нейросеть и что разработчик отверг, а также краткое описание ручной проверки. Это заметно облегчит ревью и сохранит нужный контекст.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Первый этап – распределение тестирования по степени возможного ущерба</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Не стоит проверять весь код одинаково. При оценке изменений стоит задать себе три вопроса:&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li>что случится, если этот код сломается;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>как долго он будет в проекте;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>скольким людям придётся с ним разбираться.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Для прототипов, внутренних утилит и скриптов хватит линтера и тестов. Для внутреннего продакшена и некритичных функций стоит добавить SAST, контроль дублирования кода и проверку одним ИИ‑ревьюером. Клиентские функции и публичные API требуют более серьёзного подхода: тут пригодятся два разных ИИ‑ревьюера, контрактные тесты и обязательное согласование с владельцем домена. А там, где речь идёт о деньгах, аутентификации, персональных данных или ядре бизнес‑логики, нужен полный набор мер: мутационное тестирование, ручная security‑проверка, канарейка и двойное согласование.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Простой конфиг достаточно проверить линтером и беглым взглядом, а вот изменение расчёта комиссии должно пройти весь стек проверок. Тратить много времени на ревью стандартного шаблонного кода – неэффективно, но и пропускать серьёзные изменения только потому, что тесты зелёные, – значит создавать почву для будущих инцидентов. Важно, чтобы уровень строгости проверки определялся не тем, кто написал код, а тем, к каким последствиям приведёт его поломка.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Второй этап – верификация кода или входной барьер</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"id":30773,"width":"266px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-4-Photoroom_11zon.png" alt="Тестирование кода, созданного с помощью ИИ" class="wp-image-30773" style="width:266px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-4-Photoroom_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-4-Photoroom_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-4-Photoroom_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-4-Photoroom_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Здесь цитирую Саймона Уиллисона: <span class='font-weight-bold'>ваша задача – приносить в репозиторий только тот код, в работоспособности которого вы уверены</span>. Он резко критикует ситуацию, когда джун с помощью LLM готовит огромный непротестированный PR и перекладывает разбор на коллег, – это не просто неудобно, а по сути неуважение к чужому времени.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Нужны два обязательных шага, чтобы подтвердить качество кода.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Первый – ручное тестирование. </span>Если вы сами не видели, как код корректно отрабатывает, значит, нельзя считать его рабочим. Уиллисон предлагает простой приём: зафиксировать последовательность команд в терминале и вывод результата, а затем приложить это как комментарий к ревью. Если так неудобно – можно добавить скринкаст. Важно проверить не только основной сценарий, но и пограничные случаи. По его словам, умение вручную тестировать – базовый навык, а способность заранее видеть, где код может сломаться, – как раз то, что отличает опытного разработчика. <span class='font-weight-bold'>Стоит помнить об этом, когда снова услышите, что ручное тестирование больше не нужно.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Второй шаг – автотест, который реально защищает код: он должен падать, если откатить реализацию.</span> Если при откате тест остаётся зелёным, он не выполняет своей функции и по сути просто украшает репозиторий.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>В ближайшее время стоит ввести простое правило: PR без чёткого описания цели, результатов тестов и подтверждения проверки, возвращать автору без детального разбора. </span>Это не придирка, а нормальная практика. Так вы возвращаете задачу по восстановлению контекста туда, где это сделать проще и дешевле, – автору, а не перегруженному ревьюеру.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Третий этап – детерминированные ворота</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>ИИ может убедить человека, может убедить другую модель – но не способна переубедить компилятор. Это единственная часть пайплайна, которую не получится обойти уверенным текстом, поэтому здесь правила должны быть жёсткими.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Нужен механический контроль: порог дублирования кода, запрет пустых обработчиков исключений, обязательный SAST для каждого PR – без исключений по тому, кто автор. Риски из OWASP Top 10 нельзя принимать выборочно: почти половина задач с такими уязвимостями – это слишком серьёзно.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Чтобы защититься от слопсквоттинга, стоит использовать SCA и lock‑файлы с хэшами: полагаться на бдительность тут бесполезно – она не масштабируется. Порог покрытия кода тестами нельзя снижать в том же PR, где его нарушают: агенты делают это не из вредности, а потому что так проще и быстрее. Ещё важно сканировать каждый коммит на секреты – по данным Apiiro, после внедрения ИИ‑инструментов число утечек выросло на <span class='font-weight-bold'>40%</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Отдельно стоит учесть список проблем, на которые GitHub теперь прямо обращает внимание при ревью агентских PR: удалённые тесты, пропущенный линтер, сниженные пороги покрытия, дублирование уже существующих хелперов, а также попадание недоверенного ввода в промпт. Лучше настроить автоматическую проверку каждого из этих пунктов – так получится ловить риски раньше и надёжнее.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Четвёртый этап – тесты</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Мутационное тестирование показывает реальную силу тестов: оно проверяет, заметит ли тест ошибку, а не просто фиксирует, что код выполнился. Это особенно важно, когда тесты пишет ИИ: он легко создаёт тесты с хорошим покрытием, которые по сути ничего не проверяют. Пример Пратика Сингха это подтверждает: при <span class='font-weight-bold'>70% мутационного скора часть багов оставалась незамеченной, а сочетание ]]></description>
<link>https://quality-lab.ru/blog/ispolzuete-ii-dlya-napisaniya-koda-obyasnyaem-kak-ego-pravilno-testirovat/</link>
<pubDate>Wed, 22 Jul 2026 10:51:28 +0300</pubDate>
</item>
<item>
<title>Как мы превратили Swagger из документации в двигатель API-автотестов</title>
<description><![CDATA[<p>Автор: Олег Малышев, <a href="https://t.me/OlegMalyshevBlog/188" mce_href="https://t.me/OlegMalyshevBlog/188">телеграмм-канал автора про QA,QA Auto, AI, Вайбкодинг</a> лидер стека тестирования в компании «ТехВилл»<br mce_bogus="1"></p>
<p>Мы продолжаем разговор о том, как применять ИИ в тестировании. В этой статье расскажу, как мы пишем API-автотесты с помощью OpenAPI Generator, Cursor/Claude Code и автоматически считаем покрытие по Swagger через swagger-coverage.</p><p>Раньше я уже записывал <a href="https://t.me/OlegMalyshevBlog/188" mce_href="https://t.me/OlegMalyshevBlog/188" target="_blank"><strong>большое двухчасовое видео по Cursor</strong></a>, где показывал в том числе, как мы генерируем автотесты. Но с тех пор подход немного изменился: мы сильнее завязались на OpenAPI-контракт, добавили Swagger Coverage, JSON-отчёты для LLM и специальные skills для генерации недостающих тестов.</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-automation/4528-swagger-</link>
<pubDate>Tue, 21 Jul 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Как я сделала отчет о дифференциальном тестировании через Cursor</title>
<description><![CDATA[<p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Я хочу рассказать, как я сделала отчет о дифференциальном тестировании (сравнение двух функций на одних данных) через ИИ. Знаю, что многие уже применяют ИИ и в хвост и в гриву, но также много тех, кто пока не умеет этого делать.</p><figure class="full-width" style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: center; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><img alt="Картинка на заставку, конечно же, тоже сделала через ИИ (нанобанано)" decode="async" height="768" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/5bd/ce5/01f/5bdce501f1f6fce2a6b73630835df624.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/5bd/ce5/01f/5bdce501f1f6fce2a6b73630835df624.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/5bd/ce5/01f/5bdce501f1f6fce2a6b73630835df624.png 781w" style="border-style: none; height: auto; margin: 0px; max-width: 100%; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle;" title="Картинка на заставку, конечно же, тоже сделала через ИИ (нанобанано)" width="1376" /><div style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><figcaption style="color: #8f8f8f; font-size: 0.8125rem; line-height: 1.125rem; margin-top: 4px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; white-space: pre-wrap;">Картинка на заставку, конечно же, тоже сделала через ИИ (нанобанано)</figcaption></div></figure><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Поэтому я хочу показать на конкретном примере из жизни, где еще несколько лет назад пришлось бы делать красивый отчет в ручную, а теперь его делает робот за пару минут. Возможно, это вдохновит вас тоже попробовать сделать нечто похожее =))</p><div style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; line-height: 1.4375rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: left; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="font-size: large;"><a href="https://habr.com/ru/articles/1058722/" target="_blank">Ссылка на Хабр</a></span></div><div><br /></div><span><a name='more'></a></span><h3 style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; font-size: 1.125rem; font-weight: 500; line-height: 1.4375rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><br /></h3><h3 style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; font-size: 1.125rem; font-weight: 500; line-height: 1.4375rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Мой пример</h3><p><a class="anchor" id="my_case" name="my_case" style="background-color: white; color: #548eab; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" target="_blank"></a><a class="anchor" id="tests" name="tests" style="background-color: white; color: #548eab; display: block; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin-top: 12px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" target="_blank"></a></p><h4 style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; font-size: 16px; font-weight: 500; line-height: 1.25rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">1. Проведение тестирования</h4><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Тестировала задачу исследования — изменение коэффициента похожести для поиска дублей. То есть функция определения коэффициента уже есть, работает. Но решили «тут поменять, там поменять», и посмотреть, станет ли лучше.&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Поэтому это и называется задачей исследования — мы не сразу заменяем старую функцию новой, а проводим эксперимент:</p><ol style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="counter-increment: item 1; line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">делаем вторую функцию,&nbsp;</p></li><li style="counter-increment: item 1; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">готовим тестовые данные,&nbsp;</p></li><li style="counter-increment: item 1; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">прогоняем их на старой и новой функции,</p></li><li style="counter-increment: item 1; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">анализируем результат — если “да, круто вышло!”, то заменяем одну функцию на другую, если “чет не то”, то думаем дальше.</p></li></ol><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Вторую функцию сделали, моя задача была — провести шаги 2-3. И частично 4, нужно красиво-понятно отобразить отчет о тестировании, чтобы аналитик его изучил и потом уже принимал решение.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Тестовые данные я подготовила сама. Посмотрела на ТЗ и так, и эдак, и поняла, что я дольше буду расписывать ИИ, что именно тут надо сделать, чем сделаю это сама. Хотя ИИ я все равно погоняла и в хвост, и в гриву для сбора тестовых данных, но об этом я расскажу в следующий раз.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Данные собрала, потом написала автотесты. Выглядят они примерно так (для простоты понимания будем сравнивать ФИО):</p><pre style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(247, 247, 247); border-radius: 4px; border: 1px solid rgb(240, 240, 240); box-sizing: border-box; color: #333333; font-size: 0.875rem; line-height: 1.6; margin: 32px 0px 0px; overflow-wrap: normal; overflow: auto; padding: 17px 10px 10px 20px; quotes: &quot;«&quot; &quot;»&quot;; tab-size: 4; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; word-break: normal;"><code style="background: 0px 0px; border-radius: 4px; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, Courier, monospace; font-size: inherit; overflow-wrap: normal; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; tab-size: 4; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; word-break: normal; word-spacing: normal;">Опечатка в отчестве;99;Назина;Ольга;Евгеньевна;Назина;Ольга;Еквгеньевна</code><div class="code-explainer" style="display: flex; left: 0px; margin-top: 2px; position: sticky; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><a class="tm-button code-explainer__link" href="https://sourcecraft.dev/" style="align-items: center; background-color: rgba(0, 0, 0, 0); border-color: currentcolor; border-image: none; border-style: none; border-width: medium; color: #548eab; cursor: pointer; display: flex; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 0.75rem; gap: 6px; line-height: 0.875rem; margin-left: auto; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; text-decoration: none; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; visibility: visible;" target="_blank">Объяснить с<img src="https://assets.habr.com/habr-web/release_2.330.3/client/img/sourcecraft-light-BPeLGH4v.svg" style="border-style: none; height: 14px; margin: 0px; max-width: 100%; object-fit: cover; object-position: left center; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle; width: 87px;" /></a></div></pre><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Что тут есть:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Описание теста</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Коэффициент похожести</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">ФИО первой пары в трех ячейках</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">ФИО второй пары</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Обычно в автотестах делают разные файл — что подается на вход, что получаем на выходе. Но у меня выходной параметр всего один (коэффициент), поэтому он записывается сразу внутри теста.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Если автотест упадет, выглядеть это будет так (допустим, вместо коэффициента 99 вернулся 0):</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;Expected:&nbsp; [2/Similarity]:99</em></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Actual:&nbsp; [2/Similarity]:0</em></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Input data: 1. Опечатка в отчестве;99;Назина;Ольга;Евгеньевна;Назина;Ольга;Еквгеньевна</em></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Etalon data: 1. Опечатка в отчестве;99;Назина;Ольга;Евгеньевна;Назина;Ольга;Еквгеньевна</em></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Result data: 1. Опечатка в отчестве;0;Назина;Ольга;Евгеньевна;Назина;Ольга;Еквгеньевна</em></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Это стандартный вывод автотестов:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Input data — что на входе</em></p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Etalon data — что я ожидаю</em></p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Result data — что тест ожидает</em></p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Да, в моем случае <em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Input и Etalon </em>совпадают, но зато такое решение работает как для разных входных-выходных файлов, так и для одного.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Итак, автотесты я сделала. Получилось их довольно много, больше 300, так как много разных сценариев нужно было покрыть + на каждый сценарий надо было сделать 2-6 тестов (тест-дизайн и все такое).</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Прогнала на новой функции — 100 падений (цифры эти для примера, но чтобы показать масштаб проблемы формирования результата). Сохранила результаты прогона в файл new.txt.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Прогнала на старой функции — 200 падений (то есть новая работает лучше).&nbsp; Сохранила результаты прогона в файл old.txt.&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Огонь, осталось оформить!</p><hr style="background-color: white; border-color: rgb(51, 51, 51) rgb(51, 51, 51) currentcolor; border-image: none; border-style: solid solid none; border-width: 1px 1px 0px; box-sizing: content-box; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; height: 0px; margin: 56px auto; max-width: 280px; overflow: visible; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" /><h4 style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; font-size: 16px; font-weight: 500; line-height: 1.25rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">2. Оформление результата</h4><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Я подумала — как я хочу видеть результат? Хорошо бы в виде таблички, чтобы сразу видно “эта функция справилась, эта нет”.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Взяла из результатов прогона новой функции первое падение (см пример выше) и на его основе накидала в конфлюенсе такую табличку:</p><div style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><div class="table" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><div class="table table_wrapped" style="margin-bottom: 24px; overflow-x: auto; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><table style="border-collapse: collapse; border: 1px solid rgb(191, 191, 191); margin: 32px 0px 0px; min-width: 100%; quotes: &quot;«&quot; &quot;»&quot;; table-layout: fixed; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; width: auto; word-break: normal;"><tbody style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><tr style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Описание</span></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Коэф</span></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">ФИО 1</span></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">ФИО 2</span></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">testOldFunction</span></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">testNewFunction</span></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Комментарий</span></p></td></tr><tr style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><td colspan="7" style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">testOldFunction работает, testNewFunction нет</span></p></td></tr><tr style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">1. Опечатка в отчестве</p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">99</p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Назина</p><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Ольга</p><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Евгеньевна<br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" /></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Назина</p><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Ольга</p><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Еквгеньевна<br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" /></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Успех</p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">FAIL / ожидает 0</p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"></p></td></tr></tbody></table></div></div></div><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">По сути я просто вытащила все колонки из теста и добавила в конец 3 новые для анализа результата:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">testOldFunction</span> — как справилась старая функция</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">testOldFunction</span> — как справилась новая функция</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Комментарий </span>— чтобы подсвечивать “тут некритично, а тут обратите внимание!”</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Что писать в колонки прогонов:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Успех — если в файле прогона функции НЕТ этого теста, значит, он не упал, а прошел успешно. По крайней мере я сохранила в файл именно падения.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">«FAIL / ожидает такое-то значение», чтобы было видно, что ждем мы (2 колонка) и что выдал тест.</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Ну и, конечно, результаты надо бы сгруппировать:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Старая функция работает, новая нет</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Новая функция работает, старая нет</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Обе не работают</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">И внутри еще сгруппировать (помните ведь, что падений было 200+, да?). Я посмотрела глазками отчеты и выделила некоторые повторяющиеся падения.&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Допустим, есть проблема в двойном имени. Тогда все сценарии, в которых оно участвует, упадут. И вот эти падения хотелось бы сгруппировать, чтобы:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Сразу увидеть масштаб проблемы — сколько таких сценариев сломалось</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Понять, что еще сломалось — увидеть все другие падения отдельно, а не так, что через раз будет “снова двойное имя”.</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Так, работа понятна! Но делать ее вручную — это ж капец сколько времени! Вытащить из результатов падений что-то одно (например, строку Result data), чтобы открыть в экселе, а не блокноте, чтобы это все скопировать и вставить в таблицу в конфлюенсе.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Но ведь все группировки придется делать вручную! Да, можно через поиск их находить и копировать пачками, а потом удалять в прогоне и смотреть, что осталось, но все равно это очень унылая работа.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">А вот робот с рутиной справляется на ура! Главное, четко сформулировать ему, что именно ты хочешь. И показать, в каком виде тебе это нужно сделать. А у меня и это есть, вон табличка с примером.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Я выгрузила эту табличку из конфлюенс в ворд-файл test_results_demo.docx, чтобы скормить ИИ. Правда, пришлось внести коррективы уже на этом этапе. Исходно то я и правда вставила в конфлюенс тест «как ]]></description>
<link>http://okiseleva.blogspot.com/2026/07/cursor.html</link>
<pubDate>Tue, 21 Jul 2026 17:40:06 +0300</pubDate>
</item>
<item>
<title>Как тестировщику участвовать в open-source проектах</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/open-source-projects.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/open-source-projects.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Има-Абаши Эффионг (Ima-Abasi Effiong)<br /><strong><a href="https://www.ministryoftesting.com/articles/how-to-contribute-to-open-source-projects-as-a-software-tester" mce_href="https://www.ministryoftesting.com/articles/how-to-contribute-to-open-source-projects-as-a-software-tester" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><h1>Почему тестировщикам важно участвовать в проектах с открытым исходным кодом (OSS)</h1>
<p>Участие в open source помогло мне приобрести множество навыков. Я научилась эффективно и уважительно общаться, что укрепило уверенность при взаимодействии с людьми. И хотя я не пишу код, я стала уверенно пользоваться GitHub и командной строкой в терминалах — навыком, который можно освоить только на практике. Open source предоставляет такую возможность.</p>]]></description>
<link>https://software-testing.ru/library/around-testing/job/4500-how-to-contribute-to-open-source-projects-as-a-software-tester</link>
<pubDate>Sun, 19 Jul 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Мобильный маркетинг начинается с QA: как тестирование влияет на модерацию и рейтинг приложения</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p><em><span class='font-weight-bold'>Пока разработчики заняты кодом, маркетолог рискует столкнуться с оттоком пользователей и обвалом рейтинга приложения. Узнайте, почему тестировщики &#8212; верные союзники маркетологов в удержании позиций на рынке мобильных приложений.</span></em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Эта статья – для тех, кто продвигает мобильные приложения. Можно готовить гениальные рекламные кампании, но низкий рейтинг в сторах убивает конверсию на корню. К тому же магазинов становится всё больше: от классических Play Market и App Store до отечественного RuStore и более экзотических альтернатив – например, AppGallery от Huawei (его пришлось запустить из‑за закрытия доступа к сервисам Google). Работать сложнее из‑за региональной фрагментации интернет‑среды и всеобщей зарегулированности.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Так, может, пусть айтишники сами разбираются? При чём здесь маркетинг?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Полтора года назад я могла бы согласиться – я толком даже не интересовалась, чем занимаются тестировщики. Серьёзно. К тому моменту я уже 10 лет работала в диджитал и классическом маркетинге: перформанс, ивенты, контент, работа с репутацией – вот это всё. О тестировании я, конечно, знала, но аббревиатуру QA впервые услышала в 2025 году, когда получила оффер от <a href="https://quality-lab.ru/" data-type="page" data-id="18174">«Лаборатории качества»</a>. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В первый месяц среди тестировщиков мне казалось, что это слишком техническая сфера. Утешала я себя на первых порах тем, что мне для продвижения хватит знания продукта и аудитории, а там по ходу разберусь. И QA‑мир меня захватил – особенно когда я поняла, насколько тестирование полезно для <a href="https://quality-lab.ru/blog/5-smertnykh-grekhov-podgotovki-k-black-friday/" data-type="post" data-id="28544">интернет‑маркетинга</a>. Это был приятный культурный и профессиональный шок: теперь я смотрю на продвижение цифровых продуктов совсем другими глазами.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>За последние полтора года я много общалась с тестировщиками, ходила на <a href="https://quality-lab.ru/blog/meetup-2-security-ai/" data-type="post" data-id="28079">вебинары</a>, прочитала книгу Романа Савина «Тестирование Дот Ком, или Пособие по жестокому обращению с багами в интернет‑стартапах», прошла курсы по QA на Stepik и в <a href="https://quality-lab.ru/education/" data-type="page" data-id="30">учебном центре</a> своей компании. Я не эксперт по QA и не претендую на этот статус, но<span class='font-weight-bold'> у меня есть взгляд со стороны маркетинга</span> – и именно с этой точки зрения мне открылась одна неприятная вещь, которой хочу с вами поделиться.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Тезис у меня простой и немного провокационный</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30718,"width":"400px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="1016" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/Replace_the_AppStore_logo_with_a_logo_featuring_a_raccoon_an-Photoroom-1_11zon-1.png" alt="мобильный маркетинг" class="wp-image-30718" style="width:400px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/Replace_the_AppStore_logo_with_a_logo_featuring_a_raccoon_an-Photoroom-1_11zon-1.png 1016w, https://quality-lab.ru/wp-content/uploads/2026/07/Replace_the_AppStore_logo_with_a_logo_featuring_a_raccoon_an-Photoroom-1_11zon-1-298x300.png 298w, https://quality-lab.ru/wp-content/uploads/2026/07/Replace_the_AppStore_logo_with_a_logo_featuring_a_raccoon_an-Photoroom-1_11zon-1-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/07/Replace_the_AppStore_logo_with_a_logo_featuring_a_raccoon_an-Photoroom-1_11zon-1-768x774.png 768w" sizes="(max-width: 1016px) 100vw, 1016px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>Пройдёт ли приложение модерацию? <br>Как пользователи его воспримут? <br>Понравится ли оно им? <br>Какой отзыв оставят?</span><br><br>Это чистая <span class='font-weight-bold'>ответственность маркетинга</span>. Но зачастую мы не вникаем в эти нюансы как следует. Пора это менять: <span class='font-weight-bold'>любой маркетолог, который продвигает мобильные приложения, должен разобраться в тестировании</span> – чтобы понимать, какие риски оно помогает закрыть.  </pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Мы практически целиком отдали вопрос размещения в сторах айтишникам, будто это не наше дело. И зря. Например, я вспоминаю два кейса из опыта, когда ещё на заре карьеры команда, в которой я работала, запустила приложение культурной направленности в App Store, и оно вышло в топы – за это нас, ребят из маркетинга и PR, прям захвалили, но мы сидели, скромно опустив глаза, так как понимали, что это не до конца наша заслуга и мы не совсем понимаем, как это произошло.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Также был случай, когда мы запустили приложение по доставке мясной продукции, и у него были конкретные проблемы с модерацией – запуститься не могли несколько недель. Нам не хватало экспертизы подсказать разработчикам, как это исправить. Оставалось только нервно ходить в IT‑отдел и обновлять статус задачи. Довольно неприятное ощущение, когда ты не можешь на что‑то повлиять, так как не разбираешься в механизмах.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Немного о продуктовом подходе</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>В России мобильные маркетологи нередко отвечают за продвижение и репутацию – занимаются ASO, работают с карточкой приложения, модерируют отзывы, а иногда и следят за опытом пользователя после установки. При этом в небольших проектах техническую часть берут на себя IT‑специалисты, а QA‑инженера зачастую вообще нет. На Западе подход другой: зоны ответственности чётко разделены – есть отдельные ASO‑, ORM‑ и QA‑специалисты, ведь там давно считают качество продукта основой маркетинга <span class='font-weight-bold'>(вспомним классику маркетинга – 4P: сначала продукт, потом цена, место и продвижение)</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>У нас <span class='font-weight-bold'>маркетологов до сих пор не всегда допускают к работе над продуктом</span>: во многих компаниях решения спускают сверху с установкой просто продвинуть товар и не «умничать». Чаще такой подход приводит не к успеху, а к болезненному опыту – и <span class='font-weight-bold'>в итоге всё равно приходится дорабатывать продукт и приводить его в соответствие с рыночным запросом</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Для размышлений</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li>Согласно <a href="https://developer.apple.com/app-store/ratings-and-reviews/" rel="nofollow">официальным рекомендациям Apple</a>, рейтинг и отзывы напрямую влияют на видимость приложения в App Store и количество установок. При этом компания рекомендует оперативно устранять технические проблемы, чтобы они не превращались в негативные отзывы пользователей. Именно поэтому качество тестирования становится не только технической, но и маркетинговой задачей.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>По данным исследования <a href="https://www.sciencedirect.com/science/article/pii/S0167811624000922" rel="nofollow">Elsevier</a>, сбор обратной связи пользователей при развитии приложения приводит к улучшению пользовательских оценок. Ну а пользовательский опыт напрямую зависит от качества продукта (привет, QA).</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Мобильный маркетинг начинается с тестирования</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>С первых месяцев работы я заметила: к нам регулярно приходят компании с проблемами мобильных приложений – чаще всего это либо провал модерации, либо низкий рейтинг (около двух звёзд), а иногда – постепенное падение оценок без понятной причины. При этом привлекать тестировщиков обычно решают разработчики, технические директора и продакты, а маркетологи подключаются крайне редко – и такой осознанный подход вызывает особое уважение.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Публикация приложения в сторах – это по сути продвижение: больше площадок – больше охват. Мы тщательно работаем над конверсией и тональностью комментариев, но при этом нередко игнорируем качество самого продукта, хотя именно оно напрямую влияет на оценки в магазинах и другие показатели. Пора менять этот подход: в 2026 году мобильному маркетингу критически важно интегрировать тестирование приложений – расскажу, что это даст.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dbeded"}}} --></p>
<p class="has-background" style="background-color:#dbeded"><em>Для этой части статьи я привлекла на помощь ведущего тестировщика нашей компании, поэтому дальше будет немного технического занудства. Но я постаралась описать его максимально понятно и просто. Также вас ждёт немного статистики и чек-лист, который можно сразу забирать в работу. Начинаем!</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Первый шаг: модерация</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Важный нюанс: <span class='font-weight-bold'>нет единого списка требований для прохождения модерации</span>. Каждый стор публикует собственные правила. При этом около 80% требований совпадают. Мы собрали их для вас в одну обзорную таблицу.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":30705,"sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="923" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0-%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B-%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3-1-2-923x1024.png" alt="тестирование мобильных приложений" class="wp-image-30705" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильны-маркетинг-1-2-923x1024.png 923w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильны-маркетинг-1-2-270x300.png 270w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильны-маркетинг-1-2-768x852.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильны-маркетинг-1-2-1385x1536.png 1385w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильны-маркетинг-1-2.png 1684w" sizes="(max-width: 923px) 100vw, 923px" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p>Большинство причин отклонения приложения связаны с качеством продукта, а не с рекламой. Тестирование помогает продвижению: повышает шансы на публикацию, снижает риск негативных отзывов и способствует росту рейтинга в сторах.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Интересная статистика: по разным оценкам, в App Store <span class='font-weight-bold'><a href="https://www.adalo.com/posts/common-app-store-rejection-reasons/" rel="nofollow">около четверти новых приложений</a> не может пройти модерацию с первого раза</span>. Вот что чаще всего становится причиной отказа (по сводкам за 2025–2026 годы):</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Приватность (Guideline 5.1.1).</span> Нет ссылки на политику конфиденциальности внутри приложения и в метаданных, приложение просит доступы к геолокации, контактам, камере без внятного объяснения зачем, нет возможности удалить аккаунт прямо в приложении. Apple на приватности повёрнут, и это самый частый повод для разворота.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true,"start":2} --></p>
<ol start="2" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Краши и баги (Guideline 2.1, «App Completeness»).</span> Ревьюер словил вылет, фриз или нерабочий экран &#8212; всё, до свидания. И не важно, что у вас на устройстве всё летает: у него другая модель телефона, другая версия ОС, слабый интернет &#8212; и баг вылез.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":3} --></p>
<ol start="3" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Метаданные не соответствуют реальности (Guideline 2.3).</span> Скриншоты показывают функции, которых в приложении нет. Или &#8212; мой любимый случай &#8212; на скриншоте для App Store размещён макет на Android-телефоне. Это мгновенный разворот (это уже точно <span class='font-weight-bold'>маркетинговый косяк</span>).</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":4} --></p>
<ol start="4" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Сырой материал.</span> Тексты «Lorem ipsum», «coming soon», битые ссылки, нерабочий support URL (ревьюер по нему реально кликает и ждёт увидеть живую страницу поддержки).</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":5} --></p>
<ol start="5" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Покупки и подписки (Guideline 3.1.1).</span> Сломана или спрятана кнопка «Восстановить покупки».</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":6} --></p>
<ol start="6" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Минимальная функциональность (Guideline 4.2) и клоны (4.1).</span> Например, если Apple считает, что ваше приложение ничем не отличается от браузерной версии продукта.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>И это только один магазин приложений! <span class='font-weight-bold'>А вы заметили, сколько из этих требований пересекается с зоной ответственности маркетинга?</span> Скриншоты, тексты карточки, соответствие обещаний реальности – это всё наше родное. А значит, маркетолог, который в этом не разобрался или вовремя не привлёк дополнительную экспертизу в виде мобильного QA‑инженера, вполне может своими непродуманными действиями привести к провалу модерации. Или же, наоборот, способствовать прохождению этого «весёлого» квеста с первого раза. Без магния и походов к психологу (это уже что‑то личное, простите). </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dbeded"}}} --></p>
<p class="has-background" style="background-color:#dbeded">Не забывайте, что в некоторых случаях выход приложения на рынок раньше вашего конкурента – это вопрос завоевания доли рынка или даже выживания. Поэтому не рискуйте и не тратьте время на тормоза при модерации – берите контроль в свои руки.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Второй шаг: рейтинг и видимость</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Допустим, прошли модерацию. Дальше начинается то, ради чего всё затевалось, – органика. И вот тут рейтинг становится одним из ключевых факторов ранжирования и конверсии. Вот вам наглядная таблица.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":30707,"sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="866" src="https://quality-lab.ru/wp-content/uploads/2026/07/%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0-%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3-2-3-1024x866.png" alt="продвижение мобильных приложений" class="wp-image-30707" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-2-3-1024x866.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-2-3-300x254.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-2-3-768x649.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-2-3-1536x1299.png 1536w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-2-3.png 1684w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p>Вот несколько интересных отрезвляющих цифр.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>90% приложений, которые попадают в подборки App Store, имеют рейтинг 4,0 и выше.</span> Приложения с рейтингом ниже <span class='font-weight-bold'>3,5</span> ранжируются примерно <span class='font-weight-bold'>в три раза реже</span> в топ-10 по ключевым запросам.  Это подтверждается исследованием <a href="https://www.apptweak.com/en/aso-blog/aso-app-store-trends-benchmarks-report" rel="nofollow">AppTweak</a>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Из этого же исследования известно, что даже <span class='font-weight-bold'>небольшое увеличение среднего рейтинга способно заметно повысить конверсию карточки приложения</span>. Пользователи значительно чаще устанавливают приложения с высоким рейтингом, а Apple прямо указывает, что оценки и отзывы помогают повысить обнаруживаемость приложения и стимулируют загрузки.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>77% людей <a href="https://www.alchemer.com/resources/blog/improve-mobile-app-ratings-and-reviews/" rel="nofollow">читают</a> хотя бы один отзыв перед установкой бесплатного приложения, 80% &#8212; перед платным.</span> Приложение с рейтингом ниже 4,0 часто просто пролистывают, даже если оно стоит высоко в выдаче.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Важная и недооценённая штука &#8212; <span class='font-weight-bold'>скорость появления свежих отзывов</span> (review velocity). Пользователи воспринимают недавно оставленные отзывы как более актуальные. Высокий рейтинг сам по себе не гарантирует успех. Если приложение давно не обновлялось и не получает новых отзывов, пользователи могут воспринимать его как заброшенное. Поэтому после каждого релиза важно не только исправлять ошибки, но и работать с обратной связью пользователей. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Подумайте также о первом пользовательском опыте. </span>Маркетинг оплачивает привлечение пользователя и если человек удаляет приложение после первого запуска из-за ошибок, то эти деньги уже не вернуть. Поэтому высокое качество работы приложения становится не только задачей разработки и QA, но и фактором окупаемости маркетингового бюджета.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Откуда берётся низкий рейтинг?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Можно долго рассуждать про не то время, не то место, не те деньги и так далее, но если посмотреть на реальные плохие отзывы в любом сторе, то огромная их доля &#8212; это конкретные баги: «Вылетает при оплате», «Не открывается на моём телефоне», «После обновления пропали все данные», «Кнопка не работает». Это не проблема позиционирования. Это пропущенные в прод баги. А люди хладнокровные, они не будут жалеть вас и ваше приложение.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>По данным опроса <a href="https://www.quality-ai.com/insights/news/survey-88-of-app-users-will-abandon-apps-based-on-bugs-and-glitches" rel="nofollow">QualiTest и Google Consumer Surveys</a>, более половины пользователей готовы отказаться от приложения, если сталкиваются с ошибками ежедневно. </span>Это ещё раз показывает, что даже небольшие, но регулярно повторяющиеся баги способны привести к потере аудитории.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>53% пользователей <a href="https://www.slideshare.net/slideshow/mobile-app-usersurveyfailingmeetuserexpectations/62096923" rel="nofollow">удаляли</a> мобильное приложение, если сталкивались с серьёзными проблемами &#8212; крашами, зависаниями или ошибками.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В индустрии есть бенчмарк стабильности &#8212; <span class='font-weight-bold'>доля сессий без крашей (crash-free sessions). Норма сейчас около 99,95%.</span> Звучит как почти 100%, но истина в хвостике: приложения, у которых этот показатель падает ниже <span class='font-weight-bold'>~99,7%</span>, статистически уезжают в зону рейтинга <span class='font-weight-bold'>ниже 3 звёзд</span>. Десятые доли процента крашей &#8212; и вот вам минус звезда.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>То есть связь прямая: баги, краши и сломанные сценарии приводят удалениям и злым отзывам, затем к падению рейтинга. Как итог: выпадение из выдачи, рост стоимости привлечения и падение охвата.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dbeded"}}} --></p>
<p class="has-background" style="background-color:#dbeded">Так вот, <span class='font-weight-bold'>тестирование (QA) как раз пресекает эту порочную цепочку в самом начале</span>, до того, как баг увидел пользователем и проклял в отзыве всю вашу команду.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":30708,"sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="826" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0-%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3-3-2-826x1024.png" alt="Тестирование мобильных приложений" class="wp-image-30708" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-3-2-826x1024.png 826w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-3-2-242x300.png 242w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-3-2-768x952.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-3-2-1239x1536.png 1239w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-3-2-1652x2048.png 1652w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-3-2.png 1684w" sizes="(max-width: 826px) 100vw, 826px" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30709,"width":"304px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="683" src="https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-1-Photoroom_11zon-1024x683.png" alt="продвижение мобильных приложений" class="wp-image-30709" style="width:304px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-1-Photoroom_11zon-1024x683.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-1-Photoroom_11zon-300x200.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-1-Photoroom_11zon-768x512.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-1-Photoroom_11zon.png 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Если свести всё в одну фразу: QA помогает приложению пройти модерацию с первого раза и не разочаровать реальных пользователей. А это ровно те две вещи, от которых зависит органический охват продукта и успешное выполнение маркетинговых целей.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Чек-лист сознательного маркетолога</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>1. Контролируйте ход работ, задавайте вопросы. </span>Если видите, что не хватает тестирования – согласуйте бюджет и привлекайте на аутсорсе или аутстафе напрямую или через вашего СТО. Самая дешёвая правка – та, которую сделали до подачи в стор. Попросите, чтобы вас звали на миты с разработкой, а не ставили перед фактом публикации. Ваш интерес тут законный: от качества релиза зависит охват и репутация.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>2. Пройдитесь по этим пунктам.</span> Это пять минут, но вы облегчите своей команде жизнь:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>ссылка на политику конфиденциальности есть и внутри приложения, и в метаданных, и она открывается;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>удаление аккаунта доступно прямо в приложении (если есть регистрация);</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>support URL ведёт на живую страницу с реальным способом связи, а не на 404 или заглушку;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>скриншоты показывают то, что реально есть в приложении, и соответствуют устройству (никаких андроид-макетов в App Store);</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>никаких «Lorem ipsum» и других сырых штук;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>кнопка восстановления покупок на месте и работает.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>3. Приложите ревьюеру записку (Review Notes). Если публикуете приложение не вы, то подсветите эту необходимость команде и подготовьте текст.</span> Если в приложении есть вход – дайте демо-аккаунт и логин/пароль ревьюеру. Опишите, как протестировать неочевидные фичи, объясните, зачем вы просите доступ к камере или геолокации. Половина отказов случается просто потому, что при ревью не смогли разобраться. Это, между прочим, чистый копирайтинг – тоже часть нашей работы.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>4. Настройте мониторинг отзывов.</span> Раз в неделю разбивайте свежие отзывы на три группы: баги, проблемы UX и запросы фич. Баги &#8212; немедленно командам разработки и тестирования, чтобы они не снижали рейтинг. И отвечайте на негатив в течение 24–48 часов: люди, получившие живой (не шаблонный!) ответ на плохой отзыв, заметно чаще возвращаются и поднимают оценку.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>5. Подружитесь с метрикой crash-free sessions.</span> Попросите у команды доступ к Firebase Crashlytics или аналогу и оценивайте его как маркетинговый показатель. Падение этой цифры – ранний сигнал, что через неделю-другую к вам поедет волна негатива и просядет рейтинг. Лучше узнать об этом из дашборда, чем из отзывов.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>6. Не лейте трафик на сырое приложение.</span> И это главное. Запустить дорогую рекламную кампанию на продукт, которое крашится у каждого десятого, – значит <span class='font-weight-bold'>платить за одно­звёздочные отзывы</span>. Вы своими руками приводите в стор недовольную аудиторию.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>7. Тестируйте не только продукт, но и карточку.</span> A/B-тесты скриншотов, иконки, текстов – это ASO, то есть наше поле. У топовых игр в Google Play больше половины команд тестируют скриншоты по нескольку раз в год, и это даёт ощутимый прирост конверсии. Тут маркетинг и культура тестирования вообще сливаются в одно.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p>Я по природе склонна постоянно искать новые подходы, но отношусь ко всему с изрядной долей скепсиса. Особенно в нашей сфере, когда любую новую штуку нам подают как революцию в профессии буквально каждую неделю. Но вот по поводу тестирования я искренне не понимаю, почему маркетологи упустили эту сферу из виду, особенно при взрывном развитии цифровых продуктов в последние 15 лет. Все сейчас хайпуют на ИИ, но ведь QA для маркетологов – это ещё один высокотехнологичный инструмент, который в нашей среде почти не используется.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Для себя я сделала однозначный вывод: <span class='font-weight-bold'>интернет-маркетолог, который продвигает мобильные приложения и другие цифровые площадки, но при этом не понимает, что такое тестирование и какие риски оно закрывает, – это уже вчерашний день.</span> Не потому что QA &#8212; это модная и эффектная аббревиатура, которую я выучила и теперь умничаю, а потому что без него мы получаем дыру в самом начале воронки.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>Не дайте багам обнулить маркетинговые усилия. Получите бесплатный разбор узких мест и технических причин низкой конверсии. Оставьте контакты – и мы дадим конкретные рекомендации.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Список официальных документов с требованиями в упомянутых в статье сторах:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://developer.apple.com/app-store/review/guidelines/" rel="nofollow">Apple App Store Review Guidelines</a></span></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://support.google.com/googleplay/android-developer" rel="nofollow">Google Play Developer Policy Center</a></span></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://developer.android.com/docs/quality-guidelines" rel="nofollow">Google Play Quality Guidelines</a></span></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://developer.huawei.com/consumer/en/doc/app/agc-help-appreview" rel="nofollow">Huawei AppGallery Review Guidelines</a></span></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://www.rustore.ru/help/developers" rel="nofollow">RuStore &#8212; Требования к приложениям</a></span></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://developer.amazon.com/docs/app-submission/submission-checklist.html" rel="nofollow">Amazon Appstore Developer Guidelines</a></span></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://seller.samsungapps.com/" rel="nofollow">Samsung Galaxy Store Seller Portal</a></span></li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>]]></description>
<link>https://quality-lab.ru/blog/mobilnyj-marketing-nachinaetsya-s-qa-kak-testirovanie-vliyaet-na-moderaciyu-i-rejting-prilozheniya/</link>
<pubDate>Thu, 16 Jul 2026 17:27:47 +0300</pubDate>
</item>
<item>
<title>При общении с ИИ не усложняйте вопрос, это сожрет лишние токены</title>
<description><![CDATA[<p>&nbsp;Я тут код исправляла <strike>грязными ручками</strike>. Скрипт заполнения таблицы составляется примерно так:</p><pre style="box-sizing: border-box; color: #182230; margin: 0px; max-width: 100%; min-width: 0px; overflow-wrap: anywhere; overflow: hidden; padding: 12px; white-space: pre-wrap; word-break: break-word;"><code style="box-sizing: border-box; font-size: 13px; line-height: 1.55;"><span style="font-family: Cascadia Mono, Consolas, Liberation Mono, monospace;">insert into table
( column_1, column_2, column_3, column_4)<br />select 'SYSTEM_A',  'ANY',       'ANY',      30 from dual union
select 'SYSTEM_B',  'ANY',       'ANY',      60 from dual union
select 'SYSTEM_C',  'ANY',       'ANY',      60 from dual;<br /><br /></span><span style="font-family: inherit;"></span></code></pre>Мне надо было его поправить — тут удалить строчку, там добавить, тут значение обновить... Вроде все сделала, а у меня автотесты перестали запускаться, падая на создании контекста.<div><br /></div><div>Я вроде понимаю, что где-то в скрипте "typo-fix" нужен, опечатка какая-то, но какая и где? Скрипт большой, самой искать не хочется. Решила сходить к Курсору за советом. И я же научена вводить в контекст, так что подсветила ему, какая именно ошибка мне выдается при сборке:</div><div><br /></div><div></div><blockquote><div>Проверь файл C:\tmp\schema\init\my_script.sql. При сборке мавеном падает на создании контекста: Caused by: org.hsqldb.HsqlException: unexpected end of statement : line: 96. Что не так в скрипте?</div><div></div></blockquote><div><br /></div><div>Курсор ушел в себя на час! Он насоздавал 17 файлов, запустил 69 команд, перебирая скрипт и всё, что лежит вокруг. Сожрал кучу токенов, что тоже важно.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyv6BxkR5AtEEv_MUZaLXqZLitbjmm71_hbFGOF-2sA7acKKPhncKU96TXj234YV9OvwuihiXAs2tzBeitbYNsTORfZ-vlvju3AJUiHESec_0VIHool53WLdHxg_x1wfeA-pO59iLC4nvEln261wxQamG9_3yQpgH_vgSCmYli83o39Spp8K5JQXo-0Bw/s1664/1784210168.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="928" data-original-width="1664" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyv6BxkR5AtEEv_MUZaLXqZLitbjmm71_hbFGOF-2sA7acKKPhncKU96TXj234YV9OvwuihiXAs2tzBeitbYNsTORfZ-vlvju3AJUiHESec_0VIHool53WLdHxg_x1wfeA-pO59iLC4nvEln261wxQamG9_3yQpgH_vgSCmYli83o39Spp8K5JQXo-0Bw/s320/1784210168.png" width="320" /></a></div><br /><div><br /></div><span><a name='more'></a></span><div>А ошибка оказалась банальной, это как внутри JSON-запроса обычно бывает, когда местами строки меняешь:</div><div><ul style="text-align: left;"><li>в последнюю строку накопипастил запятую в конце</li><li>в непоследнюю строку скопипастил БЕЗ запятой в конце</li></ul><div>Тут аналогично, непоследняя строка должна быть с union и без точки с запятой, последняя — наоборот. А я в одном или двух местах сделала криво.</div></div><div><br /></div><div>И можно было просто скормить ИИ-шке файл с вопросом, есть ли в скриптах проблемы. По идее, должен найти, в JSON-запросе находил легко.&nbsp;</div><div><br /></div><div>А тут я подсказала, что собираю мавеном, номер строки, на которой падает. Поэтому робот проверил эту строку — не на ней. Пошел изучать контекст, из чего скрипт в мавене собирается... И все это сожрало кучу времени и токенов =))</div><div><br /></div><div>И ведь была у меня мысль просто попросить проверить скрипт на ошибки, вне контекста. Задать вопрос попроще. Не стоило ее отметать ????</div><div><br /></div><div>Поэтому начинайте с более простых вопросов, особенно если есть подозрение, что ошибка простая и контекст ИИ не пригодится. А вот если простой вопрос не помог, то можно добавить контекста (у меня падает при сборке мавеном...)</div><div><br /></div><div><br /></div><div><i style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">PS — эта статья написана в помощь студентам моего курса «</i><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><i><a href="https://testbase.ru/learn/chatgpt" style="color: #336699; text-decoration: none;" target="_blank">Применение ChatGPT в тестировании</a>»</i></span><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">&nbsp;</span></div><div><br /></div>]]></description>
<link>http://okiseleva.blogspot.com/2026/07/blog-post.html</link>
<pubDate>Thu, 16 Jul 2026 17:22:34 +0300</pubDate>
</item>
<item>
<title>Типы границ для классов эквивалентности</title>
<description><![CDATA[<p>Автор: <a href="https://software-testing.ru//edu/tutor/5" mce_href="https://software-testing.ru/edu/tutor/5">Ольга Назина (Киселёва)</a>, автор курса&nbsp;<a href="https://software-testing.ru/edu/3-online/56-school-for-beginer" mce_href="https://software-testing.ru/edu/3-online/56-school-for-beginer">Школа для начинающих тестировщиков</a></p>
<div xmlns="http://www.w3.org/1999/xhtml"><img src="https://software-testing.ru/images/stories/library/11hs/equivalence-classes/equivalence-classes1.png" mce_src="https://software-testing.ru/images/stories/library/11hs/equivalence-classes/equivalence-classes1.png" width="500" mce_style="float: left;" style="float: left;" /><p>Про типы границ я впервые услышала на тренинге Алексея Баранцева. Зачем они нужны? Да просто чтобы не забыть всё проверить. Написал чек-лист, потом проверяешь себя:</p><p>— Все учел? Вот эти классы эквивалентности, какие границы логические? А какие технологические? ...</p><p>Так можно вспомнить о проверке, про которую забыл или просто не подумал! Полезная штука.</p><p>Алексей дал нам тогда про такую типизацию границ:</p><ul><li><p><strong>Физическая</strong> — которую физически нельзя преодолеть. </p></li><li><p><strong>Логическая</strong> — ограничение, накладываемое логикой, не программой.</p></li><li><p><strong>Технологическая</strong> — ограничение, накладываемое используемой технологией.</p></li><li><p><strong>Произвольная</strong> —&nbsp;ограничение, наложенное аналитиком или заказчиком.</p>]]></description>
<link>https://software-testing.ru/library/testing/test-analysis/4527-types-of-boundaries-for-equivalence-classes</link>
<pubDate>Tue, 14 Jul 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Начинаем работу с мутационным тестированием</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/mutation-testing2.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/mutation-testing2.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Баз Дейкстра (Bas Dijkstra)<br /><strong><a href="https://www.ontestautomation.com/on-getting-started-with-mutation-testing/" mce_href="https://www.ontestautomation.com/on-getting-started-with-mutation-testing/" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод: </strong>Ольга Алифанова</p><p>Как участники команды разработки программного обеспечения, мы тратим много времени на создание продуктов, от которых наши конечные пользователи (надеюсь) получают удовольствие. Мы также тратим значительное время на тестирование этих продуктов, а также на создание автоматизации, поддерживающей это тестирование. И чем выше степень автоматизации в процессе сборки, развертывания и доставки, тем больше доверия мы возлагаем на результаты этих автоматизированных тестов.</p>
<p>Во всём этом нет ничего нового: автоматизация тестирования, пайплайны сборки и практики вроде непрерывной интеграции уже давно часть нашей работы. Так почему же тогда, несмотря на высокий уровень доверия к автоматизированным тестам, команды (или, по крайней мере, те, с которыми мне доводилось работать) обычно тратят гораздо меньше времени на получение информации о качестве этих самы-х тестов?</p>]]></description>
<link>https://software-testing.ru/library/testing/other-testing/4499-on-getting-started-with-mutation-testing</link>
<pubDate>Sun, 12 Jul 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Настраиваем IDEA с ИИ, уточняем теорию, часть 3</title>
<description><![CDATA[<p>&nbsp;<i>С вами рубрика «где тестировщик может применять ИИ в своей работе»!</i></p><p>Я вроде уже настроила компьютер с помощью ИИ (начинала <a href="https://okiseleva.blogspot.com/2026/06/ide.html" target="_blank">тут</a>). Но все равно иногда всплывают моментики, которые я раньше бы спрашивала у своего куратора, а сейчас — у ИИ. Вот очередная пачка вопросов роботу, для вдохновения, с чем к нему вообще можно приходить.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLzkoVjOZqujQgVt9TIaS9ZbkR7Z2oHcnRfTOau7Cg816YKDOZUe3j-HXcwkoUaKgYo-sTpCyrkU7NPoTEn2IMsbDEUwiw9GI-hQErS9ertqTqhWu7KPGSzsd46FQ0sIeW52PCkflfZXI9h4-MKY0FnHQ47wj4xOjcijydWJS5w1NxW2MXjg3u_Kc1cWk/s2996/4_1_Anna_%D0%9D%D0%B5%20%D0%B1%D0%BE%D0%B9%D1%81%D1%8F,%20%D1%8F%20%D1%82%D0%B5%D0%B1%D0%B5%20%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D1%83.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2491" data-original-width="2996" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLzkoVjOZqujQgVt9TIaS9ZbkR7Z2oHcnRfTOau7Cg816YKDOZUe3j-HXcwkoUaKgYo-sTpCyrkU7NPoTEn2IMsbDEUwiw9GI-hQErS9ertqTqhWu7KPGSzsd46FQ0sIeW52PCkflfZXI9h4-MKY0FnHQ47wj4xOjcijydWJS5w1NxW2MXjg3u_Kc1cWk/s320/4_1_Anna_%D0%9D%D0%B5%20%D0%B1%D0%BE%D0%B9%D1%81%D1%8F,%20%D1%8F%20%D1%82%D0%B5%D0%B1%D0%B5%20%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D1%83.png" width="320" /></a></div><br /><p><br /></p><h3 style="text-align: left;">1. Как отменить настройку в IDE?</h3><p>Тыкнула в эксель-файлик в Giga IDE, он предложил прочитать его как текстовый, я сдуру и согласилась. А там все очень плохо с отображением таких файлов, если что))</p><p>Но теперь, тыкая на любой эксельник, он открывается в ИДЕ криво-косо. И тут или страдать (Open in explorer, чтобы открылась виндовая папка, открывать в ней), или изменить настройку. А где?&nbsp;</p><span><a name='more'></a></span><p>Отличный вопрос для ИИ! Прям так ему и пишем — что сделали и вопрос "как исправить":</p><p></p><blockquote><p>я сказала гига иде открыть эксель файл как текстовый, где поменять эту настройку, чтобы открывалось через строннее приложение (через эксель), а не через ИДЕ?</p><p></p></blockquote><p>ИИ выдал пошаговую инструкцию:</p><p></p><blockquote><p>Чтобы вернуть настройки и сделать так, чтобы Excel-файлы (<code>.xlsx</code>, <code>.xls</code>) открывались в системном приложении (MS Excel, LibreOffice и т.д.), а не как текст внутри Giga IDE, вам нужно изменить ассоциации файлов в настройках.<br /><br />Вот пошаговая инструкция, как это сделать:<br /><br /><b>Шаг 1. Откройте настройки</b><br /><br />• Нажмите <code>Ctrl + Alt + S</code> (на Windows/Linux) или <code>Cmd + ,</code> (на macOS).<br /><br />• Или перейдите через верхнее меню: <code>File</code> (Файл) -&gt; <code>Settings</code> (Настройки).<br /><br /><b>Шаг 2. Перейдите в раздел «Типы файлов»</b><br /><br />1. В левой колонке настроек разверните узел <code>Editor</code> (Редактор).<br /><br />2. Выберите пункт <code>File Types</code> (Типы файлов).</p><p>...</p></blockquote><p>По сути эти шаги самые важные — где эти настройки найти. Ну очень удобно с ИИ, конечно, потому что нагуглить такие вопросы настройки обычно сложно, надо читать огроные инструкции.</p><p><br /></p><p><br /></p><h3 style="text-align: left;">2. Как в гига иде поискать по названию класса?</h3><p>Собственно, весь вопрос в заголовке. Я раньше часто искала через название класса, руки помнили горячие клавиши, сейчас отвыкла и забыла все. Можно найти самой, прошерстерив менюшки программы, но зачем, когда под рукой есть чатик?</p><p></p><blockquote>как в гига иде поискать по названию класса?</blockquote><p></p><p><br /></p><p>ИИ ответил подробно, даже пару способов поиска привел, но меня интересовал вот этот кусочек:</p><p></p><blockquote>Этот способ ищет <b>только среди классов, интерфейсов и enum</b>, игнорируя обычные файлы и текст.<br /><br />• <b>Windows / Linux:</b> <code>Ctrl + N</code></blockquote><p>Так как я не перекрывала базовые настройки ИДЕ, то у меня срабатывают все подсказываемые комбинации горячих клавиш. И блин, как удобно иметь ИИ под боком в таких ситуациях! Не надо отвлекать коллег, не надо гуглить, спросил и сразу получил ответ!</p><p><br /></p><p><br /></p><h3>3. Что значит опция в гит-команде?</h3><div>Давно ничего не коммитила, подзабыла как это делается. Плюс у нас обновились иснтрукцию по созданию бранчей и коммитов туда. Вот, например, перед пушем теперь делаем пуш с&nbsp;--dry-run. А что это такое?</div><div><br /></div><div>Раньше был путь погуглить, теперь у меня для этого есть волшебный чатик:</div><div><br /></div><div><br /></div><div><blockquote>что значит Тестовый push с dry-run ?<br /><br />git push origin --dry-run</blockquote></div><div>И, пожалуйста, порция теории по моему вопросу!</div><p></p><blockquote><p>Флаг <code>--dry-run</code> (в переводе «пробный прогон» или «сухая тренировка») — это режим <b>безопасной проверки</b>.<br /><br />Когда вы выполняете <code>git push origin --dry-run</code>, Git <b>не отправляет</b> ваши коммиты на сервер. Вместо этого он имитирует процесс отправки и показывает вам, <b>что именно</b> он собирался бы сделать, если бы вы запустили реальную команду.<br /><br /><b>Зачем это нужно?</b><br /><br />Это отличный способ избежать ошибок перед важным пушем. Git покажет:<br /><br />1. Какие ветки он собирается обновить.<br /><br />2. Какие коммиты будут добавлены.<br /><br />3. Какие теги будут отправлены.<br /><br />4. Будут ли какие-то конфликты или ошибки доступа, не меняя ничего на самом сервере.<br /><br /><b>Пример того, что вы увидите в терминале:</b></p><p><b>...</b></p><p><b>Когда стоит использовать:</b></p><p><b>...</b></p><p><b>Короткий итог:</b> Это команда <b>«покажи, что будет, если я это сделаю, но ничего не меняй»</b>. Самый безопасный способ убедиться, что вы пушите именно то, что нужно.</p></blockquote><p></p><p><br /></p><p>В коммите нужен флаг -a, его если и помнила, то забыла. Снова к чату:</p><p></p><blockquote>git commit -a -m <br /><br />а что значит "-а"?</blockquote><p>Тут ответ приводить не буду, но смысл понятен — видишь что-то незнакомое, спроси чат! Если не понял ответ, можно так и сказать "я не поняла, зачем эта опция, покажи с примером"</p><p><i style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">PS — эта статья написана в помощь студентам моего курса «</i><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="color: #333333;"><span style="font-size: 14.85px;"><i><a href="https://testbase.ru/learn/chatgpt" target="_blank">Применение ChatGPT в тестировании</a>»</i></span></span>&nbsp;</p><p></p><code></code><p></p><p></p>]]></description>
<link>http://okiseleva.blogspot.com/2026/07/idea-3.html</link>
<pubDate>Fri, 10 Jul 2026 15:15:29 +0300</pubDate>
</item>
<item>
<title>5 промтов, которые сэкономили мне часы рутинной работы тестировщика</title>
<description><![CDATA[<p>Автор: Екатерина Гаврилова (QA Tech Lead в MD Audit)</p><p>Сегодня бы не будем говорить о банальностях типа чек-листов и тест кейсах. Эта база, я о ней уже писала <a href="https://software-testing.ru/library/testing/general-testing/4477-ii" mce_href="https://software-testing.ru/library/testing/general-testing/4477-ii" style="">коротко</a> и даже <a href="https://software-testing.ru/library/testing/testing-tools/4488-ii" mce_href="https://software-testing.ru/library/testing/testing-tools/4488-ii" style="">длинно</a>.   Речь пойдет именно о тех интересных вариациях использования нейросети, которые я не видела или не нашла.</p>]]></description>
<link>https://software-testing.ru/library/testing/other-testing/4526-ii</link>
<pubDate>Wed, 08 Jul 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Как маркетологу готовить сайты и приложения к акциям – и почему нельзя слепо доверять своим айтишникам</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p>Хочу поговорить о вещи, которую маркетологи часто упускают из виду, – <span class='font-weight-bold'>о тестировании площадок, куда мы гоним трафик.</span> Делюсь личным опытом. Раньше я, как и многие в маркетинге, не придавала тестированию большого значения. В отделе и так голова кругом: гениальные идеи от продажников, гипотезы от стажёров, десятки проектов одновременно – лишь бы всё успеть.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Всё поменялось, когда я пришла маркетологом в «Лабораторию качества» – компанию, которая давно работает на IT‑рынке и специализируется на обеспечении качества ПО, сайтов и приложений. Погружаясь в <a href="https://quality-lab.ru/outsourcing/" data-type="page" data-id="26">QA‑услуги</a>, я всё чётче видела, насколько это ценный инструмент для маркетолога. Жаль, что раньше мне никто не подсказал: нельзя полностью полагаться на IT. Сколько проблем можно было избежать! Сбои во время рекламных кампаний, падение функционала в самый горячий момент – всё это било по бюджету и репутации. <span class='font-weight-bold'>А ведь достаточно было просто проверить площадку для приёма трафика под нагрузкой.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">История о том, как наша реклама обвалила сайт федерального билетного оператора</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Объясню на конкретном кейсе. В 2023 году в Белгороде появился новый парк аттракционов «Калейдоскоп», и отдел, который я возглавляла на тот момент, курировал открытие и продвижение этого объекта.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Руководством было принято решение раздать билеты на торжественное открытие парка бесплатно. При этом нужно было всё грамотно организовать, чтобы не случилось коллапса и никто не чувствовал себя обиженным. Для этого разработали лендинг, продумали рекламную и коммуникационную кампании. С помощью посевов в региональных сообществах в соцсетях мы заранее сообщали дату бронирования билетов и подробно объясняли условия. Сами билеты можно было забронировать <a href="https://belgorod.kassir.ru/festivali/ootkryitie-parka-attraktsionov-v-belgorode-kaleydoskop" rel="nofollow">в системе Kassir</a> – не более трёх в одни руки.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В начале всё шло хорошо. Я лично зашла в кабинет к нашим разработчикам и спросила, выдержит ли лендинг нагрузку. Конечно же, мне ответили в духе: </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p>«Иди решай свои гуманитарные вопросы, не лезь к технарям. Давайте пусть каждый будет заниматься своим делом». </p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:paragraph --></p>
<p>Убедившись, что все понимают: трафик будет большим и лендинг должен его выдержать, – я спокойно делегировала им технические задачи и отправилась разгребать вопросы в отделе. Наш менеджер в Kassir также была со мной на связи и доброжелательно ответила, что на их стороне всё готово (хах, они явно не рассчитывали на то, что трафик из небольшого областного центра сможет обвалить федеральную систему). </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Мы приступили к запуску и дальше ситуация развивалась стремительно.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>2 августа в 14:30</span> мы объявили о начале брони билетов.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>В 14:37 наш лендинг сначала затормозил, а потом обвалился. </span>Потом заработал – и снова обвалился. И так несколько раз: полная катастрофа.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Затем произошло то, чего мы точно не ожидали: <span class='font-weight-bold'>белгородский трафик обвалил kassir.ru. Это было легендарно и ужасно одновременно. </span>Только те маркетологи меня поймут, кто испытывал нечто похожее.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#ffdbe4"}}} --></p>
<p class="has-background" style="background-color:#ffdbe4"><span class='font-weight-bold'>Всего за 37 минут, несмотря ни на что, все бесплатные билеты были забронированы. И на нас полился шквал негатива от обиженных людей, так как они посчитали, что столкнулись не с техническими сбоями, а с обманом и хитростями со стороны организаторов. Две‑три ночи мне не спалось от зашкаливающего адреналина и прокручивания ситуации в голове.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30657,"width":"448px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="529" height="478" src="https://quality-lab.ru/wp-content/uploads/2026/07/%D0%9D%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BE%D1%87%D0%BD%D0%BE%D0%B5-%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BB%D1%8F-%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%BE%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2-1.png" alt="Нагрузочное-тестирование-для-маркетологов" class="wp-image-30657" style="width:448px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/Нагрузочное-тестирование-для-маркетологов-1.png 529w, https://quality-lab.ru/wp-content/uploads/2026/07/Нагрузочное-тестирование-для-маркетологов-1-300x271.png 300w" sizes="(max-width: 529px) 100vw, 529px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30658,"width":"332px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="539" height="603" src="https://quality-lab.ru/wp-content/uploads/2026/07/%D0%BD%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BE%D1%87%D0%BD%D0%BE%D0%B5-%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BB%D1%8F-%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%BE%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2-2.png" alt="нагрузочное-тестирование-для-маркетологов" class="wp-image-30658" style="width:332px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/нагрузочное-тестирование-для-маркетологов-2.png 539w, https://quality-lab.ru/wp-content/uploads/2026/07/нагрузочное-тестирование-для-маркетологов-2-268x300.png 268w" sizes="(max-width: 539px) 100vw, 539px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Тогда я не знала, что всего этого можно было бы избежать, если бы IT‑служба и моей компании, и сервиса Kassir.ru заранее провела тестирование под нагрузкой. Как мы помним, незнание не освобождает от ответственности. Это правило, к сожалению, работает не только в правовом поле, но и в коммуникационном.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Нужно было что‑то решать. Мы договорились с руководством и для снижения градуса негатива решили раздать ещё 500 билетов, заранее объяснив ситуацию: могут быть сбои, это не обман, а издержки цифровизации. Мы сообщили, что, если желающих снова будет несколько тысяч одновременно, то сайт, к сожалению, может вновь не выдержать такой нагрузки. Тем более что операторы Kassir.ru уже предупредили нас об этом. Вторая волна тоже не прошла без происшествий, но поток негатива всё равно удалось остановить.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Почему не стоит всё перекладывать на IT-службу?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Да, как руководитель отдела продвижения, я не была виновата в произошедшем. Но сейчас, понимая, что всё можно было исправить, просто заранее подняв вопрос о <span class='font-weight-bold'>нагрузочном тестировании</span>, становится грустно.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Именно поэтому я считаю, что <span class='font-weight-bold'>каждый маркетолог, который продвигает <a href="https://quality-lab.ru/blog/5-smertnykh-grekhov-podgotovki-k-black-friday/" data-type="post" data-id="28544">маркетплейсы</a>, сайты, приложения и другие цифровые продукты, просто обязан углубиться в QA</span>. Нужно понимать, как подготовить площадку к приёму трафика не только с точки зрения дизайна, контента, CTA и механик привлечения, но и с технической стороны. Мы заинтересованы в устойчивости во время рекламных кампаний и распродаж как никто другой. Так давайте брать бразды правления в свои руки!</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30659,"width":"230px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="683" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/9ec9fd01-172c-438b-baaf-b711186c15d6-Photoroom_11zon-683x1024.png" alt="нагрузочное тестирование" class="wp-image-30659" style="width:230px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/9ec9fd01-172c-438b-baaf-b711186c15d6-Photoroom_11zon-683x1024.png 683w, https://quality-lab.ru/wp-content/uploads/2026/07/9ec9fd01-172c-438b-baaf-b711186c15d6-Photoroom_11zon-200x300.png 200w, https://quality-lab.ru/wp-content/uploads/2026/07/9ec9fd01-172c-438b-baaf-b711186c15d6-Photoroom_11zon-768x1152.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/9ec9fd01-172c-438b-baaf-b711186c15d6-Photoroom_11zon.png 1024w" sizes="(max-width: 683px) 100vw, 683px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Мы всегда отвечаем за трафик, но не всегда – за готовность сайта к пиковым нагрузкам. При этом, если лендинг, корзина, промо‑механика или форма заявки ломаются во время кампании, бюджет и все усилия сливаются мгновенно. Перекладывать низкую конверсию и провал маркетинговых активностей на айтишников глупо. Вот и думайте, кто должен заранее предусмотреть ресурсы на тестирование и обеспечить его проведение.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Когда я пришла в сферу качества, первое, что перевернулось у меня в голове, – это понимание: в тот злополучный день программист мне не врал, когда говорил, что всё будет хорошо. Это был честный ответ человека, который не понимал толком масштаба. Ведь внутренний IT отвечает за то, чтобы система работала «в обычном режиме». День ото дня штатная нагрузка предсказуема, и под неё всё настроено. А распродажа или вирусная акция – это не обычный режим, а аномалия, которой по умолчанию нет в их картине мира.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>И вот между этими двумя зонами – провал. Маркетологи обычно думают, что техническое состояние сайта – это зона ответственности IT. При этом айтишники думают, что всё будет нормально, потому что не догадываются о масштабе трафика. Да что там айтишники – и сам маркетинг порой может только догадываться, насколько сильно выстрелит та или иная реклама.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30660,"width":"284px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/86b911fa-b60a-4820-8361-68fd4b3793b2-Photoroom_11zon.png" alt="нагрузочное тестирование" class="wp-image-30660" style="width:284px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/86b911fa-b60a-4820-8361-68fd4b3793b2-Photoroom_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/86b911fa-b60a-4820-8361-68fd4b3793b2-Photoroom_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/86b911fa-b60a-4820-8361-68fd4b3793b2-Photoroom_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/07/86b911fa-b60a-4820-8361-68fd4b3793b2-Photoroom_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Я ни в коем случае не говорю, что внутренний IT – это плохо или что им нельзя доверять. Доверять нужно: это наши люди, они знают внутреннюю систему лучше любого подрядчика. Я говорю о другом: перед крупными запусками одного доверия мало – нужна проверка.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Где тонко, там и рвётся</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Я попросила одного из ведущих тестировщиков нашей компании помочь разобраться, в каких местах чаще всего происходят сбои во время пиковых нагрузок и почему это важно знать маркетологам. Делюсь списком с вами.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Форма заявки и регистрация. </span>Это самое слабое звено: записать данные в базу всегда сложнее, чем просто их показать. Когда на сайт одновременно заходит много людей, форма начинает сбоить – а хуже всего, если из‑за сбоя появляются дубли. Для маркетинга это прямой удар по качеству лидов.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":2} --></p>
<ol start="2" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Корзина и оформление заказа. </span>Тут завязано сразу много процессов: надо проверить, есть ли товар, зарезервировать его, несколько раз сходить в базу. Если блок падает, теряются реальные деньги – те самые, которые уже почти дошли до кассы.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":3} --></p>
<ol start="3" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Промо‑механика. </span>Промокоды, счётчики, лимиты «один в руки» – на первый взгляд мелочи, а на деле зона повышенного риска. При всплеске трафика система может случайно выдать один бонус дважды или показать отрицательный остаток. Я видела случай, когда из‑за этого сгорел бюджет на промо.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":4} --></p>
<ol start="4" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Платёжный шлюз и интеграции. </span>У платёжных сервисов есть жёсткие лимиты на количество запросов в секунду. Даже если ваш сайт работает без сбоев, оплата может не проходить просто потому, что вы упёрлись в ограничения партнёра. Для маркетинга это значит: трафик есть, интерес есть, а конверсия падает по техническим причинам.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":5} --></p>
<ol start="5" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Сторонние скрипты. </span>Чаты, виджеты, аналитика, рекомендательные блоки – всё это тянет ресурсы с чужих серверов. В пиковый момент такой скрипт может зависнуть и «положить» сайт. Результат – посетители уходят, а вы теряете конверсию.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":6} --></p>
<ol start="6" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Капча, авторизация, СМС‑коды.</span> Если на сайт одновременно приходит волна регистраций, сервисы рассылок быстро упираются в лимиты. Люди не получают коды подтверждения и не могут завершить регистрацию. С точки зрения маркетинга это выглядит как потеря интереса аудитории, хотя проблема чисто техническая.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":7} --></p>
<ol start="7" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Автомасштабирование не успевает за трафиком. </span>Облако действительно умеет добавлять мощности, но не мгновенно. Если все заходят в одну минуту – например, сразу после запуска рекламы, – сервис может упасть раньше, чем инфраструктура успеет нарастить ресурсы. А значит, пик трафика, на который вы рассчитывали, пройдёт впустую.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><em><span class='font-weight-bold'>Да, проблем много, но решение есть. Всё это можно обнаружить вовремя, если проверить поведение системы под конкретным профилем нагрузки.</span></em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Что такое нагрузочное тестирование и зачем это маркетологам?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Расскажу так, как мне самой объяснили, когда я ещё особо ничего не понимала.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><a href="https://quality-lab.ru/blog/kak-nagruzochnoe-testirovanie-zashhishhaet-biznes-ot-ubytkov/" data-type="post" data-id="29802">Нагрузочное тестирование</a> – это когда вашу систему специально нагружают. Есть инструменты, которые имитирует тысячи и десятки тысяч виртуальных пользователей. Они одновременно ходят по сайту, выполняя реальные пользовательские сценарии: переходят по ссылкам, добавляют товары в корзину, вводят промокоды и т.д. Задача такой проверки &#8212; обнаружить где, что и когда начнёт отказывать или сбоить.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Видов нагрузочного тестирования несколько, и все они отвечают на разные вопросы:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:table --></p>
<figure class="wp-block-table">
<table class="has-fixed-layout">
<tbody>
<tr>
<td><span class='font-weight-bold'>Вид тестирования</span></td>
<td><span class='font-weight-bold'>Суть для маркетологов</span></td>
</tr>
<tr>
<td>Нагрузочное тестирование (load)</td>
<td>Выполняется, когд нужно понять, выдержит ли система трафик во время акции. Для маркетолога это страховка: вы заранее знаете, потянет ли сайт ожидаемый приток пользователей</td>
</tr>
<tr>
<td>Стресс‑тест (stress)</td>
<td>Задача – найти точку, где система ломается. Нагрузку повышают и создают буквально экстремальные условия, пока сервис не начнёт сбоить. Так вы узнаёте реальный потолок возможностей ваших IT-продуктов до того, как столкнётесь с этим в реальности</td>
</tr>
<tr>
<td>Пиковая нагрузка (spike)</td>
<td>Проверяем сценарий «все пришли в одну минуту» – как бывает после рассылки, пуша или поста у крупного блогера. Именно такой резкий всплеск чаще всего срывает акции, и тест помогает к нему подготовиться</td>
</tr>
<tr>
<td>Тест стабильности (soak)</td>
<td>Смотрим, как система ведёт себя при долгой нагрузке – например, в течение недельной распродажи. Так выявляют проблемы, которые не проявляются сразу: утечки памяти, постепенное накопление сбоев</td>
</tr>
<tr>
<td>Объёмное тестирование (volume)</td>
<td>Выясняем, как сервис справляется, когда в базе не тысяча заявок, а миллион. К концу большой акции база сильно разрастается – и функционал, который отлично работал в начале, может сильно замедлиться</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph --></p>
<p>Главное – получить не просто «всё ок» или «всё плохо», а чёткие цифры. Например: система стабильно держит 8000 одновременных пользователей, при 11 000 начинает тормозить корзина, при 14 000 перестаёт работать оформление заказа. Узкое место – пул соединений к базе данных, на восстановление после пика нужно около двух минут.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>С такими данными вы уже не гадаете, а управляете рисками. Знаете свой потолок – и можете заранее что‑то сделать: нарастить мощности перед акцией, растянуть рассылку по времени, добавить очередь ожидания. Или хотя бы честно сказать руководству, на какой нагрузке система начнёт сбоить.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">На какие метрики нужно ориентироваться?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>А теперь секретное оружие. Я дам вам всего несколько слов, которые позволят разговаривать с айтишниками на одном языке и понимать, что вам показывают. Запомните эти термины.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>RPS (запросов в секунду) </span>– показывает, сколько обращений система обрабатывает за секунду. Простая, но надёжная оценка пропускной способности. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Зачем маркетологу:</span> помогает понять, выдержит ли сайт всплеск трафика во время акции – и не потеряет ли компания деньги из‑за того, что система «не потянет» наплыв пользователей.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Время отклика</span> – сколько уходит на ответ пользователю. Тут важно не ориентироваться на среднее значение: оно может скрывать проблемы. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Зачем маркетологу: </span>напрямую влияет на конверсию: если страница грузится долго, люди уходят, и рекламный бюджет сгорает впустую.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Перцентили (p95, p99)</span> – самый полезный показатель. Например, p95 = 2 секунды значит, что 95 % пользователей получают ответ быстрее, а 5 % ждут дольше. Если смотреть только на среднее, можно не заметить, что часть клиентов подолгу висит на загрузке – и терять премиальный трафик. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Зачем маркетологу:</span> позволяет увидеть реальную картину пользовательского опыта: даже если в среднем всё выглядит хорошо, отдельные группы аудитории могут сталкиваться с серьёзными задержками – и это бьёт по репутации и продажам.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Error rate (доля ошибок) </span>– процент запросов, которые завершились ошибкой под нагрузкой. Добиться нуля почти невозможно, но важно заранее определить, какой уровень ошибок для вас допустим. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Зачем маркетологу:</span> даёт чёткое понимание, сколько потенциальных клиентов реально теряют из‑за технических сбоев, – и помогает обосновать необходимость доработки или масштабирования перед запуском кампании.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Точка деградации </span>– момент, когда система начинает работать хуже. Это ключевая цифра в отчёте: именно она показывает реальный предел возможностей. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Зачем маркетологу: </span>позволяет заранее спланировать риски: если пик трафика может превысить этот порог, можно либо усилить инфраструктуру, либо скорректировать план продвижения – например, растянуть рассылку по времени.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Время восстановления</span> – как быстро система возвращается к нормальной работе после пика. Если она «отходит» полчаса после спада нагрузки, акция всё равно будет испорчена. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Зачем маркетологу:</span> критично для оценки устойчивости бизнеса к сбоям: даже кратковременный простой может стоить компании тысяч упущенных заказов, а долгое восстановление – усугубить негатив и снизить доверие аудитории.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Чек-лист: как подготовить площадку перед запуском акции, распродажи или рекламной кампании</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30661,"width":"245px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="683" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/0939dfd1-0993-4a46-b1ca-b44d02b2e03b-Photoroom_11zon-683x1024.png" alt="стресс тестирование" class="wp-image-30661" style="width:245px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/0939dfd1-0993-4a46-b1ca-b44d02b2e03b-Photoroom_11zon-683x1024.png 683w, https://quality-lab.ru/wp-content/uploads/2026/07/0939dfd1-0993-4a46-b1ca-b44d02b2e03b-Photoroom_11zon-200x300.png 200w, https://quality-lab.ru/wp-content/uploads/2026/07/0939dfd1-0993-4a46-b1ca-b44d02b2e03b-Photoroom_11zon-768x1152.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/0939dfd1-0993-4a46-b1ca-b44d02b2e03b-Photoroom_11zon.png 1024w" sizes="(max-width: 683px) 100vw, 683px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Это то, что спасёт вас от сбоев, проблем и головной боли. Главное –  спланировать и подготовить всё заранее. Даю вам рабочий таймлайн, проверенный на опыте.<br><br>Для тестирования используют разные <a href="https://quality-lab.ru/blog/lluchshie-instrumenty-i-strategii-nagruzochnogo-testirovaniya-rukovodstvo-dlya-cto/" data-type="post" data-id="28611">инструменты</a> – чаще всего JMeter, k6, Gatling, Locust, Яндекс Танк. Из более серьёзных решений – LoadRunner и NeoLoad. Маркетологу не нужно в них разбираться. Достаточно уметь задать простой вопрос: «Каким инструментом, по каким сценариям проверяли и какие цифры получили?» <br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>За 3–4 недели до старта:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Просчитайте пик нагрузки. Не пишите «будет много людей», а выведите точные цифры: сколько пользователей, с каких каналов, какой ожидается максимальный наплыв пользователей. Это основа для всех расчётов – без этих данных IT ничего не проверит.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Опишите, что будет делать пользователь во время акции: как зайдёт на сайт, как найдёт товар, как добавит в корзину и т.д. (всё зависит от конкретно вашего пользовательского пути – чем конкретнее пропишите, рем реальнее будет симуляция нагрузки).</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Заранее согласуйте бюджет на тестирование, особенно, если в вашей компании нет QA-инженеров.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>За 2 недели:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Проведите нагрузочное и стресс‑тестирование на копии системы (на стенде, как называют его в IT). Получите чёткие данные, где именно система начнёт сбоить.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Отдельно прогоните сценарий резкого наплыва (spike) – когда все заходят одновременно. Сбои из-за пиковых нагрузок особенно распространены при запуске рекламы.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Проверьте не только сайт, но и все внешние сервисы: платёжную систему, СМС‑рассылки, капчу и так далее. Учитывайте, что у каждого свои лимиты – сбой может случиться на любом участке.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>За неделю:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Вместе с IT устраните узкие места или осознанно сократите планируемый поток пользователей. Главное – действуйте на основе данных, а не наугад.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>После всех правок обязательно ещё раз всё протестируйте. Убедитесь, что проблемы реально удалось решить.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Настройте мониторинг и оповещения на день акции. В момент запуска следите за тем, что происходит, в реальном времени – не ждите, пока о сбое напишут в комментариях.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>В день акции</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Держите рядом дежурного от IT – не просто «на телефоне», а по‑настоящему на связи и готового сразу реагировать.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Заранее продумайте план Б на случай сбоя: страница‑заглушка с понятным текстом, очередь ожидания, запасной канал для связи с аудиторией. Если сбой грамотно обработать, удар по репутации будет куда меньше, чем от полной тишины и ошибки 502.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">А кто, собственно, должен платить за тестирование?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Перехожу к неудобному вопросу: <span class='font-weight-bold'>из какого бюджета должны идти деньги на тестирование?</span> IT не закладывает, потому что для них стабильность систем во время акций и распродаж не входит в KPI. Маркетинг не закладывает, потому что считает, что ещё только технических вопросов им не хватает ко всем прочим.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Давайте посмотрим на это трезво. <span class='font-weight-bold'>Запуск акции или распродажи без нагрузочного тестирования – крупный финансовый риск, и отвечает за провал именно маркетинг.</span> Если в момент кампании отваливается лендинг, корзина, промо‑механика или форма заявки, то бюджет на трафик сгорает в никуда. Я это видела своими глазами и заплатила за это собственными нервами. Защищает от такого риска только одна вещь – нагрузочное тестирование.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Стоимость проверки по нагрузкой под конкретное событие почти всегда намного меньше рекламного бюджета. Мы вкладываем сотни тысяч рублей в охваты – и не думаем о том, что можно вложить долю процента от этой суммы, чтобы гарантировать зашиту от слива денег и негатива пользователей.</span></p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30662,"width":"224px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="683" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/47816629-63f6-4fde-9236-2ec1ebec894d-Photoroom_11zon-683x1024.png" alt="нагрузочная проверка сайта" class="wp-image-30662" style="width:224px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/47816629-63f6-4fde-9236-2ec1ebec894d-Photoroom_11zon-683x1024.png 683w, https://quality-lab.ru/wp-content/uploads/2026/07/47816629-63f6-4fde-9236-2ec1ebec894d-Photoroom_11zon-200x300.png 200w, https://quality-lab.ru/wp-content/uploads/2026/07/47816629-63f6-4fde-9236-2ec1ebec894d-Photoroom_11zon-768x1152.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/47816629-63f6-4fde-9236-2ec1ebec894d-Photoroom_11zon.png 1024w" sizes="(max-width: 683px) 100vw, 683px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Мой вывод простой: раз ответственность за результат кампании лежит на маркетинге, значит, и инициатива проверить готовность инфраструктуры и заложить на это бюджет – тоже на нас. Не потому, что маркетологи теперь должны разбираться ещё и в графиках RPS. А потому, что больше об этом заранее никто не подумает, а отвечать перед руководством за провал приходится нам.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Ещё одна мысль, которую я вынесла дорогой ценой: <span class='font-weight-bold'>под крупные события внутренний IT стоит усиливать <a href="https://quality-lab.ru/blog/shtat-gibrid-ili-autsors-testirovaniya-chestnyj-razbor-ekonomiki-qa-komand-v-2026/" data-type="post" data-id="29877">внешними тестировщиками</a></span>. Как это проверить? Сходите и поговорите с ними на тему этой статьи. Если увидите непонимание в глазах ваших разрабов или активное сопротивление, то задуматься точно стоит. У внутренней команды глаз замылен, да и узкоспециализированных компетенций по нагрузке часто нет – это отдельная профессия. У подрядчика есть и нужные инструменты, и опыт работы с сотнями похожих кейсов, ну и привлекать их можно время от времени, только при случае необходимости.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">По итогу</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Выдержит ли сайт или приложение прирост трафика? Это можно узнать заранее: предупреждён – значит вооружён. Нагрузочное тестирование даёт гарантию и понимание ситуации. С ним вы управляете рисками, а без него – тратите нервы, которых у нас в маркетинге и так не хватает. Доверяйте внутреннему IT, но перед крупными событиями лучше привлечь подрядчика по тестированию нагрузки – и заранее заложить бюджет на QA‑услуги. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>Чтобы рассчитать стоимость нагрузочного тестирования именно для вашего проекта, запишитесь на бесплатную консультацию. Вы получите подробный разбор вашего кейса и конкретную сумму для планирования рекламного бюджета.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:latest-posts /--></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>]]></description>
<link>https://quality-lab.ru/blog/kak-marketologu-gotovit-sajty-i-prilozheniya-k-akciyam-i-pochemu-nelzya-slepo-doveryat-svoim-ajtishnikam/</link>
<pubDate>Wed, 08 Jul 2026 16:47:02 +0300</pubDate>
</item>
<item>
<title>Как убрать поп-ап с параметром в ТeamСity</title>
<description><![CDATA[<p>Столкнулась с такой проблемой — заходишь в&nbsp;ТeamСity (он же ТС) запустить деплой на тестовый контур, нажимаешь «Run», а тебе вылезает поп-ап окно «А вот этот параметр вы какой ожидаете?».</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTFLnrW2PuH7vKUJKRuAEsoi9Okfu3SpQYs4S2wKwHfIBgRoPyS4BuhOIpLuvsvEJT4hrXwOYZDGjsEeXP9qIs2269uWLQEiKYH428aJPGca09tH8Q4tfCEvDwt9Tpi9WozfzFeJoSb2csRowgNLNZ_AVBHwy6NEv_ZEHhKPrg5AReG-dF0zaAAOwe6gQ/s2436/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1081" data-original-width="2436" height="142" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTFLnrW2PuH7vKUJKRuAEsoi9Okfu3SpQYs4S2wKwHfIBgRoPyS4BuhOIpLuvsvEJT4hrXwOYZDGjsEeXP9qIs2269uWLQEiKYH428aJPGca09tH8Q4tfCEvDwt9Tpi9WozfzFeJoSb2csRowgNLNZ_AVBHwy6NEv_ZEHhKPrg5AReG-dF0zaAAOwe6gQ/s320/1.png" width="320" /></a></div><p>Когда-то это было оправданно, кнопка деплоит два сервера приложений, а иногда нужно обновить только один из них. Вот система и уточняет, надо ли обновлять второй, или лучше сэкономить время. Удобно!</p><p>Но со временем отпала необходимость обновлять что-то одно, поэтому поп-ап стал бесполезным, только лишний "тык" делать. В конце концов, если вдруг нужно прогнать с нестандартными параметрами, можно нажать многоточие около кнопки «Run». Но вот как убрать этот поп-ап?</p><span><a name='more'></a></span><p><br /></p><h3 style="text-align: left;">Как убрать поп-ап в шаблоне (на N сборок)</h3><p>1. Открыть нужную сборку в ТС, нажать "Edit configuration"</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCCgcrKJMsNe39WfLxN3Vijc6Sn7Kmmg-NvmooZmzzN8oTbuSAXGjX8y98nsXXnS8l2mdw5NNhzDGkhT6dm3bdUI8MSqD87W0NJ31z8AEwbpogONB4ZxL05pxjcL0Z9sZY4k5E_KI-T3uXGvaOrA29aoYGy6STMaCSxqbKDdmxmJDlZO_7f-NH_L__eFE/s835/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="441" data-original-width="835" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCCgcrKJMsNe39WfLxN3Vijc6Sn7Kmmg-NvmooZmzzN8oTbuSAXGjX8y98nsXXnS8l2mdw5NNhzDGkhT6dm3bdUI8MSqD87W0NJ31z8AEwbpogONB4ZxL05pxjcL0Z9sZY4k5E_KI-T3uXGvaOrA29aoYGy6STMaCSxqbKDdmxmJDlZO_7f-NH_L__eFE/s320/2.png" width="320" /></a></div><br /><p><br /></p><p>2. Но менять мы будем не эту конкретную конфигурацию, а шаблон! Сверху видим надпись «Based on templates» и список шаблонов, на которых основана сборка, в виде ссылок. Выбираем нужный шаблон и проваливаемся в него.</p><p>3.&nbsp;Перейти в параметры:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimJSahJGCGV0BPio6rb-RnidNPgkwWKhafrVpQN8ltXZvipId0JEFKnxSGEHfoyrebR3uojNVc4THQvE2gtA8lDuRXXdKro4NBeoF0u6Frf-tFa2L1aJwkaYSqdtXuJDxVF8i0cegjgIxlLWU10LsyHfxIGZY5XI6P5YeKw7g1_Zt2Q3KsFzRDJ0Rp_Ss/s587/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="584" data-original-width="587" height="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimJSahJGCGV0BPio6rb-RnidNPgkwWKhafrVpQN8ltXZvipId0JEFKnxSGEHfoyrebR3uojNVc4THQvE2gtA8lDuRXXdKro4NBeoF0u6Frf-tFa2L1aJwkaYSqdtXuJDxVF8i0cegjgIxlLWU10LsyHfxIGZY5XI6P5YeKw7g1_Zt2Q3KsFzRDJ0Rp_Ss/s320/3.png" width="320" /></a></div><br /><p>4. Редактировать нужный параметр — кнопка «Edit»</p><p>5. Видим параметры, прописанные одной строкой, но можно нажать кнопку «Edit», чтобы проще их редактировать было:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXKpXyt4X_M3isGlZgEultZ1tPUYYdAP7JGCNcbJpmJgKg51BbmHlbi-2BR3N9I6nzSC2I4t-RuvHrV6DUVXoxlHj0oR343MFuxUZU9rpLuIMlmLDBW1PjfyGy_tQfdU6KxFt7Gdz6yk0MFgxlgcauYA_rhrF1cFhBmytaS_CN4u5X5lFmzK8FurCvzWQ/s835/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="679" data-original-width="835" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXKpXyt4X_M3isGlZgEultZ1tPUYYdAP7JGCNcbJpmJgKg51BbmHlbi-2BR3N9I6nzSC2I4t-RuvHrV6DUVXoxlHj0oR343MFuxUZU9rpLuIMlmLDBW1PjfyGy_tQfdU6KxFt7Gdz6yk0MFgxlgcauYA_rhrF1cFhBmytaS_CN4u5X5lFmzK8FurCvzWQ/s320/4.png" width="320" /></a></div><br /><p>6. И вот тут параметр Display:</p><p></p><ul style="text-align: left;"><li>Prompt — вылезать поп-апом</li><li>Normal — обычный режим</li><li>Hidden — вообще спрятать параметр (если в конкретной сборке он мешает)</li></ul><p></p><p>Меняем на Normal, сохраняем - мы красавцы!</p><p><br /></p><h3 style="text-align: left;">Как поменять параметр в конкретной сборке</h3><p>Если бы надо было оставить параметр в шаблоне, но изменить только в конкретной сборке, основанной на нем, то в конфигурации сборки не надо переходить в шаблон (шаг 2 пропускаем).</p><p>Выбираем сразу нужный параметр → Override, поменяется только в этой сборке.</p>]]></description>
<link>http://okiseleva.blogspot.com/2026/07/eamity.html</link>
<pubDate>Tue, 07 Jul 2026 20:21:52 +0300</pubDate>
</item>
<item>
<title>Заранее находим, что тестировать: модель ревью требований</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/requirements-review-model.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/requirements-review-model.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Ханиша Арора (Hanisha Arora)<br /><strong><a href="https://www.ministryoftesting.com/articles/finding-software-testing-opportunities-early-with-the-requirements-review-model" mce_href="https://www.ministryoftesting.com/articles/finding-software-testing-opportunities-early-with-the-requirements-review-model" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><p>Тестирование программного обеспечения — это не только поиск багов, но и их предотвращение. Случалось ли вам смотреть на требование и думать: «вроде всё нормально»? А затем, спустя несколько недель, наблюдать, как код по этому требованию превращается в баг-репорт, часы доработок или недовольство стейкхолдера? Это знакомо не только вам.</p>
<p>Именно поэтому была создана модель ревью требований (<strong>Requirements Review Model, RRM</strong>): чтобы дать тестировщикам и командам простой и единый подход к ревью. Это помогает повышать качество ещё до того, как написана хоть одна строка кода.</p>
<p>Модель была создана для <a href="https://www.ministryoftesting.com/certifications/mot-software-testing-essentials-certificate" mce_href="https://www.ministryoftesting.com/certifications/mot-software-testing-essentials-certificate">сертификата Software Testing Essentials от Ministry of Testing (MoT)</a>, чтобы обучать тестировщиков-новичков ревью требований. В MoT решили, что будет полезно поделиться моделью со всеми, за пределами сертификата, и поддержать тестировщиков и их команды. Это соответствует их цели — развивать индустрию любыми позитивными способами. Поэтому и написана эта статья!</p>]]></description>
<link>https://software-testing.ru/library/around-testing/requirements/4498-finding-software-testing-opportunities-early-with-the-requirements-review-model</link>
<pubDate>Mon, 06 Jul 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Перестаньте считать баги: современные метрики тестирования для IT-команд</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Как понять, что перед вами хороший тестировщик? Он будет говорить о рисках, а не о багах. В статье рассказываем, какие метрики мы внедрили вместо подсчёта количества багов, как&nbsp; собрать риск‑матрицу за пару часов, сколько это стоит и что будет, если забить и игнорировать новые подходы в тестировании. Читайте о проверенных на практике решениях, которые действительно работают &#8212; без претензии на истину в последней инстанции.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Вот история, которая много лет назад навсегда отучила нас гордиться количеством найденных дефектов. Был у нас релиз – чистый, образцовый. За спринт команда тестирования нашла <span class='font-weight-bold'>214 </span>багов, закрыла <span class='font-weight-bold'>209</span>, а пять оставшихся сочла косметическими – решили поправить позже. На ретро все были довольны: менеджер строил график «найдено/исправлено», стрелочка вверх, дофамин рекой. Релиз выкатили в прод в пятницу вечером (да, знаем, знаем, &#8212; это же классика).</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В субботу в 6 утра раздался звонок: у части пользователей при оплате двойное списание. Не критический сбой, не белый экран, а тихая, незаметная штука, которая ни в один из тех 214 багов не вошла. Но проблема касалась реальных денег.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30558,"width":"301px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" width="944" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/d9eefb83-9a63-403c-9f4c-89b9a1444846-1_11zon-944x1024.png" alt="метрики тестирования" class="wp-image-30558" style="width:301px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/d9eefb83-9a63-403c-9f4c-89b9a1444846-1_11zon-944x1024.png 944w, https://quality-lab.ru/wp-content/uploads/2026/07/d9eefb83-9a63-403c-9f4c-89b9a1444846-1_11zon-277x300.png 277w, https://quality-lab.ru/wp-content/uploads/2026/07/d9eefb83-9a63-403c-9f4c-89b9a1444846-1_11zon-768x833.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/d9eefb83-9a63-403c-9f4c-89b9a1444846-1_11zon.png 1024w" sizes="(max-width: 944px) 100vw, 944px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Мы тогда чинили это 14 часов. И пока в шесть утра приходилось буквально в пижаме объяснять по телефону, почему мы пустили это в прод, стало ясно: <span class='font-weight-bold'>нам платят не за найденные баги, а за то, чтобы релиз был качественным и предсказуемым</span>. Оказалось, всё это время мы измеряли не то. Заказчику было всё равно сколько багов удалось найти - его боль была в том, чтобы релиз не был похож на лотерею.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Почему считать баги уже недостаточно?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Сначала разберёмся, почему подсчёт багов &#8212; это уже прошлый день. Не потому что баги не важны. А потому что это метрика <span class='font-weight-bold'>активности</span>, а не <span class='font-weight-bold'>результата</span>. Всё равно что считать, сколько тренировок в месяц вы посетили вместо оценки изменений тела.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Что не так с этой метрикой? Разберёмся по пунктам:<br /></h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Она ничего не говорит о качестве продукта.</span> 500 багов в спринте – это плохой продукт или хорошая команда тестирования? А 5 багов – это шедевр разработки или просто никто толком не тестировал?&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Она прямо вредит, как только становится KPI.</span> Тут работает закон Гудхарта: как только показатель превращается в цель, то он перестаёт быть хорошим показателем. Платите тестировщику за количество багов – получаете больше багов. Каждую опечатку в плейсхолдере оформят отдельным тикетом с тремя скриншотами. А искать причину, по которой баги вообще появляются, никто не станет – это же себя обкрадывать.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Она ссорит команду.</span> Когда для QA главное – найти как можно больше багов, а для разработки – сделать всё побыстрее, они невольно оказываются по разные стороны баррикад. QA заинтересовано в большом числе дефектов, а разработка стремится доказать, что часть из них вовсе не баги. В итоге общая цель – выпустить качественный продукт – отходит на второй план, а вместо совместной работы начинается подсчёт и споры в комментариях к тикетам.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Но главная проблема в другом. Тот релиз с 214 багами провалился <span class='font-weight-bold'>не из‑за слабой работы команды. Мы хорошо искали, но пропустили реальный неочевидный риск</span>, который и привёл к проблеме. <span class='font-weight-bold'>Подсчёт багов создаёт иллюзию контроля</span>: цифры растут, графики выглядят благополучно, а настоящая угроза остаётся незамеченной – и может напомнить о себе в самый неподходящий момент.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30554,"width":"283px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="1024" height="954" src="https://quality-lab.ru/wp-content/uploads/2026/07/05ae884e-5e37-43a9-9883-692d659ad9d6-1_11zon.png" alt="метрики тестирования" class="wp-image-30554" style="width:283px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/05ae884e-5e37-43a9-9883-692d659ad9d6-1_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/05ae884e-5e37-43a9-9883-692d659ad9d6-1_11zon-300x279.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/05ae884e-5e37-43a9-9883-692d659ad9d6-1_11zon-768x716.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">В чём настоящая ценность QA для бизнеса?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Если коротко: зрелое тестирование должно обеспечивать предсказуемость. Чтобы за день до релиза можно было честно сообщить бизнесу: с вероятностью N% релиз пройдёт без серьёзных проблем, а если что‑то и сломается – то вот в этой зоне, при этом восстановление займёт столько-то минут.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Вот это и есть настоящий QA. Не отчёт на 40 страниц о том, что протестировано, а чёткий анализ с пониманием цены и вероятности возможной ошибки. Бизнесу неважно, сколько багов нашли. Ему важно планировать: обещать ли клиенту дату, быть ли уверенным в стабильности, брать ли с собой в отпуск ноутбук? <span class='font-weight-bold'>И вот тут на сцену выходят метрики тестирования, которые измеряют именно предсказуемость продуктов, а не демонстрацию активной деятельности.&nbsp;</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">MTBF и MTTR – две QA-метрики нового поколения</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Эти показатели давно используют в эксплуатации оборудования и в SRE, но в продуктовом тестировании, к нашему глубокому сожалению, они приживаются медленно. Сейчас объясним простыми словами, что это такое, как считать и применять.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#f9f6e8"}}} --></p>
<p class="has-background" style="background-color:#f9f6e8"><span class='font-weight-bold'>MTBF (Mean Time Between Failures) – среднее время между сбоями.&nbsp;</span><br />Суть: сколько ваша система спокойно работает, прежде чем что-то отвалится.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Считается так:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">MTBF = суммарное время нормальной работы /количество сбоев</pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Например:</span> работали 30 дней, было 3 серьёзных инцидента – MTBF около 10 дней. Это метрика стабильности. Чем она больше, тем реже сбои.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#f9f6e8"}}} --></p>
<p class="has-background" style="background-color:#f9f6e8"><span class='font-weight-bold'>MTTR (Mean Time To Recovery) – среднее время восстановления.</span><br />Суть: это метрика устойчивости. Чем она меньше, тем система стабильнее.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Считается так:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>MTTR = суммарное время простоя / количество инцидентов</span></pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Например:</span> за месяц случилось три инцидента общей продолжительностью 150 минут, поэтому среднее время восстановления (MTTR) составило 50 минут.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"width":"33.33%"} --></p>
<div class="wp-block-column" style="flex-basis:33.33%"><!-- wp:image {"id":30553,"width":"203px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="683" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/f122192c-9d08-451f-a829-427db3b266d8-1_11zon-683x1024.png" alt="количество багов" class="wp-image-30553" style="width:203px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/f122192c-9d08-451f-a829-427db3b266d8-1_11zon-683x1024.png 683w, https://quality-lab.ru/wp-content/uploads/2026/07/f122192c-9d08-451f-a829-427db3b266d8-1_11zon-200x300.png 200w, https://quality-lab.ru/wp-content/uploads/2026/07/f122192c-9d08-451f-a829-427db3b266d8-1_11zon-768x1152.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/f122192c-9d08-451f-a829-427db3b266d8-1_11zon.png 1024w" sizes="(max-width: 683px) 100vw, 683px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center","width":"66.66%"} --></p>
<div class="wp-block-column is-vertically-aligned-center" style="flex-basis:66.66%"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Ключевой сдвиг в подходе, который не сразу удаётся принять: <span class='font-weight-bold'>полностью исключить сбои невозможно</span>. Сложная система неизбежно будет ломаться – это закономерность, а не признак непрофессионализма.<br><br>Настоящая цель – не стремиться к мифическому «нулю багов», а <span class='font-weight-bold'>работать над двумя показателями: увеличивать MTBF</span> (чтобы система ломалась реже) и <span class='font-weight-bold'>сокращать MTTR</span> (чтобы восстанавливаться быстрее). </pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#f9f6e8"}}} --></p>
<p class="has-background" style="background-color:#f9f6e8">Именно на основе этих значений рассчитывают <span class='font-weight-bold'>доступность (availability)</span> – ту самую, что закладывают в SLA как «четыре девятки».</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>Доступность = MTBF / (MTBF + MTTR)</span></pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p>Почувствуйте разницу. Фраза <span class='font-weight-bold'>«нашли 214 багов»</span> говорит о прошлом и отражает сам процесс работы. А показатели <span class='font-weight-bold'>«MTBF вырос с 6 до 19 дней, MTTR сократился с 4 часов до 35 минут» </span>показывают реальный результат и дают представление о будущем. Первые цифры уместно обсуждать внутри команды, вторые – спокойно представлять совету директоров.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Важное уточнение: <span class='font-weight-bold'>без нормального мониторинга прода и чёткого учёта инцидентов посчитать MTBF и MTTR не получится</span>. Поэтому первый шаг к предсказуемости – начать фиксировать данные. Об этом расскажем дальше.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30557,"width":"160px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"left"} --></p>
<figure class="wp-block-image alignleft size-large is-resized"><img loading="lazy" decoding="async" width="974" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/86f7731f-06d9-44cb-a810-eb1b23103c37-1_11zon-974x1024.png" alt="it риски" class="wp-image-30557" style="width:160px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/86f7731f-06d9-44cb-a810-eb1b23103c37-1_11zon-974x1024.png 974w, https://quality-lab.ru/wp-content/uploads/2026/07/86f7731f-06d9-44cb-a810-eb1b23103c37-1_11zon-285x300.png 285w, https://quality-lab.ru/wp-content/uploads/2026/07/86f7731f-06d9-44cb-a810-eb1b23103c37-1_11zon-768x808.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/86f7731f-06d9-44cb-a810-eb1b23103c37-1_11zon.png 1024w" sizes="(max-width: 974px) 100vw, 974px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Риск-ориентированное тестирование: как выпускать релизы без лишних затрат?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Почем тестировать всё подряд &#8212; это плохая идея? Если пытаться одинаково тщательно проверять всё, то проект либо станет слишком дорогим, либо релиз никогда не выйдет в прод.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Предсказуемость достигается не за счёт тестирования всего подряд, а благодаря фокусу на самом важном – и ровно в той степени, в какой это действительно нужно. В этом и суть риск‑ориентированного подхода. Его формула проста до неприличия:&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>Риск = Вероятность сбоя × Влияние сбоя</span></pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p>Дальше берём все наши функции/модули/сценарии и раскидываем по матрице. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Вот рабочая риск-матрица, которую мы используем (5×5 многим избыточна, начните с 3×3):</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:table --></p>
<figure class="wp-block-table">
<table class="has-fixed-layout">
<tbody>
<tr>
<td></td>
<td><span class='font-weight-bold'>Влияние низкое</span></td>
<td><span class='font-weight-bold'>Влияние среднее</span></td>
<td><span class='font-weight-bold'>Влияние высокое</span></td>
</tr>
<tr>
<td><span class='font-weight-bold'>Вероятность высокая</span></td>
<td>Средний риск</td>
<td>Высокий</td>
<td>Критический</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Вероятность средняя</span></td>
<td>Низкий</td>
<td>Средний</td>
<td>Высокий</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Вероятность низкая</span></td>
<td>Низкий</td>
<td>Низкий</td>
<td>Средний</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Как пользоваться матрицей:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Критический и высокий it-риски</span> – оплата, авторизация, целостность данных: всё, где возможна утечка денег или персональных данных, – требуют максимального внимания. Сюда направляем основные усилия: автотесты, ручную проверку, негативные сценарии, нагрузочное тестирование, контроль на проде после релиза. Именно в этой зоне случился тот самый случай с двойным списанием – мы его не заметили, потому что ориентировались на количество багов.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Средний риск</span> – проверяем разумно, без фанатизма.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Низкий риск</span> – вопросы вроде настроек цвета кнопки в профиле – допускают отдельные недочёты: их наличие не несёт серьёзных последствий, и можно сознательно экономить на них ресурсы.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Что вы получаете на выходе:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Чёткое понимание рисков релиза</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Аргумент для бизнеса: «вот этот модуль мы покрываем на 95%, а вот этот – на 40%, потому что цена ошибки тут копеечная». Это взрослый разговор.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Защиту от неэффективного расходования ресурсов на проекте.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Практический совет: формируйте риск‑матрицу совместно с разработкой, продактом и поддержкой – не в одиночку.</span> Поддержка особенно ценна: её сотрудники лучше всех знают реальные проблемы пользователей. Всего час такой встречи раз в квартал помогает сэкономить недели на устранении инцидентов.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Какие ещё показатели помогают в управлении IT-рисками?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Окей, баги считать перестали. Что вешаем на дашборд вместо них? Предлагаем набор метрик, которые можно внедрить уже завтра.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item {"style":{"color":{"background":"#f9f6e8"}}} --></p>
<li style="background-color:#f9f6e8"><span class='font-weight-bold'>Defect Escape Rate</span>, доля «сбежавших» дефектов. Она показывает соотношение багов, найденных до продакшена, к тем, что всё‑таки попали в прод. </li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li></li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>Escape Rate = баги, найденные в проде / (баги в проде + баги до прода)</span></pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p>Это самая честная оценка качества тестирования – не сколько багов нашли, а сколько проворонили. Например, 214 багов до релиза и один в проде – это отличная работа. А вот 12 багов до релиза и 8 в проде – явный пробел в покрытии, сколько бы дефектов ни выявили. Стремитесь держать Defect Escape Rate на уровне ниже 5–10% – дальше ориентируйтесь по особенностям проекта.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>MTBF / MTTR</span> – про них уже писали выше. Это база.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Change Failure Rate</span> – доля провальных изменений: она показывает, какой процент релизов приводит к инциденту, откату или хотфиксу. Эта метрика из исследования DORA прямо отвечает на вопрос, насколько предсказуем релиз. У сильных команд показатель держится на уровне единиц процентов, у команд в постоянном аврале – превышает 30%.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>MTTD (Mean Time To Detect)</span> – это время, за которое команда замечает, что система сломалась. Бывает, что MTTR отличный, но проблема в другом: о сбое узнают от недовольных пользователей в соцсетях спустя два дня. Если вы узнаёте о проблеме последним – быстрое исправление уже не спасает ситуацию.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Покрытие рисков важнее покрытия строк кода.</span> Code coverage в процентах нередко вводит в заблуждение: можно иметь 90% покрытия и при этом тестировать то, что не влияет на стабильность системы. Гораздо полезнее отслеживать, какая доля критических сценариев из риск‑матрицы покрыта тестами. Именно этот показатель помогает в управлении IT-рисками , а не показывает формальные проценты.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Доля флакающих тестов – важный показатель</span>. Тесты, которые то падают, то проходят, опаснее, чем полное их отсутствие: они притупляют бдительность команды и приучают игнорировать предупреждения. Держите их под контролем – иначе дашборд перестанет быть инструментом управления и станет просто пустышкой.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Обратите внимание: все эти метрики отражают результат для пользователя и бизнеса, а не активность команды.</span> Их не получится «накрутить», например, оформив опечатку как отдельный тикет.</p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Пошаговый план перехода к риск-ориентированному тестированию</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>Мы собрали набор практик, которые доказали свою эффективность.</span> Это не план на неделю – это маршрут на несколько кварталов, позволяющий внедрить риск ориентированный подход в тестировании. При этом каждый шаг приносит пользу сразу, поэтому <span class='font-weight-bold'>внедряйте их по очереди</span>.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30555,"width":"214px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="973" src="https://quality-lab.ru/wp-content/uploads/2026/07/7da2f3b5-b99d-4cc7-966e-bbddc38e2b40-1_11zon.png" alt="риск ориентированное тестирование" class="wp-image-30555" style="width:214px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/7da2f3b5-b99d-4cc7-966e-bbddc38e2b40-1_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/7da2f3b5-b99d-4cc7-966e-bbddc38e2b40-1_11zon-300x285.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/7da2f3b5-b99d-4cc7-966e-bbddc38e2b40-1_11zon-768x730.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Начните с измерения состояния прода.</span> Без мониторинга и учёта инцидентов MTBF и MTTR – просто красивые термины, а не рабочие метрики. Заведите простой журнал инцидентов: фиксируйте, что случилось, когда, сколько времени ушло на исправление и как проблему обнаружили. Это не требует затрат, но сразу даёт чёткую картину.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Соберите риск‑матрицу</span> – на это хватит одного вечера, а польза сохранится на месяцы.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Сосредоточьте усилия на зонах высокого риска:</span> вместо тотальной автоматизации сначала закройте автотестами критически важные участки – например, оплату и авторизацию.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Введите блеймлесс-постмортемы.</span> Внедрите разбор инцидентов без поиска виноватых. Пусть каждый такой разбор порождает новый тест‑кейс или проверку – так MTBF будет расти естественным образом.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Сдвигайте тестирование влево (shift-left).</span>&nbsp; чем раньше выявлен дефект, тем дешевле его исправить. Привлекайте QA ещё на стадии обсуждения требований – многие проблемы возникают не из‑за кода, а из‑за расплывчатых формулировок.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Создайте дашборд здоровья релиза с 5–6 ключевыми метриками и разместите его на видном месте. </span>Когда команда ежедневно видит показатели вроде Defect Escape Rate и Change Failure Rate, подход к работе меняется сам собой.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Заранее согласуйте SLO и бюджет ошибок:</span> определите, какой уровень сбоев допустим. Это снимет невроз с ориентацией на «ноль багов» и переведёт разговор в плоскость «у нас бюджет на N минут простоя в месяц, тратим его осознанно».</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>Хотите узнать, как оценить риски перед тестированием за 15 минут? Забирайте чек-лист для экспресс-анализа бесплатно. Используйте, когда времени в обрез. Заполните форму и мы отправим документ вам на электронную почту.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Во сколько обойдётся такой подход?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Честно говоря, такие меры требуют вложений – но они окупаются. Возьмём известное правило <span class='font-weight-bold'>«1–10–100»</span>: дефект, выявленный на этапе требований, условно стоит 1 единицу, в коде – уже 10, а в проде – от 100 и выше. И это без учёта репутации, возвратов, срочных ночных работ и выгорания команды – а эти потери тоже дорого обходятся, хоть их и трудно посчитать.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>Посчитайте стоимость одного серьёзного инцидента:</span> <br>простой сервиса помножить на выручку в час + затраты на устранение (время команды и ставки) + потерянные клиенты и нагрузка на поддержку. </pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p>Для среднего бизнеса это нередко выливается <span class='font-weight-bold'>в сотни тысяч или даже миллионы рублей</span>. Например, инцидент с двойным списанием – с учётом возвратов, ручного разбора транзакций и 14 человеко‑часов в выходные – обошёлся примерно в две месячные зарплаты тестировщика.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"id":30556,"width":"318px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/9bb9b2d2-f505-4d6b-b056-e75b314c9942-1_11zon.png" alt="управление it рисками" class="wp-image-30556" style="width:318px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/9bb9b2d2-f505-4d6b-b056-e75b314c9942-1_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/9bb9b2d2-f505-4d6b-b056-e75b314c9942-1_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/9bb9b2d2-f505-4d6b-b056-e75b314c9942-1_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/07/9bb9b2d2-f505-4d6b-b056-e75b314c9942-1_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">При этом вложения в предсказуемость в основном разовые: настроить метрики эффективности тестирования, сформировать риск‑матрицу, скорректировать процессы, обучить команду. Дальше система работает сама и экономит ресурсы с каждым новым релизом. По опыту, грамотно выстроенный риск‑ориентированный QA окупает затраты за счёт одного‑двух предотвращённых инцидентов – то есть примерно за квартал.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">А что если забить и считать баги дальше?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Имеете полное право. Только давайте честно про то, что вас ждёт.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Релизы будут непредсказуемыми. </span>Когда повезёт, когда нет. Вы никогда не будете знать заранее, что вас ждёт и не сможете ничего планировать в таких условиях.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Команду настигнет неумолимое выгорание. </span>Постоянные стрессы, конфликты, переработки. Лучшие уйдут первыми – никто не любит героически чинить то, что можно было предотвратить.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>QA и разработка будут постоянно конфликтовать.</span> KPI по количеству багов противопоставляет их по самой своей природе.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Деньги будут утекать незаметно тонкой струйкой: </span>возвраты, отток клиентов, ухудшение репутации, упущенные возможности. В отчётах вы этого не увидите, потому что продолжите измерять не то, что нужно.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>И главное – вы продолжите гордиться не тем.</span> Графиком найденных багов вместо растущего MTBF. Вредно, обманчиво, ведёт в тупик из иллюзий.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Самое коварное – что по старым метрикам всё будет выглядеть отлично ровно до того момента, пока не станет слишком поздно.</span></li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Когда стоит обратиться к нам?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Мы в «Лаборатории Качества» не изобретаем велосипед, а берём проверенные практики и системно внедряем их, выжимая максимум пользы для клиентов. Наша помощь обычно сводится к трём ключевым шагам – это как раз та разовая инвестиция, которая быстро окупается:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>проводим аудит текущего QA:</span> разбираем, как устроено тестирование, где кроются главные риски, какие дефекты попадают в прод и почему. Даём не формальный отчёт, а реальную картину состояния дел;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>помогаем перейти на осмысленные метрики: </span>вместо простого подсчёта багов внедряем MTBF, MTTR, Defect Escape Rate, Change Failure Rate, выстраиваем риск‑матрицу и собираем понятный дашборд – такой, который не стыдно показать руководству;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>обучаем вашу команду:</span> чтобы после завершения проекта процессы продолжали жить и развиваться внутри компании. Наша цель – не сделать вас зависимыми от подрядчика, а научить команду мыслить категориями рисков и предсказуемости.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>Если этот подход вам близок – запишитесь на бесплатную стратегическую консультацию. Разберём текущий процесс тестирования и метрики, подсветим зоны высоких рисков и подскажем, с каких шагов начать, чтобы уже в ближайший квартал снизить количество инцидентов и сделать релизы предсказуемыми.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:latest-posts /--></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>]]></description>
<link>https://quality-lab.ru/blog/perestante-schitat-bagi-sovremennye-metriki-testirovaniya-dlya-it-komand/</link>
<pubDate>Wed, 01 Jul 2026 18:37:25 +0300</pubDate>
</item>
<item>
<title>Как мы написали UI-тесты для ИИ-агента внутри JetBrains IDE</title>
<description><![CDATA[<p><img src="https://software-testing.ru/images/stories/library/11hs/jetbrains-ide1.png" mce_src="https://software-testing.ru/images/stories/library/11hs/jetbrains-ide1.png" width="300" mce_style="float: left;" style="float: left;" /><a href="https://habr.com/ru/companies/veai/articles/1028756/" mce_href="https://habr.com/ru/companies/veai/articles/1028756/" target="_blank" style="">Оригинальная публикация</a><br />Автор:&nbsp;Nikolay Nedoseykin</p><p>Как проверить, что ИИ-агент в IDE работает, если на одинаковые запросы LLM отвечает по-разному? Ответы модели недетерминированы, а интерфейс и бизнес-логика вполне детерминированы, и их нужно тестировать отдельно.</p><p>Мы делаем ИИ-агента, встраиваемого в JetBrains IDE. В статье расскажу, как мы выстроили UI-автоматизацию плагина так, чтобы тесты ловили регрессии в интерфейсе, бизнес-логике и при этом не «моргали» из-за нестабильности LLM.</p><blockquote><p>Статья пригодится, если вы QA-инженер или разработчик и вам интересны:</p><ol><li><p>Выстраивание UI-автоматизации на примере IDE-плагина</p></li><li><p>Тестирование приложений с ИИ-функциями</p></li><li><p>Разделение ответственности между детерминированной и недетерминированной частями системы</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-tools/4524-jetbrains-ide</link>
<pubDate>Tue, 30 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Как ИИ нам проверку уязвимостей сломал</title>
<description><![CDATA[<p><span face="Arial, sans-serif" style="font-size: 11pt; white-space: pre-wrap;">Сегодня я расскажу историю о том, как ИИ умеет косячить! А то только success-story везде…</span></p><span id="docs-internal-guid-8940cef6-7fff-e3cf-f8b7-d4592340d9b4"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">У нас есть автотесты на уязвимости по базе</span><a href="https://nvd.nist.gov/vuln" style="text-decoration: none;"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">NVD</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">. И вот что-то эти сборки посыпались пачкой. Тестировщик пошел смотреть… И потом рассказал, в чем дело было:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Сегодня в сборках были найдены уязвимости — оказалось, что PartyFields.java для этих заказчиков правили с помощью агента. Так вот он, подлец, подставил невидимый символ, поменяв кодировку файла, ну и он чекстайл-проверку не прошёл.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"><img height="165" src="https://blogger.googleusercontent.com/img/a/AVvXsEiVI4XBb2YNIm9T_OelzPkyagi87mLLypna0ugLuVMJkJgr4AnDmavn7Xi2s4Cb1lCcyN8Nv5I8NL-5zLBUnbte43Lpm6rN5H8gI1DZ-AJLiQkZUmEwWPJ4AZeRPofXyhnvtCrh8A2f4pEpyXR9v57Mf9M8bDtVQ4VGfVBIT-T4PhkFH9bix32Yn98j_m8" style="border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; border: none;" width="128" /></span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"> → </span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"><img height="169" src="https://blogger.googleusercontent.com/img/a/AVvXsEipqtxzEwzTHHQHg5BFxcWMWk2-CjnqLWuOPaiWvWXGbf65nOa_Wzo_fywm6QqdIdEWgsYvOrOLSLTOC0GRllKLNahd3-2KKCTmLPk2HUeHbT7B8S08ZGzMdvjwBDMIKCs15HkRvu28xejlK4lIJnsr6PdMI0LvYuFzj94Ttjccz6cVPiy1yGVN5CdfMhw" style="border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; border: none;" width="146" /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Вот, будьте бдительны)</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Почему использовался агент — вполне понятно, правка была массовая, в нескольких гит-проектах сделать однотипную правку. Но и следить надо, что там этот ИИ натворил!</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">А ведь такое даже не заметишь сходу, символ то невидимый… В общем, мы молодцы, пресекли его варварство благодаря автотестам, а вы имейте в виду!</span></p><div><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div></span>]]></description>
<link>http://okiseleva.blogspot.com/2026/06/blog-post_30.html</link>
<pubDate>Tue, 30 Jun 2026 16:03:35 +0300</pubDate>
</item>
<item>
<title>Мутационное тестирование: не только юнит-тесты</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/mutation-testing/mutation-testing1.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/mutation-testing/mutation-testing1.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Баз Дейкстра (Bas Dijkstra)<br /><strong><a href="https://www.ontestautomation.com/mutation-testing-not-just-for-unit-tests/" mce_href="https://www.ontestautomation.com/mutation-testing-not-just-for-unit-tests/" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><p>Я уже <a href="https://www.ontestautomation.com/improving-the-tests-for-rest-assured-net-with-mutation-testing-and-stryker-net/" mce_href="https://www.ontestautomation.com/improving-the-tests-for-rest-assured-net-with-mutation-testing-and-stryker-net/">несколько раз</a> <a href="https://www.ontestautomation.com/an-introduction-to-mutation-testing-and-pit/" mce_href="https://www.ontestautomation.com/an-introduction-to-mutation-testing-and-pit/">писал</a> о мутационном тестировании в этом блоге, и даже частенько провожу <a href="https://www.ontestautomation.com/training/mutation-testing/" mce_href="https://www.ontestautomation.com/training/mutation-testing/">воркшоп</a> по мутационному тестированию.</p>
<p>Одно из заблуждений, которое иногда всплывает — либо явно в вопросах, либо неявно, когда я слышу, как о мутационном тестировании говорит кто-то еще, — заключается в том, что мутационное тестирование работает только для юнит-тестов. Это не так. Мутационное тестирование можно использовать и для оценки качества других типов тестов.</p>
<p>В этой статье я покажу пример на основе кодовой базы, которую я использую в своих воркшопах по мутационному тестированию. В конце статьи будет ссылка на репозиторий, чтобы можно было посмотреть и попробовать всё самостоятельно.</p>
<p>Важно помнить: хотя мутационное тестирование подходит не <em>только</em> для юнит-тестов, лучше всего оно работает с тестами, которые выполняются быстро. Набор тестов будет запускаться для каждой мутации в продуктовом коде, которую сгенерирует инструмент мутационного тестирования, поэтому, если результатов не хочется ждать часы или даже дни, стоит использовать его с быстрыми тестами — с временем выполнения в миллисекундах, максимум одну-две секунды.</p>]]></description>
<link>https://software-testing.ru/library/testing/other-testing/4497-mutation-testing</link>
<pubDate>Sun, 28 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Настраиваем IDEA с ИИ, часть 2</title>
<description><![CDATA[<p><i>С вами рубрика «где тестировщик может применять ИИ в своей работе»!</i></p><p>Продолжаем настраивать компьютер с помощью ИИ (начинала <a href="https://okiseleva.blogspot.com/2026/06/ide.html" target="_blank">тут</a>). Что ещё я спрашивала у чат-бота?</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLzkoVjOZqujQgVt9TIaS9ZbkR7Z2oHcnRfTOau7Cg816YKDOZUe3j-HXcwkoUaKgYo-sTpCyrkU7NPoTEn2IMsbDEUwiw9GI-hQErS9ertqTqhWu7KPGSzsd46FQ0sIeW52PCkflfZXI9h4-MKY0FnHQ47wj4xOjcijydWJS5w1NxW2MXjg3u_Kc1cWk/s2996/4_1_Anna_%D0%9D%D0%B5%20%D0%B1%D0%BE%D0%B9%D1%81%D1%8F,%20%D1%8F%20%D1%82%D0%B5%D0%B1%D0%B5%20%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D1%83.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2491" data-original-width="2996" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLzkoVjOZqujQgVt9TIaS9ZbkR7Z2oHcnRfTOau7Cg816YKDOZUe3j-HXcwkoUaKgYo-sTpCyrkU7NPoTEn2IMsbDEUwiw9GI-hQErS9ertqTqhWu7KPGSzsd46FQ0sIeW52PCkflfZXI9h4-MKY0FnHQ47wj4xOjcijydWJS5w1NxW2MXjg3u_Kc1cWk/s320/4_1_Anna_%D0%9D%D0%B5%20%D0%B1%D0%BE%D0%B9%D1%81%D1%8F,%20%D1%8F%20%D1%82%D0%B5%D0%B1%D0%B5%20%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D1%83.png" width="320" /></a></div><br /><p><br /></p><h3 style="text-align: left;">1. Какой путь указывать для Java?</h3><p>Разработчик посоветовал в настройках грейдла указать путь для JAVA, скинув пример. Но у него пример на линуксе, а у меня винда. Часть инструментов надо указывать до директории bin, часть нет... Решила уточнить, у ИИ, конечно, а не у разработчика:</p><p></p><blockquote>org.gradle.java.home — на винде какой путь надо указывать, до бин или самой папки? C:\Program Files\Eclipse Adoptium\jdk-25.0.3.9-hotspot\bin</blockquote><p></p><span><a name='more'></a></span><p>Ответ, если вам интересно:</p><p></p><blockquote>Нужно указывать путь <b>до самой папки</b> (то есть до корневой директории JDK), а <b>не</b> до папки <code>bin</code>.<br /><br /><b>Как правильно:</b><br /><br />• ❌ <b>Неправильно:</b> <code>C:\Program Files\Eclipse Adoptium\jdk-25.0.3.9-hotspot\bin</code><br /><br />• ✅ <b>Правильно:</b> <code>C:\Program Files\Eclipse Adoptium\jdk-25.0.3.9-hotspot</code><br /><br /><i>Почему так?</i> Gradle (как и сама Java) ожидает, что в указанной папке он сам найдет подкаталог <code>bin</code> и запустит оттуда файлы <code>bin/java</code> или <code>bin/javac</code>. Если указать путь вместе с <code>bin</code>, Gradle будет искать компилятор по несуществующему пути <code>.../bin/bin/java</code> и выдаст ошибку.</blockquote><p></p><p>+ ИИ дал уточнение по винде, что делать со слешами в пути.</p><p><br /></p><p><br /></p><h3 style="text-align: left;">2. Как в IDEA посмотреть свои правки кода в гите?</h3><p>Помню, что раньше при работе в IDEA у меня слева снизу отображались мои изменения в меркуриал / гите. А тут тыркаюсь, тыркаюсь, историю изменения файла вижу, а мои правки — нет.</p><p>До этого мы обсуждали с куратором некоторые настройки идеи, и я сначала начала писать ей вопрос. И снова, как и в прошлый раз, я остановилась на середине вопроса с мыслью «а почему я пишу это ей?». Скопировала вопрос, стерла, и вставила в чат с ИИ (я общаюсь с&nbsp;@gpt3_unlim_chatbot):</p><p></p><blockquote>можешь подсказать как в идее включить отображение моих правок внутри гита? чтобы видеть какие файлы я меняла и сделать реверт, например</blockquote><p></p><br />Чат мне подробно ответил, причем в контексте нагших прошлых бесед подчеркнул, что этот способ сработает в том числе и с&nbsp;Giga IDE, в которой я и работаю.&nbsp;<div><br /></div><div>Правда, после использования подсказанных горячих клавиш окно у меня открылось не там, где я ожидала. Ну и что? Процитировала его ответ с гоярчими клавишами и уточнила:</div><div><br /></div><div><blockquote>окошко открылось слева сверху, а как его вниз перенести?</blockquote></div><div>Оказалось, достаточно перетащить, хотя я вроде попыталась, но, видимо, плохо захватила в первый раз))</div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">3. Как привести текст в верхний регистр в GIGA?</h3><div><br /></div><div>Для теста мне надо было изменить регистр текста. Я знаю, как это делается в Notepad++, но в IDE эта комбинация не работает. Что делать? Искать по менюшкам или спросить чат!</div><div><br /></div><div><br /></div><div><blockquote>а как в гига привести текст в верхний или нижний регистр? как контрол + U в нотепад++</blockquote></div><div><br /></div><div>Очень быстро и очень удобно! Если раньше надо было уметь гуглить, то теперь достаточно добавить себе чат с ботом, и все.&nbsp;</div><div><br /></div><div>Мне особенно нравится то, что ему можно делегировать все тупые вопросы, которые ты иначе бы задавала коллегам как новичок "а как это в IDEA сделать? А то?". Теперь для этого есть чатик!&nbsp;</div><div><br /></div><div>Учтите на будущее, если вы сами новичок, вот эта реакция "начал писать вопрос коллеге, потом стер и написал в ИИ" — очень полезная штука. Люди, умеющие так делать, ценятся намного больше "ой, я не знаю, помоги" по любому поводу.</div><div><div><br /></div><div><i style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">PS — эта статья написана в помощь студентам моего курса «</i><span style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="font-size: 14.85px;"><i><a href="https://testbase.ru/learn/chatgpt" target="_blank">Применение ChatGPT в тестировании</a>»</i></span></span></div></div>]]></description>
<link>http://okiseleva.blogspot.com/2026/06/blog-post_25.html</link>
<pubDate>Thu, 25 Jun 2026 20:22:34 +0300</pubDate>
</item>
<item>
<title>Психология тестировщика: почему критическое мышление — это суперсила</title>
<description><![CDATA[<p><img src="https://software-testing.ru/images/stories/library/11hs/psychology-of-the-tester.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/psychology-of-the-tester.jpg" width="400" mce_style="float: left;" style="float: left;" /></p><p><a href="https://habr.com/ru/companies/ozontech/articles/924608/" mce_href="https://habr.com/ru/companies/ozontech/articles/924608/" target="_blank" style="">Оригинальная публикация</a></p><p>Меня зовут Галина Коньшина, я работаю QA-инженером в Ozon Tech. Если вы думаете, что тестировщики только ищут баги, то вы заблуждаетесь. Мы не просто охотники за дефектами (хотя баги ловить умеем), мы те, кто ежедневно выходит на поле боя против самого изощрённого противника — нашего собственного мозга.</p><p>Вы обращали внимание на то, как легко не заметить очевидное? Например, когда вы ищете очки, а они у вас на голове. Теперь представьте, что тестировщик делает это на уровне сложных систем и интерфейсов, где каждая «потерянная пара очков» может обернуться тысячами разъярённых пользователей.</p><p>Сегодня хочу рассказать, почему критическое мышление — это суперсила любого тестировщика, ссылаясь на теории классиков, таких как Майерс Г. и Кейнер К. Мы разберём, как когнитивные искажения могут мешать находить баги, что помогает развивать аналитический подход и как нестандартное мышление спасает проекты (и иногда ночной сон).</p>]]></description>
<link>https://software-testing.ru/library/testing/general-testing/4523-psychology-of-the-tester</link>
<pubDate>Tue, 23 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>ИИ, помоги мне настроить IDE</title>
<description><![CDATA[<p><i>С вами рубрика «где тестировщик может применять ИИ в своей работе»!</i></p><p>Я тут на работу из декрета вышла. У меня новый компьютер, так что привет, настройка ПО! ИИ очень хорош как помощник в этом. Вот что я уже успела у него спросить:</p><p><br /></p><h3 style="text-align: left;">1. Как открыть gradle проект в IDEA</h3><p>Мой основной проект собирается через Maven, я помню как его открывать в IDEA (у меня сейчас&nbsp;GIGA IDE, но по сути это та же IDEA) — через pom-ник.</p><p>А вот другой проект собирается на gradle, и как открывать его — я забыла... Но это же не рокет-сайнс именно моего проекта, а что-то общее, так что я пошла к ИИ чат-боту в телеге, которому можно кидать&nbsp;изображения.</p><p>Сделала скрин проекта в гите и задала вопрос:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwFDR2GrWVz0o5de8PVFM66wdQ0Eb5QvlcolATn7Y5-aBi1DsiA31GuLD3h_ww1MceN3bkBUJNbrmizx8kk4PxKgI3EjFuvOc0XXzsSfbPCHzA6DenFx-5TgqT4lLF491_BtXpmzVQEJo3RDX6FSkIBngQUYTV4D2UE6M7zcfEg3V8sbRZzuZp9tw_wns/s1663/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202026-06-22%20192029.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="321" data-original-width="1663" height="62" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwFDR2GrWVz0o5de8PVFM66wdQ0Eb5QvlcolATn7Y5-aBi1DsiA31GuLD3h_ww1MceN3bkBUJNbrmizx8kk4PxKgI3EjFuvOc0XXzsSfbPCHzA6DenFx-5TgqT4lLF491_BtXpmzVQEJo3RDX6FSkIBngQUYTV4D2UE6M7zcfEg3V8sbRZzuZp9tw_wns/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202026-06-22%20192029.png" width="320" /></a></div><p>-&nbsp;как открыть проект в идее, какой файл выбрать?</p><p>ИИ понимает даже убогую "русификацию", так что нет нужды писать ему правильное название — IDEA, он и так все понял и выдал подробную инструкцию.</p><span><a name='more'></a></span><p><br /></p><h3 style="text-align: left;">2. Как настроить кодировку проекта</h3><p>Следующая проблема — один проект работает с кодировкой UTF-08 по умолчанию, а другой — с windows-1251. Собственно, я смогла открыть в идее проект, но не смогла считать файлы:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-gKCXqB9mEfE3AvRouTpNcmM71ssZLffseQ1o8GbCXHlrp0cs1qJSURK3E6LpZgA3i6kEdNzo-Ahbc1-6DxCPM6fMj-3tqen9-MbbDSOCmF0kZKGf39YXguo4tX6goRTO_xOHsdx1O4YauXVn5r_LSaB2ysMj9wIz6ceNBkaNagZoXPck4aofchnOGws/s1685/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202026-06-22%20131335.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="460" data-original-width="1685" height="87" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-gKCXqB9mEfE3AvRouTpNcmM71ssZLffseQ1o8GbCXHlrp0cs1qJSURK3E6LpZgA3i6kEdNzo-Ahbc1-6DxCPM6fMj-3tqen9-MbbDSOCmF0kZKGf39YXguo4tX6goRTO_xOHsdx1O4YauXVn5r_LSaB2ysMj9wIz6ceNBkaNagZoXPck4aofchnOGws/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202026-06-22%20131335.png" width="320" /></a></div><p>Я как-то смутно помню, что это указывается где-то внутри настроек, но где?</p><p>Прошлась по документации "для новичков", сходу не нашла инструкцию. И пошла к своему куратору, которая помогает мне освоиться на проекте. Я уже начала писать вопрос:</p><p>- А напомни, плс, как поменять кодировку только для этого проекта?</p><p>А потом задумалась — а почему я спрашиваю об этом ЕЁ? Стерла сообщение и пошла к ИИ-шке ????</p><p>- <i>(кинула скрин, который показан выше) </i>Идея (точнее GIGA IDE CE 2025.1) открывает файлы не в той кодировке, надо вин-1251. Как настроить эту кодировку на весь проект?</p><p>И снова в ответ — подробная инструкция! Хотя за ИИ нужен глаз да глаз, а то он мне насоветовал глобальные настройки поменять:</p><p><br /></p><p><b></b></p><blockquote><b>Шаг 1. Настройка Windows-1251 на весь проект (и глобально)</b><br /><br />1. Откройте настройки: нажмите <code>Ctrl + Alt + S</code> (или перейдите в меню <b>File</b> $⟶$ <b>Settings</b>).<br /><br />2. В левой колонке перейдите по пути: <b>Editor</b> $⟶$ <b>File Encodings</b> (Кодировки файлов).<br /><br />3. В правой части окна настройте три параметра:<br /><br />   * <b>Global Encoding</b> (Глобальная кодировка): выберите <b>windows-1251</b>.<br /><br />   * <b>Project Encoding</b> (Кодировка проекта): выберите <b>windows-1251</b>.<br /><br />   * <b>Default encoding for properties files</b>: если в <code>.properties</code> файлах тоже используется кириллица, выберите <b>windows-1251</b>.<br /><br />4. Нажмите <b>Apply</b> (Применить), а затем <b>OK</b>.<br /><br /><i>Теперь все новые файлы будут создаваться и открываться в этой кодировке.</i></blockquote><p><br /></p><p>Пришлось уточнять:</p><p>&nbsp;— «Global Encoding (Глобальная кодировка): выберите windows-1251». Что значит этот параметр? он только на этот проект будет действовать? я открываю в ИДЕ и другой проект, где уже кодировка утф-8</p><p>И тогда ИИ скорректировал свой ответ:</p><p><br /></p><p></p><blockquote>Отличный вопрос! Вы очень вовремя обратили на это внимание. <br /><br />Если вы работаете с разными проектами (где один в UTF-8, а другой в Windows-1251), <b>настраивать Global Encoding на Windows-1251 действительно не стоит</b>, иначе это может сломать отображение символов в других проектах.<br /><br />Вот в чем разница между этими параметрами и как правильно поступить в вашей ситуации:<br /><br /><b>В чем разница?</b><br /><br />1. <br /><br /><b>Global Encoding (Глобальная кодировка)</b> — влияет на <b>всю среду разработки</b> (IDE). <br /><br />   * Она применяется к файлам, которые вы открываете «просто так» (вне какого-либо проекта), и служит шаблоном по умолчанию для всех <i>новых</i> проектов. <br /><br />   * Если вы выставите здесь <code>windows-1251</code>, то при открытии другого проекта (где нет жестко сохраненных настроек кодировки) IDE может попытаться прочитать его файлы как Windows-1251, из-за чего «поплывет» уже UTF-8.<br /><br />2. <br /><br /><b>Project Encoding (Кодировка проекта)</b> — действует <b>только на текущий открытый проект</b>.<br /><br />   * Эта настройка сохраняется в скрытой папке <code>.idea</code> внутри папки вашего проекта (в файле <code>encodings.xml</code>). <br /><br />   * Она никак не влияет на другие проекты. Когда вы откроете другой проект, IDE прочитает его собственные настройки (например, UTF-8).<br /><br />——————————<br /><br /><b>Как правильно настроить IDE под вашу ситуацию?</b><br /><br />Чтобы один проект открывался в <b>Windows-1251</b>, а второй — в <b>UTF-8</b>, сделайте так:<br /><br />1. Снова откройте настройки (<code>Ctrl + Alt + S</code> $⟶$ <b>Editor</b> $⟶$ <b>File Encodings</b>).<br /><br />2. <b>Global Encoding</b> верните в <b>UTF-8</b> (это современный стандарт, пусть он будет глобальным).<br /><br />3. <b>Project Encoding</b> для вашего текущего проекта (где кракозябры) установите в <b>windows-1251</b>.<br /><br />4. Нажмите <b>Apply</b> и <b>OK</b>.<br /><br />При такой схеме:<br /><br />• Проект с Windows-1251 будет открываться правильно (так как для него задана индивидуальная кодировка проекта).<br /><br />• Проект с UTF-8 (и все остальные проекты) будут открываться в стандартной UTF-8, используя глобальную настройку. Никакого конфликта не возникнет!</blockquote><p></p><p><br /></p><h3>3. Что значит ошибка?</h3><div>Проект перевели на Java 25, но ещё не обновили доку. Так что я удивилась, увидев ошибку при сборке:</div><div><br /></div><div><blockquote>Dependency requires at least JVM runtime version 25. This build uses a Java 21 JVM.</blockquote></div><div><br /></div><div>Подумала, вдруг что-то не так поняла? Сходила к ИИ:</div><div><br /></div><div></div><blockquote><div>При сборке проекта ошибка: Dependency requires at least JVM runtime version 25. This build uses a Java 21 JVM.</div><div><br /></div><div>Но у меня 21 джава:<br /><br />c:\core&gt;javac -version<br />javac 21.0.11<br /><br />c:\core&gt;java -version<br />openjdk version "21.0.11" 2026-04-21 LTS<br />OpenJDK Runtime Environment Temurin-21.0.11+10 (build 21.0.11+10-LTS)<br />OpenJDK 64-Bit Server VM Temurin-21.0.11+10 (build 21.0.11+10-LTS, mixed mode, sharing)<br /><br />ему нужна 25?</div></blockquote><div></div><div><br /></div><div>Краткий ответ — да, нужна ))</div><div>Океееееей...</div><div><br /></div><div><br /></div><h3 style="text-align: left;">4. Что делает winget?</h3><div><br /></div><div>После шага 3 мне насоветовали команду:</div><div><br /></div><div><blockquote>winget install EclipseAdoptium.Temurin.25.JDK</blockquote></div><div><br /></div><div>Фича крутая, конечно, появилась в винде! Но я засомневалась, а не перезатрет ли мне это параметры в Path? Потому что другой проект собирается на Java 21 и мне нужны обе версии.</div><div><br /></div><div>Собака-подозревака снова пошла к ИИ:</div><div><br /></div><div><blockquote>winget install EclipseAdoptium.Temurin.25.JDK — он установит джаву, но не поменяет Path и Java Home? Я хочу чтобы стояла 21 и 25 версия, но Java Home должен смотреть на 21</blockquote></div><div><br /></div><div>И ведь не зря пошла!</div><div><br /></div><div><blockquote>По умолчанию стандартная установка через <code>winget</code> <b>перепишет</b> ваши переменные <code>JAVA_HOME</code> и <code>Path</code>, сделав Java 25 основной в системе. Инсталлятор от Adoptium (MSI-пакет) устроен так, что он автоматически прописывает себя в системные переменные.<br /><br />Если вы хотите, чтобы глобальной версией в системе оставалась <b>Java 21</b>, а Java 25 использовалась только точечно (например, внутри Giga IDE/Gradle), у вас есть два отличных пути.</blockquote><p></p><blockquote>...&nbsp;</blockquote><p><br /></p><p>Более того! Так как ИИ-шка запоминает контекст, то после шагов для установки Java чат-бот сам выдал инструкцию «Как потом настроить это в Giga IDE (IntelliJ IDEA)?»</p><p>Как удобно стало в мире с ИИ! ????&nbsp;</p><p></p></div><i></i><p></p>]]></description>
<link>http://okiseleva.blogspot.com/2026/06/ide.html</link>
<pubDate>Mon, 22 Jun 2026 19:54:11 +0300</pubDate>
</item>
<item>
<title>Типы границ для классов эквивалентности</title>
<description><![CDATA[<p>&nbsp;</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3NFUah4CHKfw4R2q8G407cMm8FGebHghQXnfV0Hh_SZYFix-Hjle5t9E2JVN3FJIN0P_MN0bqlt7B5HJmaKvCJf58a2ofhCWvP3CrvFIoolWR9GxKRVpPdqkik8iQX3aKAn7o6aX4oiz9twyrbiyQsdqhlVNp4sNSH-mqaXtmh3HXO7_J50vAnD8Zdyg/s963/%D0%A2%D0%B8%D0%BF%D1%8B%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%20%E2%80%94%20%D0%BA%D0%BE%D0%BF%D0%B8%D1%8F.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="537" data-original-width="963" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3NFUah4CHKfw4R2q8G407cMm8FGebHghQXnfV0Hh_SZYFix-Hjle5t9E2JVN3FJIN0P_MN0bqlt7B5HJmaKvCJf58a2ofhCWvP3CrvFIoolWR9GxKRVpPdqkik8iQX3aKAn7o6aX4oiz9twyrbiyQsdqhlVNp4sNSH-mqaXtmh3HXO7_J50vAnD8Zdyg/s320/%D0%A2%D0%B8%D0%BF%D1%8B%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%20%E2%80%94%20%D0%BA%D0%BE%D0%BF%D0%B8%D1%8F.png" width="320" /></a></div><br /><p></p><p><a href="https://habr.com/ru/articles/1045436/" style="font-size: x-large;" target="_blank"><b>Ссылка на Хабр</b></a></p><p><br /></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Про типы границ я впервые услышала на тренинге Алексея Баранцева. Зачем они нужны? Да просто чтобы не забыть всё проверить. Написал чек-лист, потом проверяешь себя:</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">— Все учел? Вот эти классы эквивалентности, какие границы логические? А какие технологические? ...</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Так можно вспомнить о проверке, про которую забыл или просто не подумал! Полезная штука.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Алексей дал нам тогда про такую типизацию границ:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Физическая</span> — которую физически нельзя преодолеть.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Логическая</span> — ограничение, накладываемое логикой, не программой.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Технологическая</span> — ограничение, накладываемое используемой технологией.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Произвольная</span> — ограничение, наложенное аналитиком или заказчиком.</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Лично я предпочитаю совмещать физическую и логическую. Потому что физическая — это то, что мы вообще преодолеть не можем. Например, при всем желании мы не введем строку отрицательной длины, ну никак не сможем.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Но то, что физически сделать нельзя, часто в программе сделать можно. Например, ввести в количество участников митапа «1,5 человека» — физически невозможно, но программа то позволяет. Значит, для программы это уже логическая, мы же понимаем, что это невозможно.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Так что в моей классификации есть всего три типа границ (сокращенно ЛТП):</p><ol style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="counter-increment: item 1; line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Логическая</span> — ограничение, накладываемое логикой, не программой.</p></li><li style="counter-increment: item 1; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Технологическая</span> — ограничение, накладываемое используемой технологией.</p></li><li style="counter-increment: item 1; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Произвольная</span> — ограничение, накладываемое аналитиком или разработчиком.</p></li></ol><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Рассмотрим каждую из них!</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><br /></p><span><a name='more'></a></span><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><br /></p><p><a class="anchor" id="logic" name="logic" style="background-color: white; color: #548eab; display: block; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin-top: 24px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" target="_blank"></a></p><h3 style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; font-size: 1.125rem; font-weight: 500; line-height: 1.4375rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Логическая граница</h3><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Логическая граница</span> — ограничение, накладываемое логикой, не программой. Это те аксиомы, которые мы знаем с детства. Или физические ограничения реального мира. Например, «1,5 человека»: в программе ввести такое можно, но логично, что это бред и так не бывает.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Самые важные и базовые границы:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><a href="https://okiseleva.blogspot.com/2016/12/blog-post_15.html" rel="noopener noreferrer nofollow" style="background-color: rgba(0, 0, 0, 0); color: #548eab; quotes: &quot;«&quot; &quot;»&quot;; text-decoration: none; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" target="_blank">Ноль</a> — проверяем всегда и везде!</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Один — а вот это неочевидно бывает, обычно только ноль смотрят, а есть еще разница «один-много».</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Эти границы надо смотреть всегда. А какие бывают другие? Посмотрим на примерах:</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">1. В минуте 60 секунд</span></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Даже если система дает ввести больше, мы все равно проверяем 60.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Допустим, разработчик поставил ограничение на поле ввода секунд — можно ввести максимум 2 числовых символа. У нас получаются интервалы:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">0 — 60</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">60 — 99</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">При этом 0 и 60 — логические границы. Логично, что время НЕ может быть отрицательным (в физическом мире ну никак, даже если программа позволяет ввести такое значение). Также логично, что секунд будет максимум 60, иначе это уже следующая минута.</p><figure class="full-width " style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: center; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><img decode="async" height="1080" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/cd0/e23/b97/cd0e23b97db53522a3e4fa6c5431159c.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/cd0/e23/b97/cd0e23b97db53522a3e4fa6c5431159c.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/cd0/e23/b97/cd0e23b97db53522a3e4fa6c5431159c.png 781w" style="border-style: none; height: auto; margin: 0px; max-width: 100%; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle;" width="1200" /></figure><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Что делает интервал «60 — 99» очень интересным для проверки: что будет, если я введу 70 секунд? Система пересчитает это как 1 минуту и 10 секунд? В любом случае это уже разные классы эквивалентности: «нормальное количество секунд» и «больше, чем минута». Проверяем оба + границу между ними.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">А вот в числе 99 никакой логики нет. Ее просто такой сделал разработчик. Завтра он передумает и сделает границу в 999 — и что, изменится логика? Нет. Логика от прихоти разработчика не меняется. Какое бы ограничение он не поставил, у нас остаются границы 0 и 60. А вот 99 — это сплошной произвол, к логике отношения не имеет.</p><figure class="full-width " style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: center; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><img decode="async" height="1080" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/1e4/833/190/1e4833190a9d65133aface115e6a9f6d.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/1e4/833/190/1e4833190a9d65133aface115e6a9f6d.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/1e4/833/190/1e4833190a9d65133aface115e6a9f6d.png 781w" style="border-style: none; height: auto; margin: 0px; max-width: 100%; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle;" width="1468" /></figure><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">2. Строки отрицательной длины не бывает</span></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Если у нас есть строковое поле, то самая очевидная граница — ноль. Логично, что символов всегда будет больше нуля, меньше мы ну никак ввести не сможем. Поэтому всегда проверяем:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Пустое поле (ноль) — логическую границу.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Один символ (один) — пограничное значение.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Один пробел — это не то же самое, что один любой символ, поэтому рекомендую проверить.</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Даже если разработчик ставит ограничение «имя может быть от 3 до 10 символов», это не отменяет границу в нуле и мы ее все равно проверяем. А потом уже смотрим границы по ТЗ.</p><figure class="full-width " style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: center; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><img decode="async" height="1080" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/8fa/ea5/cb2/8faea5cb2c4d6083952ce58b4a2e8e49.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/8fa/ea5/cb2/8faea5cb2c4d6083952ce58b4a2e8e49.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/8fa/ea5/cb2/8faea5cb2c4d6083952ce58b4a2e8e49.png 781w" style="border-style: none; height: auto; margin: 0px; max-width: 100%; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle;" width="1161" /></figure><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">3. Количество книг или платьев в заказе — положительное целое число</span></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Если мы тестируем интернет-магазин, то добавляем что-то в корзину: платье, пиццу, книжку, пару обуви. И количество товара всегда будет целым положительным числом. То есть 2 логических границы:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">0 — мы не можем заказать «минус одно платье»;</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Целое число — мы не можем заказать дробное.</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Конечно, с нулем проще: мы знаем границу, знаем пограничные значения (-1 и 1), понимаем классы эквивалентности (до нуля и после).</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">В случае дробных значений конкретного граничного значения у нас нет — мы просто знаем, что это разные классы эквивалентности, целые и дробные числа. А разделяет их логика. Поэтому в данном случае мы не тестируем граничное значение, мы просто проверяем «за границей», пытаемся нарушить правильный ход событий и вылезти в некорректную область. То есть ввести дробное число.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">А дальше уже вспоминаем, что дробные пишут и через точку, и через запятую: один большой класс разделился на два поменьше. Выбираем значение из каждого и проверяем.</p><figure class="full-width " style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: center; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><img decode="async" height="1080" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/3ac/cc2/3ea/3accc23ea2df549a1e2d4c1822e7e7c1.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/3ac/cc2/3ea/3accc23ea2df549a1e2d4c1822e7e7c1.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/3ac/cc2/3ea/3accc23ea2df549a1e2d4c1822e7e7c1.png 781w" style="border-style: none; height: auto; margin: 0px; max-width: 100%; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle;" width="1138" /></figure><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">4. Возраст — тоже положительное число</span></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Отрицательного возраста быть не может — это логично. Когда человек рождается, то ему уже 0 лет, 0 минут, сколько-то секунд. Когда он ещё в животике, это тоже не «минус 5 месяцев ему» — это «3 месяца беременности мамы».</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Дробное значение у возраста бывает — «1.5 годика», например. А вот отрицательное — нет.</p><figure class="full-width " style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: center; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><img decode="async" height="1080" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/496/096/775/4960967754070820aa5bd28113895a34.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/496/096/775/4960967754070820aa5bd28113895a34.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/496/096/775/4960967754070820aa5bd28113895a34.png 781w" style="border-style: none; height: auto; margin: 0px; max-width: 100%; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle;" width="730" /></figure><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Итого!</span></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Запомните правило — логика от прихоти разработчика НЕ меняется.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Если разработчик изменил в программе значение и граница поменялась — значит, она была НЕ логическая. А чтобы найти логическую, включаем мозг и думаем: а каким бывает (или не бывает) наше поле? Абстрагируясь от того, что написано ТЗ. ТЗ у нас пойдет отдельно.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Логика может разделять разные классы (дробное / целое число), а может быть конкретным значением. И если вы нашли число, то всегда проверяйте:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><a href="https://okiseleva.blogspot.com/2016/12/blog-post_15.html" rel="noopener noreferrer nofollow" style="background-color: rgba(0, 0, 0, 0); color: #548eab; quotes: &quot;«&quot; &quot;»&quot;; text-decoration: none; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" target="_blank">Ноль — не ноль</a></p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Один — много.&nbsp;</p></li></ul><h3 style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; font-size: 1.125rem; font-weight: 500; line-height: 1.4375rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Технологическая граница</h3><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Технологическая граница</span> — ограничение, накладываемое используемой технологией.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Например, при попытке запихать в integer больше, чем 2 147 483 647. И так как перфокарты уже давно в прошлом, то сейчас поиск технологической границы — это попытка вставить МНОГО данных в поле.&nbsp;</p><figure class="full-width " style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: center; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><img decode="async" height="1080" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/0fb/fda/b2a/0fbfdab2a118fc7193f24a21becc43d8.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/0fb/fda/b2a/0fbfdab2a118fc7193f24a21becc43d8.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/0fb/fda/b2a/0fbfdab2a118fc7193f24a21becc43d8.png 781w" style="border-style: none; height: auto; margin: 0px; max-width: 100%; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle;" width="1074" /></figure><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Если говорить о примерах, то они одинаковы для чисел и строк. И туда и туда мы пытаемся запихать незапихиваемое — сто миллионов чисел или символов. Есть два способа:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Нажать «9» и держать — чтобы получилось «9999999999999999999999999999...» И так сколько влезет.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Использовать специальные инструменты, например, Perlclip.</p></li></ul><blockquote style="background: 0px 0px rgb(255, 255, 255); border-left: 4px solid rgb(84, 142, 171); color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 12px; padding: 0px 12px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">См также:</span></p><p style="font-size: 1rem; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><a href="https://okiseleva.blogspot.com/2015/08/blog-post_8.html" rel="noopener noreferrer nofollow" style="background-color: rgba(0, 0, 0, 0); color: #548eab; quotes: &quot;«&quot; &quot;»&quot;; text-decoration: none; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" target="_blank">Как сгенерить большую строку, инструменты</a> + помощь ИИ, разумеется</p></blockquote><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">При этом, даже если в поле нельзя ввести больше какого-то количества символов, мы все равно генерируем большую строку и пробуем ее туда вкопипастить. А вдруг сначала все упадет от переполнения буфера, а потом уже сработает проверка на клиенте, не дающая вводить.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">И кстати, если в поле нельзя ВВЕСТИ с клавиатуры что-то, это еще не значит, что «плохое» значение туда нельзя ВКОПИПАСТИТЬ. Обязательно пробуйте.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">А если говорить про ограничение на длину поля, так это вообще обычно простейший maxlengh, который легко обходится.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Ладно, хватит теории, посмотрим на примерах.</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Типы полей в БД — максимальное число, которое можно туда сохранить или длина поля (в оракл для строки это 5000 символов). При тестировании самой БД это произвол, а теперь это ограничение технологии.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Путь к файлу — операционная система указывает допустимость символов или длину пути.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s eas]]></description>
<link>http://okiseleva.blogspot.com/2026/06/blog-post.html</link>
<pubDate>Mon, 22 Jun 2026 18:49:24 +0300</pubDate>
</item>
<item>
<title>Находим баги быстрее: умный способ дебага проблем интеграции</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/finding-bugs-faster.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/finding-bugs-faster.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Арун Вишванатан (Arun Vishwanathan)<br /><strong><a href="https://www.ministryoftesting.com/articles/finding-bugs-faster-a-smarter-way-to-debug-integration-failures" mce_href="https://www.ministryoftesting.com/articles/finding-bugs-faster-a-smarter-way-to-debug-integration-failures" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><h1>Проблема: отладка билдов в быстро меняющемся мире</h1>
<p>Современное программное обеспечение быстро меняется. Разработчики постоянно добавляют новые функции и исправляют ошибки, что приводит к частым обновлениям. При всех этих обновлениях что-то иногда ломается, и выяснение, что именно стало причиной проблемы, может превратиться в длительную головную боль.</p>
<p>Представим, что команда обнаружила баг в недавней версии продукта. Где-то по пути что-то пошло не так. Но как понять, когда именно всё начало ломаться?</p>
<p>Можно протестировать каждый билд по очереди, начиная с последней стабильной версии, пока не будет найден первый проблемный. Это прямолинейный подход, и он работает. Но он может занять часы или даже дни, особенно если билды выходят часто. Проверка каждого из них требует времени.</p>
<p>В этой статье представлен более быстрый метод определения точной версии, в которой появились проблемы, с использованием более эффективного подхода к поиску, основанного на параллельном тестировании на нескольких устройствах.</p>]]></description>
<link>https://software-testing.ru/library/testing/test-analysis/4495-finding-bugs-faster-a-smarter</link>
<pubDate>Sun, 21 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Работа с нестабильными тестами в Allure 3</title>
<description><![CDATA[<p>Михаил Ланкин, автор статей команды <a href="https://qatools.ru/?utm_campaign=blog-post&amp;utm_medium=partner&amp;utm_source=softwaretesting&amp;utm_content=link" mce_href="https://qatools.ru/?utm_campaign=blog-post&amp;utm_medium=partner&amp;utm_source=softwaretesting&amp;utm_content=link" target="_blank" style="">ТестОпс
</a><br /><a href="https://habr.com/ru/companies/testops_tms/articles/988980/" mce_href="https://habr.com/ru/companies/testops_tms/articles/988980/" target="_blank" style="">Оригинальная публикация</a></p>
<p>Нестабильные (flaky) тесты создают постоянные трудности для тестировщиков. Такие тесты не отражают состояния тестируемой системы и подрывают доверие к тестовому набору.</p><p>Вооружившись лучшими практиками, нестабильность можно свести к минимуму, но полностью избавиться от неё крайне трудно. Чтобы лучше её контролировать, нужны инструменты, позволяющие выявлять нестабильные тесты — например, Allure Report. В этом руководстве мы посмотрим, как Allure работает с нестабильными тестами:</p><ul><li><p>Исследуем, как устроена история тестов</p></li><li><p>Разберёмся, как история позволяет определять нестабильные тесты</p></li><li><p>Настроим перезапуск тестов</p></li></ul><p>Эту функциональность мы рассмотрим на примере PyTest, но все те же принципы работают и с другими фреймворками.</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-automation/4522-allure-</link>
<pubDate>Thu, 18 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Ломаем автопилот: как я перестал тестировать механически</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/breaking-the-autopilot.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/breaking-the-autopilot.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Ужвал Кумар Сингх (Ujjwal Kumar Singh)<br /><strong><a href="https://www.ministryoftesting.com/articles/breaking-the-autopilot-how-i-stopped-testing-software-like-a-machine" mce_href="https://www.ministryoftesting.com/articles/breaking-the-autopilot-how-i-stopped-testing-software-like-a-machine" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><h1>Сигнал к пробуждению</h1>
<p>Я занимаюсь тестированием программного обеспечения уже три года. Тестировал разные типы приложений, следовал всем профессиональным практикам, выполнял тест-кейсы и отмечал все пункты.</p>
<p>Но иногда я не думал о том, что делаю. Я просто механически проходил шаги, выполняя тесты как машина. И именно так пропустил критический баг, который заблокировал доступ к платформе как новым, так и существующим пользователям. Этот баг попал в продакшен, и по мере развития ситуации стало понятно, что процессом тестирования и выбранными стратегиями недовольны. Через пару дней почта каждого члена команды взорвалась жалобами клиентов, и менеджер посмотрел тем самым взглядом. Все знают этот взгляд. Он не злой. Просто… разочарованный.</p>
<p>Следующие несколько дней я прокручивал всё это в голове, пытаясь понять, где ошибся. Все сценарии были протестированы правильно, все шаги выполнены. И всё же я полностью упустил, как реальный пользователь мог бы взаимодействовать с системой.</p>
<p>Тогда ко мне пришло осознание: тестирование велось мной механически. Но программное обеспечение создаётся для людей.</p>]]></description>
<link>https://software-testing.ru/library/around-testing/processes/4496-breaking-the-autopilot</link>
<pubDate>Tue, 16 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Как начать тестировать внутренние покупки (In-App Purchases) на Android</title>
<description><![CDATA[<p>Автор: Павлович Евгений</p>
<p>Эта статья основана на моем опыте и, надеюсь, поможет быстрее стартовать коллегам в ручном тестировании внутренних покупок в  Android-приложениях.  Это не исчерпывающее руководство, просто хочется дать стартовые инструкции, чтобы можно было увереннее начать. </p><p>IAP - важный элемент монетизации мобильных приложений. К примеру, частый сценарий, предложение подписки через paywall. Корректная работа этого механизма критична как для бизнеса, так и для пользовательского опыта.</p>]]></description>
<link>https://software-testing.ru/library/testing/mobile-testing/4520-in-app-purchases</link>
<pubDate>Sun, 14 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Software Engineering Happiness Index 2025</title>
<description><![CDATA[<p><span style="font-size: medium;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZRReF_MU6HE1Ws2Ypvr8kjJnaK_Li1qn0JgEJ0B7u761D-UVUw0_S_uohGCi6-b7ce5Dg68812j-xml3hu66K2VFuworn0HxShgHac_6hXkwNfqOJDPzU9TKi5mLLg1yQp1kLH70sXMte0ZVUZOtTg6ELHaod4UsVoZPGBt_v2J-T1JP7X8oRsZwsV6sJ/s1254/ChatGPT%20Image%207%20%D0%B8%D1%8E%D0%BD.%202026%20%D0%B3.,%2006_28_56.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-size: medium;"><img border="0" data-original-height="1254" data-original-width="1254" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZRReF_MU6HE1Ws2Ypvr8kjJnaK_Li1qn0JgEJ0B7u761D-UVUw0_S_uohGCi6-b7ce5Dg68812j-xml3hu66K2VFuworn0HxShgHac_6hXkwNfqOJDPzU9TKi5mLLg1yQp1kLH70sXMte0ZVUZOtTg6ELHaod4UsVoZPGBt_v2J-T1JP7X8oRsZwsV6sJ/s320/ChatGPT%20Image%207%20%D0%B8%D1%8E%D0%BD.%202026%20%D0%B3.,%2006_28_56.png" width="320" /></span></a></div><p></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">"Лучше поздно, чем как тогда"</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">В конце 2024 и в конце 2025 я проводила небольшое исследование на предмет удовлетворенностью работой. И все руки не доходили оформить результат. Но наконец-то таки дошли. Вот <span class="s1" style="color: #1f6bc0;">тут</span><span class="Apple-converted-space">&nbsp; </span>по ссылке можно посмотреть/скачать небольшую инфографику.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Исследование состоит из вопросов:</span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">- Я знаю и понимаю цели моей компании.</span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">- У меня есть все необходимые ресурсы для достижения рабочих целей.</span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">- Я чувствую поддержку от коллег и руководителя.</span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">- Я удовлетворен(-а) своей работой ("я счастлив")</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Это упрощенный вариант, конечно же на нашу удовлетворенность работой влияет гораздо больше факторов. Но задача была дать быстрый инструмент рефлексии.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Если коротко - основное влияние на удовлетворенность дает знание целей компании, которое поддерживается ресурсами и поддержкой.<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Давайте углубим эти четыре вопроса, каким образом можно на них опереться для определения ближайших шагов для себя.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;"><b>Цели компании</b><b></b></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Может быть такое, что<span class="Apple-converted-space">&nbsp; </span>мое внимание меня подвело и я просто "пропустил мимо ушей". Определенно может. Вне зависимости от занимаемой позиции. На работе мы все взрослые люди, это не детский сад и не школа. Никто не обязан все разжовывать, класть нам в рот, да и еще помогать проглотить.<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Если вы руководитель, то с вас спрос вдвойне. Помним волшебную<span class="Apple-converted-space">&nbsp; </span>фразу "никто не живет в моей голове". То, что кажется очевидным и понятным вам, может быть совсем не очевидным для сотрудников. Каскадирование целей и донесение их до команды - одна из основных ваших задач.<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Итого:<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">- как сотрудник: задать вопрос руководителю.</span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">- как руководитель: определять цели команды и как они соотносятся с целями компании.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Вне зависимости от выполняемой роли - понимать свои профессиональные цели, и если это никак не бьется с целями команды и компании - делать выводы, и никого не винить. Так бывает. А если соотносится - выжимать из этого синергетический максимум, делать win-win масштабным и кайфовать.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;"><b>Ресурсы</b><b></b></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Задача руководителя - организовывать работу и в частности обеспечить необходимыми ресурсами сотрудников, банально убеждаться, что для поставленных задач у сотрудников есть все необходимое.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Задача профессионала - решать поставленные задачи. Если чего-то не хватает, о "чудо" - сказать об этом, а не ждать пока тебя спросят, что с задачей.<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;"><b>Поддержка</b><b></b></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Для меня это больше про "blameless culture": если что-то пошло не так, что-то не получилось, то идет проработка как так получилось и что нужно изменить в процессах, в работе, чтобы больше не повторять ошибок, а не поиск конкретного человека, которого во всем обвинят.<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Что если в работе встретилась какая-то преграда, человека не оставят один на один. Опять же не забываем просить о помощи, если она нужна.<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">А руководителю важно контролировать исполнение задач так, чтобы все шло к успеху.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;"><b>Удовлетворенность работой</b><b></b></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Как ни крути, работа занимает существенное время в нашей жизни. Да, у нас у всех разные потребности в части работы, разные желания того, как должна выглядеть наша работа. Вне зависимости от того, чего именно каждому из нас хочется от работы (или чего точно не хочется) - эмоционально чувствовать, что работа "в кайф", ну или хотя бы "не бесит" очень помогает по жизни идти более уверенным шагом.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span class="Apple-converted-space"><span style="font-size: medium;">&nbsp;</span></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;"><b>В заключении</b>: если что-то раздражает нас в других - скорее всего это бесит нас в нас же самих. Важно понимать, чего мы хотим, и видеть все возможности вокруг. Злиться и быть недовольным - нормально, раствориться в этом - нет.<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Отвечаем за себя во всех аспектах своей жизни и не забываем коммуницировать, а не надеяться на "это и так понятно", и не ждем, что нас должны понять здесь и сейчас, просто потому что мы что-то сказали. Донесение информации так, чтобы нас поняли - один из критериев профессиональности.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Интересной работы! С удовольствием в пятницу вечером отправляться в выходных, и с удовольствием в понедельник идти работать так как нравится вам!</span></p><p><span style="font-size: medium;"><br /><br /><br /></span><br /></p>]]></description>
<link>http://sqalife.blogspot.com/2026/06/software-engineering-happiness-index.html</link>
<pubDate>Sun, 07 Jun 2026 06:32:17 +0300</pubDate>
</item>
<item>
<title>TechWriter Days 3. Как это было</title>
<description><![CDATA[<p>&nbsp;</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR00cfRlK5w0Cd54H8WH1RAi6syhieBzMg2OSW8aNk1WwkQGzZvRR6WAOdFZgYl2gzKhir_zZF9On3rvjjsdhSKETNuESX00qhtx9HQjcs3C-wt1LAwrOgZmnnSO71qCulz5TVEphDaE3CA74ECkygdlDP6LfUnWBSdzMesO-yO2v8rtSWFuiHGY8FcD0/s1462/22.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1096" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR00cfRlK5w0Cd54H8WH1RAi6syhieBzMg2OSW8aNk1WwkQGzZvRR6WAOdFZgYl2gzKhir_zZF9On3rvjjsdhSKETNuESX00qhtx9HQjcs3C-wt1LAwrOgZmnnSO71qCulz5TVEphDaE3CA74ECkygdlDP6LfUnWBSdzMesO-yO2v8rtSWFuiHGY8FcD0/s320/22.jpg" width="240" /></a></div><br /><p></p><p>27-28 марта в Москве прошла 3-я конференция для технических писателей —&nbsp;TechWriter Days 3.</p><p>Сайт конференции —&nbsp;<a href="https://techwriterdays.ru/">https://techwriterdays.ru/</a>.</p><p>Программа —&nbsp;<a href="https://techwriterdays.ru/ru/program/137253">https://techwriterdays.ru/ru/program/137253</a></p><p><br /></p><p>«Я там был, мед, пиво пил» © И хочу поделиться с вами. Конференция отпочковалась от конференции аналитиков, так как тех писы уже — дело стандартное, есть отдельные должности под них.</p><p>А я сама в свое время и аналитиком на проектах была, да и с документацией работала постоянно, потому что я — бюрократ ))) Так что очень интересно было посетить эту конференцию.</p><p>Организация тут, как всегда у Владислава с Татьяной Орликовых, на высоте. Еда, чай, место для отдыха, куча всяких активностей, да и просто интересные доклады! Расскажу про те, где я была и где хотела бы.</p><span><a name='more'></a></span><p><br /></p><h3 style="text-align: left;">Мой список "посмотреть потом"</h3><p></p><ol style="text-align: left;"><li><a href="https://techwriterdays.ru/ru/talk/137362" target="_blank">Тихая эпидемия в IT, или Почему выгорают технические писатели</a>&nbsp;— плохо себя чуствовала, не осталась на последние доклады, ушла домой. Но исходно ставила галочку сходить на доклад. Полистала слайды — интересно и жизненно, особенно про команды, где твою роль не понимают. Хотя это история про выгорание, а хотелось бы "что делать в такой команде", но тоже интересно)</li><li><a href="https://techwriterdays.ru/ru/talk/141107" target="_blank">Использование стилей MS Word без страха</a>&nbsp;— тут обещают реальные кейсы из жизни, я такое люблю)</li><li><a href="https://techwriterdays.ru/ru/talk/140867" target="_blank">Внутреннее продвижение базы знаний: от справочника до культуры работы с информацией</a>&nbsp;— внутреннее продвижение тоже очень актуальная тема!</li><li><a href="https://techwriterdays.ru/ru/talk/140956" target="_blank">Документация как продукт: от текстов к стратегии и управлению опытом</a>&nbsp;— документация как отдельный продукт, в том числе улучшаюший онбординг. Это прям откликает мне, я сама делала онбординг))</li><li><a href="https://techwriterdays.ru/ru/talk/141084" target="_blank">Отчеты и метрики в документации: как считать влияние на бизнес</a>&nbsp;— всегда интересно, кому какие метрики зашли</li></ol><p><br /></p><h2 style="text-align: left;">Какие доклады я слушала</h2><p><br /></p><h3 style="text-align: left;">Кому доверить ревью API — техпису или искусственному интеллекту.&nbsp;Камила Мазаева</h3><p><a href="https://techwriterdays.ru/ru/talk/141082" target="_blank">Ссылка на доклад</a></p><p>Камила работает в Альфабанке, где много всяких разных проектов. Путь документации там такой:</p><p>Аналитик → техпис → разработка</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRYHo17r_xD-zmWiw5NC6TD6HhFOw8kDPI8CUmpDQJbZy4qrO_7NY3QsEldmgElN7OJnhHgN2Dm-o3NlP4YmPQWVg2g9D9Bsg3B97htdoUbtQYYt7bjtrIlTVcvykGzkVy65-AD8lZjfHnRJKlspkMuoP_hVExYBGr063quRj2sgkrgxgIx4HUJ5EvJSM/s1280/11.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRYHo17r_xD-zmWiw5NC6TD6HhFOw8kDPI8CUmpDQJbZy4qrO_7NY3QsEldmgElN7OJnhHgN2Dm-o3NlP4YmPQWVg2g9D9Bsg3B97htdoUbtQYYt7bjtrIlTVcvykGzkVy65-AD8lZjfHnRJKlspkMuoP_hVExYBGr063quRj2sgkrgxgIx4HUJ5EvJSM/s320/11.jpg" width="320" /></a></div><p>Технический писатель нужен, потому что документацию пишут разные люди, в разных стилях. А нужен единый, за этим следит техпис. Но техписы тонут в работе — когда приходят документы с опечатками, разным стилем и тд.</p><p>Поэтому решили нудную работу делегировать ИИ. Посмотрели, что да как, и решили сделать так, чтобы ИИ не вносил правки в текст, а присылал отчет по найденным проблемам:</p><p></p><ul style="text-align: left;"><li>уровень критичности</li><li>где проблема?</li><li>как написать лучше</li></ul><div>И человек уже принимает или отклоняет такие правки. В итоге аналитик открывает чат с ботом, куда уже внесен нужный промт → дал документацию, получил фидбек. Красота!</div><div><br /></div><div>Ну и выводы — ИИ хорошо правит простые опечатки и быстро обрабатывает документы. Но не очень хорош с контекстом, терминологией и работе с неоднозначностью.</div><div><br /></div><div>И, конечно, нужно помнить, что сердце ИИ — хороший промт!</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNxsMg9G33oNeYk99pdViv49npB4spfap9KInrtPxtFyKveIobEBBaJen3LwZw0biRu22oy2PF_EzRXIxc8tmIgBFyB2B9JjhRPBbmkqcVkL8ngdFo3XMqzl2vq9Zc_LdPE-Pigf_y_9lpeZJURLomidNeVYty21PVp_J9mPtOX9loXQgC1_WJnksBAtQ/s1280/12.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNxsMg9G33oNeYk99pdViv49npB4spfap9KInrtPxtFyKveIobEBBaJen3LwZw0biRu22oy2PF_EzRXIxc8tmIgBFyB2B9JjhRPBbmkqcVkL8ngdFo3XMqzl2vq9Zc_LdPE-Pigf_y_9lpeZJURLomidNeVYty21PVp_J9mPtOX9loXQgC1_WJnksBAtQ/s320/12.jpg" width="320" /></a></div><br /><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Через тернии к звездам: как мы перевезли всю документацию Яндекса на Diplodoc.&nbsp;Эльвира Гильманова и&nbsp;Михаил Кошкин</h3><div><a href="https://techwriterdays.ru/ru/talk/140923" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Довольно интересный рассказ о переезде документации с одной платформы на другую. Переезд занял 5 лет! ????</div><div><br /></div><div>Раньше жили на DITA, которая выглядела как документация из 2000-х годов, перешли на YFM.</div><div>Всякое бывало, что-то предусмотрели, а что-то — нет.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh48ip61s-bbUIlZU5fbujPOKdKZxDxPLiT5_vymQyBVMp4qcTaHfsbBAV9uqXh8A_Me6nt206rZ4w3_NgbQcoUB2khdJ6GhmLJcOwaSpgeDj2WRXiYjQtzFBmEtxQLsZpZrqY5fsTM-7Q8c4NTEs4jQhD-MGMvFhh5QLimUYIOV6ueSRB0HQxLX-QijV0/s1280/13.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh48ip61s-bbUIlZU5fbujPOKdKZxDxPLiT5_vymQyBVMp4qcTaHfsbBAV9uqXh8A_Me6nt206rZ4w3_NgbQcoUB2khdJ6GhmLJcOwaSpgeDj2WRXiYjQtzFBmEtxQLsZpZrqY5fsTM-7Q8c4NTEs4jQhD-MGMvFhh5QLimUYIOV6ueSRB0HQxLX-QijV0/s320/13.jpg" width="320" /></a></div><br /><div>Были и косяки — нужно было объединить документацию. Посмотрели, она написана на разных платформах, провели диагностику, какая лучше, выбрали... DITA. И через месяц узнали, что все пеередут в YFM.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3E8Y0J57vzN3ubt5BxRqPQv02mQxAogwxUUh4620SC-ZaXw2uQsoNmhNruIG6aXPwZm0pt-bz_hUl5cAXYJI2g08ZIdd_nFoLiyMR1Im3OlLSZmLe6UHHU7aCNor-g29xBpf5FJZdT6MA4_IfKRIbAQrF9GS0Xqr6TeNtgeOPJo0izhXnqyNkhgvWzok/s1280/14.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3E8Y0J57vzN3ubt5BxRqPQv02mQxAogwxUUh4620SC-ZaXw2uQsoNmhNruIG6aXPwZm0pt-bz_hUl5cAXYJI2g08ZIdd_nFoLiyMR1Im3OlLSZmLe6UHHU7aCNor-g29xBpf5FJZdT6MA4_IfKRIbAQrF9GS0Xqr6TeNtgeOPJo0izhXnqyNkhgvWzok/s320/14.jpg" width="320" /></a></div><br /><div>Была ситуация со старым багом, который вроде как не очень хорошо ловится, вот и не правили. А потом выяснилось, что популярная документация не могла из-за него мигрироваться. Пытались сделать костыли — заняло квартал с нулевым результатом. А переписать с нуля заняло месяц.</div><div><br /></div><div>Так что хоть "переписать с нуля" и боятся, иногда это самый лучший вариант. И даже самый быстрый, хотя кажется наоборот))</div><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Собрать документацию в один клик: опыт применения языковых моделей и шаблонизаторов.&nbsp;Никита Осокин</h3><div><a href="https://techwriterdays.ru/ru/talk/139167" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Ребята работают по ГОСТ — а это часто не про «написать документацию», а про коммуникации, про «правильную» структуру документа.</div><p></p><p>И вот мучались, мучались, и решили сделать свое решение. Да, оно в маркдауне и после ворда писать бывает сложновато, но тут у них ИИ, наученный помогать и подсказывать, как что-то сделать.</p><p>В итоге раньше переименовали какое-то название — это надо открыть ворд, ctrl + f, поиск, замена... А если разные падежи, оно ещё и не работает! Что сделали? Единый банк переменных.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9j3x0tTU2rxAQnvyi8KYHalxGp3IASlVwJ6xPhYTMnqutMCN8zhFagdUbCt0wdZPuxj5is4BfnMJwVtT_Bg0utiIXlpL-km7gLg34K4UtTQwcGOnW50VxncWRvVGTth-MC5e2Glv0nRiE7kKW-Db3i3qANexlj84dxlXYk9avzhfooCDHNdkkaz3LD8c/s1950/15.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9j3x0tTU2rxAQnvyi8KYHalxGp3IASlVwJ6xPhYTMnqutMCN8zhFagdUbCt0wdZPuxj5is4BfnMJwVtT_Bg0utiIXlpL-km7gLg34K4UtTQwcGOnW50VxncWRvVGTth-MC5e2Glv0nRiE7kKW-Db3i3qANexlj84dxlXYk9avzhfooCDHNdkkaz3LD8c/s320/15.jpg" width="320" /></a></div><br /><p>Ну и не только его, конечно)) В итоге что получили? Приходит заказчик:</p><p>— Ой, а давайте всё же систему именовать не АС "Документирование", а АС "Техпис"</p><p>Раньше такие просьбы за неделю до сдачи проекта вызывали желание выйти в окно, а теперь "да легко"</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgurONxnqv6h4dtNaUhPW3iwLNsY_UqZyfyKx_FuXjWjYW_glY3EN2C6Rwu87nVBt_T8xyAwxOfVm1ifOsFls4xrcLCHwgmNktYJPoP1GG_KfeRQWcHh4bznbsX4dABHRrJkDcQ3siU8AQVUBviTJP1oDt7fbPWbkyn5kWt3A_elUV7EydyshrP3CqsMR0/s1950/17.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgurONxnqv6h4dtNaUhPW3iwLNsY_UqZyfyKx_FuXjWjYW_glY3EN2C6Rwu87nVBt_T8xyAwxOfVm1ifOsFls4xrcLCHwgmNktYJPoP1GG_KfeRQWcHh4bznbsX4dABHRrJkDcQ3siU8AQVUBviTJP1oDt7fbPWbkyn5kWt3A_elUV7EydyshrP3CqsMR0/s320/17.jpg" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><p><br /></p><h3 style="text-align: left;">Масштаб, сложность, автоматизация: как агенты изменили процесс документирования в Yandex Cloud.&nbsp;Александр Яковлев</h3><p><a href="https://techwriterdays.ru/ru/talk/140813" target="_blank">Ссылка на доклад</a></p><p>Александр рассказал про их опыт внедрения ИИ. Какие инструменты использовали:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjepD3MVDj_JCHQ13GwajFNRKH4cvoxyB6bzqNhjAa35jhw6qYplCQr2feU5QYdrza77vVPkXVGGTkY7GSpRRyJ0lwDWVskTT8vh0lZBi9YDJYV1CblLam6ZzExdnEBHjtmBKbttykfmbG1vrtB6_6fuqHE2_Fudgo1sx_YMn-gYGiBxZRENK_KTj_I4NM/s1950/18.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjepD3MVDj_JCHQ13GwajFNRKH4cvoxyB6bzqNhjAa35jhw6qYplCQr2feU5QYdrza77vVPkXVGGTkY7GSpRRyJ0lwDWVskTT8vh0lZBi9YDJYV1CblLam6ZzExdnEBHjtmBKbttykfmbG1vrtB6_6fuqHE2_Fudgo1sx_YMn-gYGiBxZRENK_KTj_I4NM/s320/18.jpg" width="320" /></a></div><br /><p>Методом проб и ошибок пришли к таким выводам:</p><p></p><ul style="text-align: left;"><li>агент не работает с гитом, не пушит сам — иначе он такого напушит, что только всё испортит</li><li>тестирование документации тоже на людях — ИИ бы справился, но это хорошее время для ревью.</li></ul><div>Что входит в настройку агента:</div><div><ul style="text-align: left;"><li>системный промт</li><li>режим</li><li>фоновые знания</li></ul><div>Где в итоге агент может реально приносить пользу?</div></div><div><ol style="text-align: left;"><li>Создание структурированной информации — пошаговые инструкции, обзорные статьи</li><li>Обновление существующей документации на основе тикетов, скринов, истории изменений</li><li>Подготовка Release Notes</li><li>Анализ актуальности документации из истории изменений и релизов инструментов.</li></ol><div>Был кейс — уволился человек, который отвечал за несколько проектов. Попросили ИИ проанализировать документацию на основании как раз таки истории изменений. Да, это заняло 1.5 млн токенов, но был вау-результат и найдено много проблем в доке.</div></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Changelog на лету: автоматическая генерация с помощью GitLab.&nbsp;Татьяна Кириллова</h3><div><a href="https://techwriterdays.ru/ru/talk/141108" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>В чем разница между RN и CL?</div><div><ul style="text-align: left;"><li>Release Notes — документация для пользователей</li><li>Changelog — для разработчиков, что вообще и где менялось.</li></ul><div>Так вот. Схема до автоматизации, техпис собирает change log сам:</div></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMqqghrqhbOW3FWbHDh51Z5Fs7L1YHmNzq28iFhjJ_h1NwblUPJguwlDLwWSRrhfr1j0AsVsrHMiUGjuyw-lZiogqxlRiD8vvg8vLv6TvpFqgykgTsyVUulJ75dguFdegNHNC6Bus8ZkqzKY-QEv4vgYZPzEmhqtdE7AV4w4GdQQA0bW71RRivVTnNWWM/s1462/19.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1096" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMqqghrqhbOW3FWbHDh51Z5Fs7L1YHmNzq28iFhjJ_h1NwblUPJguwlDLwWSRrhfr1j0AsVsrHMiUGjuyw-lZiogqxlRiD8vvg8vLv6TvpFqgykgTsyVUulJ75dguFdegNHNC6Bus8ZkqzKY-QEv4vgYZPzEmhqtdE7AV4w4GdQQA0bW71RRivVTnNWWM/s320/19.jpg" width="240" /></a></div><br /><div>Неприкольно! И трудозатратно. Поэтому&nbsp;описали критерии "что хотим от автоматизации", погуглили инструменты и сравнили по своим критериям:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgklD5hvLwSMnonxnydhQ-cSGY1ZkG-rNMwWpqkiYQrMpxHfuhQiMo8P4QUdge_E83mVn_EhxaQjTHcgA6RdYDMGSCcj6fDiShKBCSZxHnHSiA9r4O4KbRtdvpBWpnmsCmAqANEPTCplt4SYcbUsgj_OGgF7sfPBvRQkPtNfIThw0iOKTwWdVFLxbeXnjs/s1950/20.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgklD5hvLwSMnonxnydhQ-cSGY1ZkG-rNMwWpqkiYQrMpxHfuhQiMo8P4QUdge_E83mVn_EhxaQjTHcgA6RdYDMGSCcj6fDiShKBCSZxHnHSiA9r4O4KbRtdvpBWpnmsCmAqANEPTCplt4SYcbUsgj_OGgF7sfPBvRQkPtNfIThw0iOKTwWdVFLxbeXnjs/s320/20.jpg" width="320" /></a></div><br /><div><br /></div><div>Простой подход, но зато выбор становится очевиден!</div><div><br /></div><div>НО! Возникла проблема — робот не человек, ему нужен шаблон. И надо вводить соглашение о коммитах, иначе все пишут как душе угодно, и собранный ченджлог будет просто нечитаем. А это надо убедить разработчиков писать "как положено" )))</div><div><br /></div><div>В итоге:</div><div><ul style="text-align: left;"><li>пока проводят ревизию сообщений</li><li>планируют прикрутить автоматическое соглашение</li></ul><div>Ну и закрепили структуру сообщения:</div></div><div><ul style="text-align: left;"><li>Номер задачи — обязательно</li><li>Тип — fix, new...</li><li>Описание&nbsp;</li><li>Тело (необязательное)</li></ul><div>Пока обкатывают, впереди ещё долгий путь)</div></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Матрица зрелости процессов работы с текстом в ИТ.&nbsp;Анна Терновая</h3><div><br /></div><div><a href="https://techwriterdays.ru/ru/talk/140637" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Зачем вообще нужна матрица зрелости? Есть несколько разных причин:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioffuYJ1JqEmZAQUg0WLjuI8zQYavFRvYo_oVAV37DFwSUOcxefQFqX9EvrrvLBQfY9puk0JOS7ZMjg3uWLmbTGeXpe3XjlD5WSVkpGXIIbopoAo3e_jwfOzpIGDxgifD93QD5nG0vK5I6kM-aKFhqN1-zW2lWucIqN-gtT-jWD-5255zMUS_EYk99c6o/s1950/29.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioffuYJ1JqEmZAQUg0WLjuI8zQYavFRvYo_oVAV37DFwSUOcxefQFqX9EvrrvLBQfY9puk0JOS7ZMjg3uWLmbTGeXpe3XjlD5WSVkpGXIIbopoAo3e_jwfOzpIGDxgifD93QD5nG0vK5I6kM-aKFhqN1-zW2lWucIqN-gtT-jWD-5255zMUS_EYk99c6o/s320/29.jpg" width="320" /></a></div><br /><div>Анна рассказала про то:</div><div><ul style="text-align: left;"><li>Какую литературу использовали при изучении темы</li><li>Какую матрицу выбрали себе</li></ul><div>Главная фишка — делить каждую колонку на "наших и ваших", команду разработки и команду документирования. Потому что уровни зрелости могут быть разные и повлиять на чужую команду вы можете не всегда.</div></div><div><br /></div><div>Ну а дальше смотрим на примерах, как могут выглядеть эти матрицы и что с этим делать. Когда уже есть внедренное решение, всегда можно показать "незрелой" команде пользу — смотрите, вот мы выросли в матрице и какие это профиты дало!&nbsp;</div><div><br /></div><div>Так что нужно заручиться поддержкой одной из команд, а потом история успеха будет продвигать вас сама =)</div><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Подготовка к документированию: читаем ТЗ, собираем информацию.&nbsp;Софья Новикова</h3><div><a href="https://techwriterdays.ru/ru/talk/138958" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Софья рассказывала, как собирать информацию из разных источников:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv2hhuxFD3OM5JWkCwBVjm80ouRCIPJgpQNgcXr2tGjuZ1xpIdBIN_gsDry5dAZlKQq5a96NZVVe2wPiqKE1tUz6Cy2kmV0ApBrQQX06Du2E9AFjo6saLewTa2xraLCfNWHS057qA3IDvyoLbTsniIKhxGvVYeMeD65HeBdfHTaVrgpYl1jldnz43TYLU/s1280/21.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv2hhuxFD3OM5JWkCwBVjm80ouRCIPJgpQNgcXr2tGjuZ1xpIdBIN_gsDry5dAZlKQq5a96NZVVe2wPiqKE1tUz6Cy2kmV0ApBrQQX06Du2E9AFjo6saLewTa2xraLCfNWHS057qA3IDvyoLbTsniIKhxGvVYeMeD65HeBdfHTaVrgpYl1jldnz43TYLU/s320/21.jpg" width="320" /></a></div><br /><div>А ещё, если документация разбита на разделы, техписы вычитывают каждый раздел — всё ли понятно? А если нет, термины можно сначала погуглить или спросить у ИИ, чтобы не отвлекать коллег лишний раз вопросами!</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4mdNpg2PBoioKgPW_Q5fDpWcT7ntyc7YrCojSuInxQJbmx_Pxf0TfGUM8EVbDgry6Lz9ss1tQuSxpbILcbYou0WVwyLE63gagTXzYPDP0JvP5OkjB_bK0R7pSeD6WI8c6y02NXpr7r-sNq32D-5YHu6iX8PxvVaBjWFfpX-sPIEaEmGvlBdzAQMMMDT8/s1950/23.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4mdNpg2PBoioKgPW_Q5fDpWcT7ntyc7YrCojSuInxQJbmx_Pxf0TfGUM8EVbDgry6Lz9ss1tQuSxpbILcbYou0WVwyLE63gagTXzYPDP0JvP5OkjB_bK0R7pSeD6WI8c6y02NXpr7r-sNq32D-5YHu6iX8PxvVaBjWFfpX-sPIEaEmGvlBdzAQMMMDT8/s320/23.jpg" width="320" /></a></div><br /><div>В общем, если информации у вас мало, учитесь её собирать из разных мест, в том числе у коллег. База? База, но о ней надо помнить.</div><div><br /></div><div><br /></div><h3 style="text-align: left;">Документация как зеркало продукта: роль технических писателей в улучшении пользовательского опыта.&nbsp;Эльвира Дёгтева</h3><div><a href="https://techwriterdays.ru/ru/talk/139119" target="_blank">Ссылка на доклад</a></div><div><br />Эльвира рассказала кейсы из жизни, когда пытаешься сделать мелкую задачу, которая выливается в большой рефакторинг))</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYOy_CVAmLFA1JKVH_svz5fSaiYiaG_RCEL_Xlo664WDtOSdGBj0KKm4Qi2Kr4hyphenhyphenqwu9p9NdjPN8UGnMhuPNmTrRTH55DSU60mibnvVmt6EA6Dbw3K7k5Yu2UzKPdoCZ-7piJDOi738e85VoeMK3sbeDHDQQpJqRTQ-PMS70k02K48RTU_reZxj8QZeN0/s1280/24.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYOy_CVAmLFA1JKVH_svz5fSaiYiaG_RCEL_Xlo664WDtOSdGBj0KKm4Qi2Kr4hyphenhyphenqwu9p9NdjPN8UGnMhuPNmTrRTH55DSU60mibnvVmt6EA6Dbw3K7k5Yu2UzKPdoCZ-7piJDOi738e85VoeMK3sbeDHDQQpJqRTQ-PMS70k02K48RTU_reZxj8QZeN0/s320/24.jpg" width="320" /></a></div><br /><div>Кейсы из жизни — это всегда интересно. И тут как раз кейсы из серии "пройти мимо, сделав вид, что всё ок, не моя же зона ответственности", или начать копать... И копать... И копать))) Интересные истории!</div><div><br /></div><div><br /></div><h3 style="text-align: left;">Трансфер знаний от уходящих сотрудников.&nbsp;Denis Mazin</h3><div><a href="https://techwriterdays.ru/ru/talk/140884" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Тут интересная история — каким-то образом ребята выявили, что 18% сотрудников в зоне риска ухода. И надо бы передать их знания, пока они не пропали...</div><div><br /></div><div>Накидали такую матрицу:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQbx6iepAPSz3YcOymoBNc4oeeQU9k1h89QjdrnvEeE_LjLPH6oAPZy3Od5u6YKHVQf_4Y9V5-CatZhu1a4pzfE1ht0LkEuTcZezBqDTz2BQLGruOWE5yBTJSWHuEmZz66EziAuK7o1zOWhKhB8XH9BMHfayBFa9cNpNtHDtepVvYi_spPSikA8O59bhk/s1950/25.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQbx6iepAPSz3YcOymoBNc4oeeQU9k1h89QjdrnvEeE_LjLPH6oAPZy3Od5u6YKHVQf_4Y9V5-CatZhu1a4pzfE1ht0LkEuTcZezBqDTz2BQLGruOWE5yBTJSWHuEmZz66EziAuK7o1zOWhKhB8XH9BMHfayBFa9cNpNtHDtepVvYi_spPSikA8O59bhk/s320/25.jpg" width="320" /></a></div><br /><div>Запланировали передачу знаний и понеслось... Сначала сотрудникам некогда этим заниматься. Благо начальство поддержало и поставило высокий приоритет задаче. Но всё равно работу тоже надо работать.</div><div><br /></div><div>В итоге за год сделали многое, и пришли к неожиданному выводу, что передача знаний — это не разовая акция, а постоянная. Уйти может любой, заболеть, а знания брать где? Так что ребята теперь работают над встраиванием этого процесса в основной.</div><div><br /></div><div><br /></div><h3 style="text-align: left;">Матрица итеративного редактирования. Анна Штольц&nbsp;</h3><div><a href="https://techwriterdays.ru/ru/talk/138854" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Редакторы постоянно сталкиваются со сжатыми сроками. Дают текст на 250 стр и говорят, что есть полчаса. Что делать?</div><div><br /></div><div>В идеале нулевым этапом надо текст просто прочитать — тогда поймешь, хватит времени или надо сразу просить сроки увеличить.</div><div><br /></div><div>Ну а потом идет итеративное вычитывание, потому что так проще, если держать в уме сразу всё, что-то обязательно пропустишь. Да и не всегда нужна полная и подробная вычитка.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ_VJ0qgw92qTtOIRybaT94O-wSj7dmQcHhaI1aQSDHvb9iJvRITUCWXE1NyrbsSlfbp1xCaDe-aLaNMyrjslHUod4pn1kq7z-mnskVfp5_HuHQA3FRNiSpWvG273XmcItlOB17tx6jZNzNGpvDiuuaHKYQT4OkQIWCmrvItcQ0VOwJr2LEKftSp5T_vc/s1280/26.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1280" data-original-width="960" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ_VJ0qgw92qTtOIRybaT94O-wSj7dmQcHhaI1aQSDHvb9iJvRITUCWXE1NyrbsSlfbp1xCaDe-aLaNMyrjslHUod4pn1kq7z-mnskVfp5_HuHQA3FRNiSpWvG273XmcItlOB17tx6jZNzNGpvDiuuaHKYQT4OkQIWCmrvItcQ0VOwJr2LEKftSp5T_vc/s320/26.jpg" width="240" /></a></div><br /><div><br /></div><div>Выделили такие этапы:</div><div><ol style="text-align: left;"><li>Корректура — почти на автомате, всякие опечатки (странно, что не передали это ИИ)</li><li>Литературная правка</li><li>Выравнивание стиля — много жаргона? Это плохо.</li><li>Фактчекинг — названия, имена, даты, логика повествования</li><li>Отделка</li></ol><div>Интересно было посмотреть со стороны, как преображается текст, так как Анна показывала все на конкретном примере, а в итоге «до — после».&nbsp;</div></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Уровни качества документирования.&nbsp;Оксана Гаврюшенко</h3><div><a href="https://techwriterdays.ru/ru/talk/138400" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Оксана работает в компании, которая делает документацию на заказ. Поэтому каждый раз нужно отвечать заказчику на вопрос «почему так дорого».&nbsp;</div><div><br /></div><div>Так что ребята сделали разную градацию — что нужно? Одноразовая работа? Чтобы документация потом жила? Должна ли соответствовать ГОСТ? И прочее. Всё это влияет на сроки и стоимость. И главное, что надо научиться понимать — разницу между желаемым и достаточным.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiATHhBUqpXX_iOHY0skNKdmrDB_w7eMtwathGPtcYm2KDFvcdt6o5sPZQHaqV3qSwDV1gbLZNXo4z1jVden1TLmwej0KQDQkc0-5Q-pUY4JR8ADW8nSfF1QOaXFJAHvVZ6iEEKPdfnT-bSAydq9YXyz2LODPKGCxUcTzK9kt_cZTdqbed1dbK2z6T03EQ/s1280/27.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiATHhBUqpXX_iOHY0skNKdmrDB_w7eMtwathGPtcYm2KDFvcdt6o5sPZQHaqV3qSwDV1gbLZNXo4z1jVden1TLmwej0KQDQkc0-5Q-pUY4JR8ADW8nSfF1QOaXFJAHvVZ6iEEKPdfnT-bSAydq9YXyz2LODPKGCxUcTzK9kt_cZTdqbed1dbK2z6T03EQ/s320/27.jpg" width="320" /></a></div><br /><div><br /></div><div>Ну а в докладе Оксана приводит примеры своих матриц влияния результата на стоимость. Вполне любопытно посмотреть на чужой подход)</div><div><br /></div><div><br /></div><h3 style="text-align: left;">Декомпозиция страха: практики взаимопонимания для руководителей и команд техписателей. Мария Макеева</h3><div><br /></div><div><a href="https://techwriterdays.ru/ru/talk/137270" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Каюсь, на этот доклад я залетела случайно. Исходно собиралась в секцию B, но очень уж название зацепило. Прочитав название (не описание), я подумала, что там будет та же проблема, что звучала на конференции чуть ранее — когда другие отделы не понимают ценность техписов и надо ходить, доказывать её.</div><div><br /></div><div>Мне стало интересно послушать такой доклад, вот я сюда и завернула. А это доклад про то, как вырасти в руководителя был =))) Но тоже неплохой, как стать хорошим руководителем, а не просто начальником с кнутом!</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXozNBctz6wF8wCIl7dBDyPMVN5ur9obq5StbCo1rQdFEDvgUd-s6fFF-LYmpvE0U2fncozmpm-GFn7n-tzcNHTWCpMseDlLvmSzvhb4UZwPI6G15I9NqeXMfYAAjW5CVJgyGI6TSCCKVHPh0J36TH9KKor_x6NOV5rwhEBkrZBGKWj4E_hdp-3J8JO7o/s1280/28.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXozNBctz6wF8wCIl7dBDyPMVN5ur9obq5StbCo1rQdFEDvgUd-s6fFF-LYmpvE0U2fncozmpm-GFn7n-tzcNHTWCpMseDlLvmSzvhb4UZwPI6G15I9NqeXMfYAAjW5CVJgyGI6TSCCKVHPh0J36TH9KKor_x6NOV5rwhEBkrZBGKWj4E_hdp-3J8JO7o/s320/28.jpg" width="320" /></a></div><div><br /></div><div><br /></div><div><h3>Орг вопросы</h3></div><div>Место проведения — удобная гостиница, которая находится прямо около метро (что большой плюс). Места всем хватает, еды на обеде много всякой разной и вкусной.</div><div><br /></div><div>Помимо обеда — всякие ништяки в кофе зоне. Причем с утра и после обеда это что-то мясное / рыбное. Бутербродики, например. Чтобы можно было перекусить, если пропустил завтрак или приехал на конференцию прям с поезда. Очень здорово сделано ????</div><div><br /></div><div>Плюс комната для отдыха с аэрохоккеем, VR-очками и даже игровым автоматом)))&nbsp;</div><div><br /></div><div>А ещё куча разных стендов, где тоже и розыгрыши есть, и пообщаться с докладчиками можно. А ещё туда издательство Питер приезжает и книги продает, дешевле, чем в магазине. Я там прибарахлилась немношко)) Жаль, что серию Head First O`Really они больше не возят, я бы из неё пару книг тоже взяла...</div><div><br /></div><div>Но в любом случае, заняться вам всегда будет чем. А ещё на конференции есть много людей, готовых вам помочь и ответить на все вопросы, так что по орг части никаких вопросов нет)</div><div><br /></div><div><br /></div><div><h3>Резюме</h3></div><div>Конференция — это всегда место вдохновления. И место встреч! Когда ещё вы сможете встретиться с коллегами, живущими в других городах?)))</div><div><br /></div><div>Я рада, что конференция для технических писателей — это теперь отдельная конференция, для всех, кто любит документацию, кто тем или иным образом участвует в её создании. Документация — это очень важно! И здорово, что теперь есть, где поделиться своим опытом!&nbsp;</div><div><br /></div><div>Буду теперь ждать&nbsp;TechWriter Days 4 =)</div><p></p>]]></description>
<link>http://okiseleva.blogspot.com/2026/04/techwriter-days-3.html</link>
<pubDate>Tue, 07 Apr 2026 15:44:00 +0300</pubDate>
</item>
</channel>
</rss>
