<?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>Перестраиваем тест‑анализ и тест‑дизайн: работа с рисками и скоростью релизов в эпоху ИИ</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p>Новые времена и технологии требуют трансформации QA-подхода. Расскажем о том, как по-новому организовать процесс тест-анализа и тест-дизайна, чтобы ускорять результаты команды, а не плодить море тестов ради бурной деятельности. Разберем экономику решений, инженерные механизмы и план внедрения. Статья пригодится CTO, продактам и QA-лидам, которые уже начинают тонуть в ИИ-коде. Читайте, если хотите понять, как снизить стоимость ошибок, сократить потери времени на тестирование и сделать качество продукта более предсказуемым.&nbsp;</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":31624,"width":"276px","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="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/11/Test-analitik.png" alt="Test-analitik" class="wp-image-31624" style="width:276px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/11/Test-analitik.png 512w, https://quality-lab.ru/wp-content/uploads/2026/11/Test-analitik-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/11/Test-analitik-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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-инженеры – конкретные техники для тестов сложных состояний, взаимодействий, контрактов, ИИ-продуктов и регрессии. </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:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://quality-lab.ru/blog/test-analiz-kak-osnova-adekvatnogo-testirovaniya-pochemu-bagi-eto-ne-oshibka-testirovshhika/" data-type="post" data-id="26838">Тест-анализ</a></span> помогает разобраться, <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/roles-and-responsibilities-of-test-designer/" data-type="post" data-id="4142">Тест-дизайн</a></span> позволяет определить, <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>Если команда сгенерировала 500 новых тестов за вечер, то возникает вопрос: какие новые риски удалось таким образом закрыть &#8212; и будут ли полезны все эти проверки через полгода?</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'>DORA 2025</span><sup data-fn="4eec53cb-33e8-478d-850a-b02b98991122" class="fn"><a href="https://quality-lab.ru#4eec53cb-33e8-478d-850a-b02b98991122" id="4eec53cb-33e8-478d-850a-b02b98991122-link">1</a></sup> на основе опроса<span class='font-weight-bold'> почти 5000 специалистов</span> показало: применение ИИ связано с улучшением пропускной способности системы и продуктовых показателей, но при этом ведет к нестабильности доставки. Конечно, это отдельно взятые данные, а не доказательство, что любой ИИ ухудшает стабильность конкретного проекта, но задуматься есть о чем.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В эксперименте <span class='font-weight-bold'>METR</span><sup data-fn="e6b4a5ba-d9d1-4ec9-b04c-a7c46c0bfd6f" class="fn"><a href="https://quality-lab.ru#e6b4a5ba-d9d1-4ec9-b04c-a7c46c0bfd6f" id="e6b4a5ba-d9d1-4ec9-b04c-a7c46c0bfd6f-link">2</a></sup> <span class='font-weight-bold'>16 опытных участников</span>, работавших над <span class='font-weight-bold'>246 задачами в знакомых репозиториях с открытым исходным кодом</span>, в условиях начала 2025 года <span class='font-weight-bold'>тратили с ИИ в среднем на 19% больше времени, чем без него</span>. По данным Stack Overflow<sup data-fn="ac429d10-3ed3-441d-95f8-a659320cd4ef" class="fn"><a href="https://quality-lab.ru#ac429d10-3ed3-441d-95f8-a659320cd4ef" id="ac429d10-3ed3-441d-95f8-a659320cd4ef-link">3</a></sup> 46% респондентов не доверяли точности ответов ИИ-инструментов. Эти цифры не истина в последней инстанции, но показывают, как опасно верить в миф о гарантированном ускорении с помощью нейросетей. Особенно, если нет четкого контроля качества.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="max-width:1000px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif; display:block;">
<table style="width:100%; border-collapse:separate; border-spacing:16px 0; table-layout:fixed; margin:0 -16px;">
<colgroup>
<col style="width:33.33%;"></col>
</colgroup>
<colgroup>
<col style="width:33.33%;"></col>
</colgroup>
<colgroup>
<col style="width:33.33%;"></col>
</colgroup>
<tbody>
<tr>
<td style="background:#f8faff; border:1px solid #e5eaf2; border-radius:12px; padding:20px 22px; box-shadow:0 4px 16px rgba(0,0,0,0.04); vertical-align:top;">        </p>
<div style="font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.06em; color:#6b7280; margin-bottom:8px;">DORA · 2025</div>
<p>        </p>
<div style="font-size:32px; font-weight:700; color:#0f7b6c; line-height:1.1; margin-bottom:12px;">~5k</div>
<p>        </p>
<p style="font-size:13px; color:#374151; line-height:1.5; margin:0 0 14px; min-height:60px;">Сделали вывод: ИИ работает как усилитель сильных и слабых сторон команды.</p>
<p>        <span style="display:inline-block; background:#e3eaf2; color:#4a5568; font-size:11px; font-weight:600; padding:3px 10px; border-radius:20px;">Исследование, не эксперимент</span>      </td>
<td style="background:#f8faff; border:1px solid #e5eaf2; border-radius:12px; padding:20px 22px; box-shadow:0 4px 16px rgba(0,0,0,0.04); vertical-align:top;">        </p>
<div style="font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.06em; color:#6b7280; margin-bottom:8px;">METR · 2025</div>
<p>        </p>
<div style="font-size:32px; font-weight:700; color:#0f7b6c; line-height:1.1; margin-bottom:12px;">+19%</div>
<p>        </p>
<p style="font-size:13px; color:#374151; line-height:1.5; margin:0 0 14px; min-height:60px;">Время решения задач с разрешённым ИИ в одном RCT по зрелым open-source проектам.</p>
<p>        <span style="display:inline-block; background:#e3eaf2; color:#4a5568; font-size:11px; font-weight:600; padding:3px 10px; border-radius:20px;">Не переносить на все проекты</span>      </td>
<td style="background:#f8faff; border:1px solid #e5eaf2; border-radius:12px; padding:20px 22px; box-shadow:0 4px 16px rgba(0,0,0,0.04); vertical-align:top;">        </p>
<div style="font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.06em; color:#6b7280; margin-bottom:8px;">Stack Overflow · 2025</div>
<p>        </p>
<div style="font-size:32px; font-weight:700; color:#0f7b6c; line-height:1.1; margin-bottom:12px;">46%</div>
<p>        </p>
<p style="font-size:13px; color:#374151; line-height:1.5; margin:0 0 14px; min-height:60px;">Респондентов не доверяли точности ответов ИИ-инструментов; доверяли 33%.</p>
<p>        <span style="display:inline-block; background:#e3eaf2; color:#4a5568; font-size:11px; font-weight:600; padding:3px 10px; border-radius:20px;">Опрос и самоотчёты</span>      </td>
</tr>
</tbody>
</table>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>И видя все эти данные, можно сформулировать задачу QA в эпоху ИИ так:</span> снизить затраты на обеспечение надежности релиза, но при этом не допустить роста рисков, которые считаются недопустимыми. Количество тестов, строки кода автотестов и процент зеленых прогонов – внутренние показатели. <span class='font-weight-bold'>Бизнесу же важны время до релиза функций, затраты на переделки и последствия пропущенных ошибок.&nbsp;</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#d7f4ffcf"}}} --></p>
<p class="has-background" style="background-color:#d7f4ffcf"><span class='font-weight-bold'>Здесь и приходит на помощь тест-анализ и тест-дизайн, так как </span>главный QA-навык в мире разработки с нейронками – это уже не просто способность протестировать, а умение выбрать осмысленную проверку и определить верный результат.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Как с помощью тест-анализа и тест-дизайна определить оптимальный бюджет на QA?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Самая распространенная управленческая ошибка – рассматривать бюджет на тестирование поверхностно, например: «было восемь тестировщиков, стало пять, значит сэкономили». Это неверно, так как необходимо оценивать полную стоимость обеспечения качества внутри потока поставки изменений.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="max-width:820px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="background:#ffffff; border:1px solid #e5eaf2; border-radius:16px; padding:24px 28px; box-shadow:0 4px 20px rgba(0,0,0,0.06);">
<h3 style="font-size:18px; font-weight:700; color:#1f2937; margin:0 0 16px;">Рабочая модель TCO проверок</h3>
<p>    </p>
<div style="background:#0d1117; border:1px solid #30363d; border-radius:12px; padding:18px 20px; margin-bottom:20px; overflow-x:auto;">      </p>
<pre style="margin:0; padding:0; font-family:'JetBrains Mono','Cascadia Code','Fira Code','Consolas',monospace; font-size:14px; line-height:1.6; color:#7ee787; white-space:pre-wrap; word-break:normal; background:transparent; border:none;"><code style="font-family:inherit; font-size:inherit; color:inherit;">C_total = C_analysis + C_design + C_execution<br>        + C_maintenance + C_infrastructure<br>        + C_delays + E(C_escaped_defects)</code></pre>
<p>    </div>
<p>    </p>
<p style="font-size:14px; line-height:1.7; color:#374151; margin:0;">      Где <code style="background:#f0f2f5; padding:2px 6px; border-radius:4px; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; color:#1f2937;">E(C_escaped_defects)</code> — <em style="font-style:italic;">ожидаемая</em> стоимость дефектов, обнаруженных слишком поздно: вероятность события × последствия с учётом уязвимости контроля. Модель концептуальная; реальная оценка зависит от инцидентных данных и допущений.    </p>
</p></div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>В этой модели <span class='font-weight-bold'>тест-анализ снижает издержки из-за неверных постановок задач и переделок, тест-дизайн ведет к уменьшению стоимости получения нужного тестового сигнала</span>; архитектура CI и регрессии позволяет сэкономить на исполнении, задержках и поддержке. И все это бессмысленно, если экономия увеличивает неприемлемый риск дефектов в проде.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="max-width:1000px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif; display:block;">
<table style="width:100%; border-collapse:separate; border-spacing:16px 0; table-layout:fixed; margin:0 -16px;">
<colgroup>
<col style="width:50%;"></col>
</colgroup>
<colgroup>
<col style="width:50%;"></col>
</colgroup>
<tbody>
<tr>
<td style="background:#fef2f2; border:1px solid #fecaca; border-radius:12px; padding:22px 24px; vertical-align:top;">        </p>
<div style="font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.08em; color:#dc2626; margin-bottom:8px;">Неверная цель</div>
<p>        </p>
<h4 style="font-size:18px; font-weight:700; color:#1f2937; margin:0 0 12px;">Минус 30% тестов</h4>
<p>        </p>
<p style="font-size:14px; line-height:1.6; color:#4b5563; margin:0;">Можно удалить 30% проверок и лишиться единственного теста на повторное списание денег. Формально расход ниже, фактически риск вырос.</p>
<p>      </td>
<td style="background:#f0fdf4; border:1px solid #bbf7d0; border-radius:12px; padding:22px 24px; vertical-align:top;">        </p>
<div style="font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.08em; color:#16a34a; margin-bottom:8px;">Правильная цель</div>
<p>        </p>
<h4 style="font-size:18px; font-weight:700; color:#1f2937; margin:0 0 12px;">Минус 30% затрат на сигнал</h4>
<p>        </p>
<p style="font-size:14px; line-height:1.6; color:#4b5563; margin:0;">Сохранили контроль над важными рисками, перенесли проверки на быстрый уровень, сократили дубли, ускорили обратную связь.</p>
<p>      </td>
</tr>
</tbody>
</table>
</div>
<p><!-- /wp:html --></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:preformatted {"style":{"color":{"background":"#f8ebd5"}}} --></p>
<pre class="wp-block-preformatted has-background" style="background-color:#f8ebd5"><span class='font-weight-bold'>Упрощенная модель приоритета<br></span>Ожидаемая польза теста ≈ вероятность наличия дефекта в рассматриваемом классе × вероятность его обнаружения данным тестом × ущерб от позднего обнаружения − стоимость исполнения и сопровождения.</pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p><em>Контекст влияет на вероятности – их обычно оценивают тест-аналитики. Проверки связаны между собой: нельзя просто сложить их пользу, будто они независимы.&nbsp;</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#d7f4ffcf"}}} --></p>
<p class="has-background" style="background-color:#d7f4ffcf"><span class='font-weight-bold'>Практический вывод: </span>формируя портфель тестов, важно не минимизировать список проверок, а <span class='font-weight-bold'>собрать набор с наибольшим добавочным эффектом в пределах бюджета и обязательных требований</span>. В ряде систем – в частности, в регулируемых доменах – обязательные проверки не подлежат экономической оптимизации: они носят обязательный характер и не рассматриваются как объект для сокращения затрат.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Управляем неопределенностью c помощью тест-аналитики</h2>
<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":31631,"width":"257px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/11/Test-dizayn-1.png" alt="Test-dizayn-1" class="wp-image-31631" style="width:257px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/11/Test-dizayn-1.png 512w, https://quality-lab.ru/wp-content/uploads/2026/11/Test-dizayn-1-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/11/Test-dizayn-1-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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">Не очень хорошо, когда тест-анализ сводят чтению user story и выписыванию проверок. Для сложного продукта, тест-анализ – это работа с неопределенностью: поиск решений, от которых зависят архитектура, объем реализации, тестируемость и операционные риски. </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 {"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 --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:html --></p>
<div style="max-width:1000px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif; display:block;">
<div style="display:flex; align-items:stretch; justify-content:center; gap:8px;">
<p>    </p>
<div style="flex:1 1 0; min-width:0; background:#f8faff; border:1px solid #e5eaf2; border-radius:10px; padding:16px 18px; box-sizing:border-box;">      </p>
<div style="font-size:14px; font-weight:700; color:#1f2937; margin-bottom:8px; white-space:nowrap;">Бизнес-правило</div>
<p>      </p>
<div style="font-size:12px; color:#6b7280; line-height:1.5;">Какое решение подтверждает ценность и где цена ошибки?</div>
<p>    </div>
<p>    </p>
<div style="display:flex; align-items:center; justify-content:center; font-size:20px; color:#9ca3af; flex-shrink:0; width:24px;">→</div>
<p>    </p>
<div style="flex:1 1 0; min-width:0; background:#f8faff; border:1px solid #e5eaf2; border-radius:10px; padding:16px 18px; box-sizing:border-box;">      </p>
<div style="font-size:14px; font-weight:700; color:#1f2937; margin-bottom:8px; white-space:nowrap;">Модель поведения</div>
<p>      </p>
<div style="font-size:12px; color:#6b7280; line-height:1.5;">Состояния, инварианты, допуски, интеграции, запрещённые переходы</div>
<p>    </div>
<p>    </p>
<div style="display:flex; align-items:center; justify-content:center; font-size:20px; color:#9ca3af; flex-shrink:0; width:24px;">→</div>
<p>    </p>
<div style="flex:1 1 0; min-width:0; background:#f8faff; border:1px solid #e5eaf2; border-radius:10px; padding:16px 18px; box-sizing:border-box;">      </p>
<div style="font-size:14px; font-weight:700; color:#1f2937; margin-bottom:8px;">Доказательство</div>
<p>      </p>
<div style="font-size:12px; color:#6b7280; line-height:1.5;">Набор наблюдений, оракул, тестовый уровень и критерий принятия</div>
<p>    </div>
</p></div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p><em>Это не поэтапная каскадная модель. Цикл повторяется при изменении бизнес-правил и архитектуры.</em></p>
<p><!-- /wp:paragraph --></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>
<td><span class='font-weight-bold'>Предотвращен перерасход</span></td>
</tr>
<tr>
<td>Реестр решений</td>
<td>Решение, его владелец, дата, альтернативы, открытые вопросы; особое внимание денежным, правовым и временным правилам</td>
<td>Повторные споры и переделки из-за «мы думали, что…»</td>
</tr>
<tr>
<td>Карта управления рисками</td>
<td>Риск, последствия, события-триггеры, контролирующие проверки, ответственный, остаточный риск</td>
<td>Ложное чувство покрытия и тестирование несущественного</td>
</tr>
<tr>
<td>Модель состояний</td>
<td>Состояния, переходы, инварианты, схемы сообщений, тайм-ауты и гарантии доставки</td>
<td>Пропуск межсервисных и временных дефектов</td>
</tr>
<tr>
<td>Правило верификации</td>
<td>Откуда берётся ожидаемый результат и по каким данным можно его проверить: ledger, event ID, API, телеметрия</td>
<td>Зелёные, но бесполезные тесты, которые не доказывают бизнес-свойства</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph --></p>
<p>В QA нельзя считать, что правило выполнено, если его нет в документах. Любой пробел нужно фиксировать как нерешенный вопрос, назначить ответственного и срок рассмотрения. Особенно это важно, когда в работе участвуют нейросети: они умеют очень убедительно придумывать недостающее, и такие правдоподобные дополнения легко принять за правду.&nbsp;</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":"#f7e3e8"}}} --></p>
<p class="has-background" style="background-color:#f7e3e8">Если после внедрения усиленного тест‑анализа количество обязательных документов у команды выросло вдвое, но на приемке по‑прежнему всплывают спорные вопросы, это значит, что автоматизировали фиксацию неопределенности, а не ее устранение. Формально все оформлено, но проблемные места так и остались нерешенными.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Разберем оплату: 14 тест‑кейсов не помогут, если проверяем не тои инвариант</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Допустим, у SaaS-сервиса есть выставление счетов, подписки, платежный провайдер и асинхронные webhook-события. Фича звучит просто: «поддержать повторную попытку списания после тайм-аута». Код легко сгенерировать, как и получить ошибки, которые могут стоить очень дорого.</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: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>. Проверяем не только UI, но и журнал финансовых операций.</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 {"level":3} --></p>
<h3 class="wp-block-heading">От инварианта к техникам: как выбирать проверки</h3>
<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>
<td><span class='font-weight-bold'>Наблюдение/оракул</span></td>
<td><span class='font-weight-bold'>Почему это дешевле?</span></td>
</tr>
<tr>
<td>Два списания</td>
<td>Тестирование на основе модели: определяем состояния и переходы, чтобы автоматически генерировать тестовые сценарии с повторными попытками, таймаутами и обработкой подтверждений.</td>
<td>Уникальность финансового события в ledger и на стороне платёжного провайдера</td>
<td>Ловим классы ошибок, не перебирая вручную UI-пути</td>
</tr>
<tr>
<td>Неверная цена</td>
<td>Используем таблицу решений в сочетании с анализом граничных значений и проверкой свойств: контролируем инварианты по сумме, валюте и правилам округления.</td>
<td>Независимый расчёт по утверждённому правилу</td>
<td>Большая часть логики проверяется на быстром уровне</td>
</tr>
<tr>
<td>Несовместимые события</td>
<td>Применяем подход контрактов, ориентированных на потребителя. Дополнительно проверяем соответствие версий схемы данных и семантику полей.</td>
<td>Потребитель успешно интерпретирует подтверждённый контракт поставщика</td>
<td>Не нужно поднимать всю систему на каждую комбинацию</td>
</tr>
<tr>
<td>Редкая комбинация тарифов</td>
<td>Используем покрывающий массив с ограничениями: формируем комбинации значений по 2&nbsp;или 3&nbsp;факторам для выбранных параметров.</td>
<td>Покрытие комбинаций и утверждённые бизнес-ожидания</td>
<td>Контролируем комбинаторику вместо полного перебора</td>
</tr>
<tr>
<td>Неожиданное поведение LLM-агента поддержки</td>
<td>Включаем в проверку неблагоприятные сценарии (adversarial cases), тесты на авторизацию инструментов и оценочный набор данных для валидации результатов.</td>
<td>Проверка прав на API, аудита, запрета несогласованных действий</td>
<td>Дорогостоящие сценарии безопасности блокируются до выката</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Что именно запустить в CI?</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>На каждое изменение:</span> быстрые тесты компонентов, расчетов, свойства инвариантов, контракт затронутого сервиса и обязательные проверки критичных переходов.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>По измененному графу зависимостей:</span> релевантные интеграционные тесты.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>По расписанию и перед значимым релизом: </span>расширенные последовательности событий, параллельные транзакции, длительные отказы и E2E-пути.&nbsp;</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":"#d7f4ffcf"}}} --></p>
<p class="has-background" style="background-color:#d7f4ffcf"><span class='font-weight-bold'>Почему это именно тест-дизайн, а не просто усиление автоматизации? </span>Одна модель порождает разные доказательства на разных уровнях. Нельзя копировать один и тот же сценарий 12 раз в UI, API и E2E. Нужно проверять инвариант там, где он наиболее наблюдаем, и оставлять несколько сквозных путей для подтверждения общей интеграции.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Универсальная модель: подходит и для человека, и для генератора&nbsp;</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><em>Пример: контракт тест-анализатора, YAML</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="max-width:820px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="background:#0d1117; border:1px solid #30363d; border-radius:16px; padding:20px 24px 18px; box-shadow:0 4px 20px rgba(0,0,0,0.3); overflow-x:auto;">
<pre id="case-code" style="margin:0; padding:0; font-family:'JetBrains Mono','Cascadia Code','Fira Code','Consolas',monospace; font-size:14px; line-height:1.6; color:#e6edf3; white-space:pre-wrap; word-break:normal; background:transparent; border:none; border-radius:0;"><code style="font-family:inherit; font-size:inherit; color:inherit; background:transparent; border:none; padding:0;"> risk_id: BILL-07<br>business_invariant: "на один платеж приходится не более одного успешного списания" <br>owner: product-owner-биллинга <br>assumptions: []<br>open_questions:<br> - "Когда ключ идемпотентности считается истекшим?"<br>  - "Может ли платежный провайдер прислать статус «успешно» после локального таймаута?" <br>model:<br>  states: [ожидание, успех, ошибка, возврат] <br>  events: [создание, списание, таймаут, повтор, вебхук, возврат] <br>  forbidden: ["возврат -> списание без нового платежного намерения"] <br>controls:<br>  - type: свойство_состояний <br>    oracle: счетчик_успешных_списаний_в_реестре <br>    level: компонентный <br>  - type: контрактный_тест <br>    oracle: схема_сообщений_платежного_провайдера <br>    level: сервисный <br>  - type: тест_конкурентности <br>    oracle: ровно_одно_списание <br>    level: интеграционный <br>acceptance:<br>  - "все обязательные инварианты выполняются" <br>  - "открытых вопросов с высоким риском: 0"</code></pre>
</p></div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#d7f4ffcf"}}} --></p>
<p class="has-background" style="background-color:#d7f4ffcf">Важный нюанс: <em>&#171;на один платеж приходится не более одного успешного списания&#187;</em> – это условное правило для примера. В реальном продукте лимиты частичных списаний, разделенные списания и возвраты требуют отдельного согласования.</p>
<p><!-- /wp:paragraph --></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":31638,"width":"263px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/11/Test-analiz.png" alt="Test-analiz" class="wp-image-31638" style="width:263px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/11/Test-analiz.png 512w, https://quality-lab.ru/wp-content/uploads/2026/11/Test-analiz-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/11/Test-analiz-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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">Технически можно обеспечить 100% выполненных тестов и не закрыть ни одного действительно опасного риска. Поэтому лучше взять за основу матрицу “риск - независимые способы обнаружения”. Она помогает находить дыры и необоснованное дублирование.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:html --></p>
<figure style="max-width:1100px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">    </p>
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<p></p>
<table style="width:100%; min-width:850px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<thead>
<tr>
<th style="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; width:22%;">Риск / уровень проверки</th>
<th style="background:#f8faff; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.06em; color:#6b7280; padding:12px 14px; text-align:center; border-bottom:2px solid #e5eaf2; width:15.6%;">Модульные тесты и свойства</th>
<th style="background:#f8faff; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.06em; color:#6b7280; padding:12px 14px; text-align:center; border-bottom:2px solid #e5eaf2; width:15.6%;">Контрактные</th>
<th style="background:#f8faff; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.06em; color:#6b7280; padding:12px 14px; text-align:center; border-bottom:2px solid #e5eaf2; width:15.6%;">Интеграционные</th>
<th style="background:#f8faff; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.06em; color:#6b7280; padding:12px 14px; text-align:center; border-bottom:2px solid #e5eaf2; width:15.6%;">Сквозные</th>
<th style="background:#f8faff; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.06em; color:#6b7280; padding:12px 14px; text-align:center; border-bottom:2px solid #e5eaf2; width:15.6%;">Контроль в эксплуатации</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:600;">Двойной захват средств</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#16a34a; font-size:20px;">●</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#d97706; font-size:20px;">◐</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#16a34a; font-size:20px;">●</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#d97706; font-size:20px;">◐</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#16a34a; font-size:20px;">●</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:600;">Дрейф схемы вебхука</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#9ca3af; font-size:20px;">○</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#16a34a; font-size:20px;">●</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#d97706; font-size:20px;">◐</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#9ca3af; font-size:20px;">○</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#d97706; font-size:20px;">◐</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:600;">Неверное округление</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#16a34a; font-size:20px;">●</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#9ca3af; font-size:20px;">○</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#d97706; font-size:20px;">◐</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#d97706; font-size:20px;">◐</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#d97706; font-size:20px;">◐</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:600;">Неупорядоченные события</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#16a34a; font-size:20px;">●</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#d97706; font-size:20px;">◐</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#16a34a; font-size:20px;">●</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#9ca3af; font-size:20px;">○</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; text-align:center; vertical-align:middle; color:#16a34a; font-size:20px;">●</td>
</tr>
<tr>
<td style="padding:14px; color:#1f2937; vertical-align:top; font-weight:600;">Потеря пользовательского пути</td>
<td style="padding:14px; text-align:center; vertical-align:middle; color:#d97706; font-size:20px;">◐</td>
<td style="padding:14px; text-align:center; vertical-align:middle; color:#d97706; font-size:20px;">◐</td>
<td style="padding:14px; text-align:center; vertical-align:middle; color:#d97706; font-size:20px;">◐</td>
<td style="padding:14px; text-align:center; vertical-align:middle; color:#16a34a; font-size:20px;">●</td>
<td style="padding:14px; text-align:center; vertical-align:middle; color:#d97706; font-size:20px;">◐</td>
</tr>
</tbody>
</table>
<p>    </div>
<p>  </div>
</figure>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#d7f4ffcf"}}} --></p>
<p class="has-background" style="background-color:#d7f4ffcf">На практике для каждой контрольной проверки важно фиксировать: владельца, способ получения оракула, скорость обратной связи, стоимость выполнения, частоту изменений и инциденты, которые эта проверка реально помогла выявить.</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: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>широкая периодическая регрессия – страховка от ошибок в модели зависимостей.</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>В 2018 году компания Meta<sup data-fn="9398294c-239b-48fb-ab9d-e74f829e459e" class="fn"><a href="https://quality-lab.ru#9398294c-239b-48fb-ab9d-e74f829e459e" id="9398294c-239b-48fb-ab9d-e74f829e459e-link">4</a></sup> представила систему отбора тестов, которая прогнозирует риски. При запуске примерно трети тестов, связанных через зависимости, система выявляла более 99,9 % регрессий еще до того, как изменения попадали в основную ветку кода. Это показатель для конкретной инфраструктуры – она обучалась на прошлых данных. Такую метрику нельзя автоматически переносить на новый проект.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="max-width:800px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif; display:block;">
<div style="display:flex; flex-direction:column; gap:16px;">
<p>    <!-- Строка 1 --></p>
<div style="display:flex; align-items:center; gap:16px;">
<div style="width:32%; min-width:140px; font-size:14px; font-weight:700; color:#1f2937;">Транзитивный набор</div>
<p>      <!-- Полоска 1 (100%) --></p>
<div style="flex:1; height:12px; border-radius:6px; background-image:linear-gradient(to right, #2b3a18, #2b3a18); background-size:100% 100%; background-repeat:no-repeat; background-color:#f0f2f5;"></div>
<div style="width:50px; text-align:right; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; font-weight:600; color:#2b3a18;">100%</div>
</p></div>
<p>    <!-- Строка 2 --></p>
<div style="display:flex; align-items:center; gap:16px;">
<div style="width:32%; min-width:140px; font-size:14px; font-weight:700; color:#1f2937;">Выбранный набор</div>
<p>      <!-- Полоска 2 (33.33%) --></p>
<div style="flex:1; height:12px; border-radius:6px; background-image:linear-gradient(to right, #0f7b6c, #0f7b6c); background-size:33.33% 100%; background-repeat:no-repeat; background-color:#f0f2f5;"></div>
<div style="width:50px; text-align:right; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; font-weight:600; color:#0f7b6c;">≈33%</div>
</p></div>
</p></div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p><em>Доли исполняемых тестов по описанию Meta, 2018. Не эквивалентны доле покрытия или риску конкретного другого продукта.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Google, 2026</span>.<sup data-fn="2806b174-e133-4c60-812b-b2194351151c" class="fn"><a href="https://quality-lab.ru#2806b174-e133-4c60-812b-b2194351151c" id="2806b174-e133-4c60-812b-b2194351151c-link">5</a></sup> Исследование стратегий отбора тестов для десяти ключевых библиотек показало: при бюджете примерно в 0,9% от полной стоимости прогона тестов удавалось выявлять регрессии в 40% коммитов, где они действительно присутствовали. Это отражает компромисс между стоимостью раннего обнаружения ошибок и полнотой проверки. Остальные регрессии при таком подходе не исчезают – их выявляют на следующих этапах контроля качества.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#d7f4ffcf"}}} --></p>
<p class="has-background" style="background-color:#d7f4ffcf">ML не решает проблему сам по себе. Нельзя просто оставить 1% тестов. Нужна стратегия: понятная цена риска (ложных отрицаний), контрольные прогоны, обязательная защита ключевых проверок.&nbsp;</p>
<p><!-- /wp:paragraph --></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">Модельные тесты вместо ручного перебора последовательностей</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>: модель стоит дороже одного ручного тест-кейса, зато при частых изменениях она избавляет от ручной поддержки длинных списков последовательностей.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Границы применимости: </span>если состояние скрыто от наблюдения или модель систематически не учитывает реальные события, автогенерация только создаст ложную уверенность в покрытии.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Комбинаторное тестирование с переменной глубиной, а не pairwise<span class='font-weight-bold'> </span>на все</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Не стоит проверять всю систему с одинаковым уровнем покрытия взаимодействий. Для проверки совместимости конфигураций часто хватает парных сочетаний (по два параметра), а для комбинаций вида «тариф + валюта + региональные правила» бывает оправдан тройной уровень или усиленное покрытие отдельных зон. Обязательная часть – ограничения: явные списки допустимых и запрещенных комбинаций.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Для примера соберем простой набор без ограничений: пять факторов, число значений которых дает 3 × 3 × 2 × 3 × 2 = 108 комбинаций. Жадный алгоритм построения покрытия (это не математически минимальное решение) дал следующий набор проверенных сочетаний:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="max-width:800px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif; display:block;">
<div style="background:#ffffff; border:1px solid #e5eaf2; border-radius:16px; padding:24px 28px; box-shadow:0 4px 20px rgba(0,0,0,0.06);">
<h3 style="font-size:18px; font-weight:700; color:#1f2937; margin:0 0 8px;">Комбинаторика: размер тестового набора</h3>
<p style="font-size:14px; color:#6b7280; line-height:1.5; margin:0 0 24px;">Конкретная модель из 108 допустимых комбинаций, алгоритмически построенные покрытия.</p>
<p>    <!-- Строка 1 --></p>
<div style="display:flex; align-items:center; margin-bottom:16px;">
<div style="width:140px; font-size:14px; font-weight:700; color:#1f2937; flex-shrink:0;">Полный перебор</div>
<div style="flex:1; height:12px; border-radius:6px; background:linear-gradient(to right, #2b3a18 0%, #2b3a18 100%, #f0f2f5 100%); margin:0 16px;"></div>
<div style="width:40px; text-align:right; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; font-weight:600; color:#2b3a18; flex-shrink:0;">108</div>
</p></div>
<p>    <!-- Строка 2 --></p>
<div style="display:flex; align-items:center; margin-bottom:16px;">
<div style="width:140px; font-size:14px; font-weight:700; color:#1f2937; flex-shrink:0;">3-way</div>
<div style="flex:1; height:12px; border-radius:6px; background:linear-gradient(to right, #d97706 0%, #d97706 25.93%, #f0f2f5 25.93%); margin:0 16px;"></div>
<div style="width:40px; text-align:right; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; font-weight:600; color:#d97706; flex-shrink:0;">28</div>
</p></div>
<p>    <!-- Строка 3 --></p>
<div style="display:flex; align-items:center; margin-bottom:24px;">
<div style="width:140px; font-size:14px; font-weight:700; color:#1f2937; flex-shrink:0;">2-way</div>
<div style="flex:1; height:12px; border-radius:6px; background:linear-gradient(to right, #0f7b6c 0%, #0f7b6c 11.11%, #f0f2f5 11.11%); margin:0 16px;"></div>
<div style="width:40px; text-align:right; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; font-weight:600; color:#0f7b6c; flex-shrink:0;">12</div>
</p></div>
<p>    <!-- Подпись --></p>
<div style="font-size:13px; color:#6b7280; line-height:1.6; padding-top:16px; border-top:1px solid #e5eaf2;">
      Проверено полное покрытие: 67 пар значений для 2‑факторного анализа и 171 тройка – для 3‑факторного. Результаты применимы только к указанной модели и жадному алгоритму. При выборе стратегии учитывают ограничения системы, стоимость верификации и риски, связанные с более сложными взаимодействиями параметров.
    </div>
</p></div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>По данным исследований NIST<sup data-fn="1db557fe-8154-49dc-8820-c16557e79506" class="fn"><a href="https://quality-lab.ru#1db557fe-8154-49dc-8820-c16557e79506" id="1db557fe-8154-49dc-8820-c16557e79506-link">6</a></sup>, комбинаторное покрытие – эффективный способ заметно сократить количество проверок, при этом сохранив контроль над ключевыми взаимодействиями параметров. В работе 2024 года приведены примеры, когда объем тестового набора удавалось уменьшить в 20–700 раз. Важно понимать, что такой эффект достигается не всегда: это не универсальное решение и не гарантия качества для любого проекта.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Контракты по ожиданиям потребителя вместо тяжелой инт]]></description>
<link>https://quality-lab.ru/blog/perestraivaem-test%E2%80%91analiz-i-test%E2%80%91dizajn-rabota-s-riskami-i-skorostyu-relizov-v-epoxu-ii/</link>
<pubDate>Thu, 12 Nov 2026 16:22:41 +0300</pubDate>
</item>
<item>
<title>Дебажь по-взрослому: 10 лайфхаков по дебагу для разработчиков, инженеров по качеству и тестировщиков</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/mutation-testing.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/mutation-testing.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Ханиша Арора (Hanisha Arora)<br /><strong><a href="https://www.ministryoftesting.com/insights/debug-like-a-boss-10-debugging-hacks-for-developers-quality-engineers-and-testers" mce_href="https://www.ministryoftesting.com/insights/debug-like-a-boss-10-debugging-hacks-for-developers-quality-engineers-and-testers" target="_blank" style="">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><p>Баги появляются, съедают всё ваше время и заставляют вас сомневаться в себе, убеждая, что проблема в вас. Это не так.</p>
<p>Вы уже решили эту проблему несколько коммитов назад, а теперь снова наступил сезон сбора урожая.</p>
<p>Вот несколько приёмов отладки, которые помогали мне в такие моменты:</p>]]></description>
<link>https://www.software-testing.ru/library/testing/testing-automation/4543-10-debugging-hacks</link>
<pubDate>Tue, 10 Nov 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>ИИ-агенты в тестировании, новый курс от Ольги Назиной</title>
<description><![CDATA[<p style="color: #111111; font-family: Arial, sans-serif; font-size: 14px;" mce_style="color: #111111; font-family: Arial, sans-serif; font-size: 14px;">Все вокруг говорят про ИИ в тестировании. Но чаще это сводится к простому: «спроси у чата, как написать регулярку или тест-кейс». Это полезно, но это только верхушка айсберга.</p>
<p style="color: #111111; font-family: Arial, sans-serif; font-size: 14px;" mce_style="color: #111111; font-family: Arial, sans-serif; font-size: 14px;">Настоящая магия начинается, когда на сцену выходят ИИ-агенты — инструменты, которые не просто отвечают на вопросы, а сами выполняют работу: пишут код, анализируют логи и взаимодействуют с тестируемым приложением.</p>
<p style="color: #111111; font-family: Arial, sans-serif; font-size: 14px;" mce_style="color: #111111; font-family: Arial, sans-serif; font-size: 14px;">Впрочем, агент полезен и в ручном тестировании. Он поможет разобраться, как работает функционал, напишет SQL-запрос для проверки данных, составит REST/SOAP-запрос или даст пошаговую инструкцию для воспроизведения бага.</p>
<p style="color: #111111; font-family: Arial, sans-serif; font-size: 14px;" mce_style="color: #111111; font-family: Arial, sans-serif; font-size: 14px;">Этому всему мы будем учиться на новом курсе Ольги Назиной «<a href="https://software-testing.ru/edu/3-online/354-ii" mce_href="https://software-testing.ru/edu/3-online/354-ii">ИИ-агенты в тестировании</a>». Он подойдет тем, кто еще не работал с агентами, но очень хочет начать.</p>
<p style="color: #111111; font-family: Arial, sans-serif; font-size: 14px;" mce_style="color: #111111; font-family: Arial, sans-serif; font-size: 14px;">Старт курса: 24 ноября.</p>
<p style="color: #111111; font-family: Arial, sans-serif; font-size: 14px;" mce_style="color: #111111; font-family: Arial, sans-serif; font-size: 14px;">Подробная программа и условия участия по ссылке: <a href="https://software-testing.ru/edu/3-online/354-ii" mce_href="https://software-testing.ru/edu/3-online/354-ii">https://software-testing.ru/edu/3-online/354-ii</a></p>]]></description>
<link>https://www.software-testing.ru/events/4571-ai</link>
<pubDate>Sun, 08 Nov 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Как подготовить интернет-магазин к распродаже: тестирование и план действий</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p>Наступил горячий сезон распродаж, который традиционно длится с ноября по март, захватывая ноябрьские акции, а затем новогодние и гендерные праздники. Все 5 месяцев, когда на улице плохая погода, снег и хтонь, миллионы потенциальных покупателей ищет в интернете подарки и добирают быстрый дофамин с помощью приятных покупок. Это самая сладкая часть года для всех онлайн-ритейлеров.</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:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":31588,"width":"346px","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="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/11/Image-9.png" alt="Image-9" class="wp-image-31588" style="width:346px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/11/Image-9.png 512w, https://quality-lab.ru/wp-content/uploads/2026/11/Image-9-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/11/Image-9-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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 --></p>
<h2 class="wp-block-heading">Сезон распродаж 2026</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Самое важное, что в 2026 году ритейлеры <a href="https://smart-lab.ru/blog/news/1371315.php" data-type="link" data-id="https://smart-lab.ru/blog/news/1371315.php" rel="nofollow">сознательно</a> уходят от точечных коротких акций и по максимуму растягивают скидки. Ozon, к примеру, объединил 11.11 и «Черную пятницу» в шестинедельную кампанию, Wildberries стартует 13 ноября на целых 18 дней.  Дальше Новый год, 14 и 23 февраля, 8 Марта. Тенденция к увеличению продолжительности акций прослеживается на фоне слабого потребительского спроса. Покупатели все более осторожно тратят деньги, подавляя в себе порывы к эмоциональному потреблению. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>11 ноября 2024 года оборот интернет-магазинов <a href="https://www.retail.ru/news/oboroty-rossiyskikh-internet-magazinov-v-period-noyabrskikh-rasprodazh-mogut-vyr-6-noyabrya-2026-284104/" data-type="link" data-id="https://www.retail.ru/news/oboroty-rossiyskikh-internet-magazinov-v-period-noyabrskikh-rasprodazh-mogut-vyr-6-noyabrya-2026-284104/" rel="nofollow">вырос</a> на 32% год к году, число оплат на 45%. В 2025-м прирост составил 12% и 7%. Для ноября 2026 года сервис прогнозирует рост на 15–20%. Участвовать в распродажах планируют 51% работающих россиян, из них 21% уже <a href="https://www.retail.ru/news/zhiteli-rossii-gotovy-potratit-na-noyabrskikh-rasprodazhakh-do-20-zarplaty-4-noyabrya-2026-284048/" data-type="link" data-id="https://www.retail.ru/news/zhiteli-rossii-gotovy-potratit-na-noyabrskikh-rasprodazhakh-do-20-zarplaty-4-noyabrya-2026-284048/" rel="nofollow">выбрали</a> покупки. Каждый пятый (21%) заранее кладет товар в корзину и <a href="https://www.retail.ru/news/podarki-k-novomu-godu-voshli-v-troyku-glavnykh-pokupok-na-osennikh-rasprodazhakh-29-oktyabrya-2026-283845/" data-type="link" data-id="https://www.retail.ru/news/podarki-k-novomu-godu-voshli-v-troyku-glavnykh-pokupok-na-osennikh-rasprodazhakh-29-oktyabrya-2026-283845/" rel="nofollow">ждет</a> скидки. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#d7f4ffcf"}}} --></p>
<p class="has-background" style="background-color:#d7f4ffcf"><span class='font-weight-bold'>Что это значит для интернет-магазина? </span>В день акции приходит человек с уже готовым решением, при этом уже сравнил цены, в том числе и с помощью ИИ. И вот человек начинает оформлять заказ, но если оплата зависла или промокод обнулился, а может и вовсе сбой &#8212; то вы теряете клиента, который шел именно к вам с конкретными деньгами и потребностями. Вы теряете не только деньги, которые потратили на подготовку к акции и рекламный бюджет, но и репутацию. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Независимых интернет-магазинов всё больше</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Есть и второй фактор, особенно заметный в 2026 году. Продавцы уходят с маркетплейсов в свои магазины: по прогнозу INFOLine, оборот независимого e-commerce в 2026 году <a href="https://www.retail.ru/news/prodazhi-nezavisimogo-e-commerce-v-rossii-mogut-vyrasti-na-25-8-v-2026-godu-1-oktyabrya-2026-282796/" rel="nofollow">достигнет</a> 5,75 трлн ₽ (+25,8%). За год <a href="https://www.forbes.ru/tekhnologii/566368-svoa-rubaska-blize-k-telu-spros-na-zapusk-sobstvennyh-onlajn-magazinov-rastet-na-50" data-type="link" data-id="https://www.forbes.ru/tekhnologii/566368-svoa-rubaska-blize-k-telu-spros-na-zapusk-sobstvennyh-onlajn-magazinov-rastet-na-50" rel="nofollow">зарегистрировали</a> 9775 новых e-commerce-доменов, на 12% больше.</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":31600,"width":"327px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/11/podgotovka-k-rasprodazhe.png" alt="podgotovka-k-rasprodazhe" class="wp-image-31600" style="width:327px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/11/podgotovka-k-rasprodazhe.png 512w, https://quality-lab.ru/wp-content/uploads/2026/11/podgotovka-k-rasprodazhe-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/11/podgotovka-k-rasprodazhe-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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-услугах на ранних этапах многие даже не задумываются, отодвигая вопрос качества площадки на второй план. Но вот здесь кроется огромный риск, особенно учитывая, что сейчас происходит с рунетом. </pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>К примеру, буквально 2 ноября 2026 года <a href="https://finance.mail.ru/article/sboj-beget-zatronul-tysyachi-sajtov-chto-grozit-biznesu-69235436/" rel="nofollow">сбой хостинг-провайдера Beget</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>Потери редко происходят из-за рекламы или ассортимента (хотя это база и тоже очень важно). Чаще всего утечки в воронке происходят по техническим причинам, особенно когда все силы и деньги бросили на открытие своего интернет-магазина (чтобы защититься от всем известных логистических рисков), но никто не проверил систему под нагрузкой и на разных устройствах.</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>Платеж зависает, промокод обнуляется, кнопка «Оформить» активна при невалидных данных</td>
<td>Прямая потеря выручки, брошенные заказы</td>
</tr>
<tr>
<td>Мобильная версия</td>
<td>Виджет чата закрывает кнопку «Войти», футер перекрывает элементы каталога и т.д.</td>
<td>Падение мобильной конверсии</td>
</tr>
<tr>
<td>Цены и остатки</td>
<td>Разные цены на площадках, продажа товара, которого нет на складе</td>
<td>Отмены заказов, жалобы, репутационные риски</td>
</tr>
<tr>
<td>Поиск и фильтры</td>
<td>Поиск по артикулу дублирует товары, фильтр цены сбрасывается</td>
<td>Покупатель уходит к конкурентам</td>
</tr>
<tr>
<td>Интеграции</td>
<td>Сбои в платежах, доставке, проблемы с логистикой из-за проблем с API</td>
<td>Оплаченный заказ не доходит до склада</td>
</tr>
<tr>
<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>когда делали аудит магазина автозапчастей, нашли 67 дефектов, 9 из которых оказались критическими. Они блокировали ключевые сценарии, в том числе поиск и оформление заказа (<a href="https://quality-lab.ru/blog/issledovatelskoe-testirovanie-i-uxaudit-dlya-internet-magazina/">разбор кейса</a>). В итоге заказчик увидел свой сайт глазами клиента, был неприятно удивлен, но выразил нам благодарность.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#d7f4ffcf"}}} --></p>
<p class="has-background" style="background-color:#d7f4ffcf"><span class='font-weight-bold'>Вывод простой:</span> веб-аналитика покажет, что конверсия просела, маркетолог это подтвердит расширенными данными. Но только тестировщики проверят и подсветят технические проблемы. Баг это, неудобный интерфейс, сезонный спад или случайные обстоятельства? Хватит гадать на кофейной гуще, просто обратитесь к <a href="https://quality-lab.ru/outsourcing/" data-type="page" data-id="26">QA-команде</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><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>Покажет, сколько заказов и пользователей выдержит магазин, и в какой момент система начнет сыпаться (и, что самое важное, как она это будет делать). </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"></ol>
<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>как быстро загружаются страницы и обрабатываются запросы;</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 --></ul>
<p><!-- /wp:list --></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><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>добавлению и удалению товаров из корзины;</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 --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Например, покупатель применяет промокод на скидку 20%, добавляет еще один акционный товар и меняет способ доставки. Итоговая сумма должна пересчитываться правильно. Причем во всех возможных комбинациях условий акции.</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>Эти тесты нужны, потому что маркетолог смотрит сайт на новом iPhone, а покупатель открывает его на пятилетнем Android. </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>Ловит сбои на стыке с оплатой, доставкой, складом и CRM. Нужно проверить, что информация передается корректно, а ошибки одного компонента не приводят к нарушению всего бизнес-процесса.</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: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> защищает от утечек и штрафов по федеральным законам и другим регуляторным требованиям.&nbsp;</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":"#d7f4ffcf"}}} --></p>
<p class="has-background" style="background-color:#d7f4ffcf">Если времени совсем мало, то начинайте с нагрузки и чекаута: здесь, как показывает практика, прячется больше всего проблем.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Кейс: сделали нагрузочное тестирование, которое сэкономило заказчику 28 млн ₽</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Крупный федеральный ритейлер бытовой техники запускал новую e-commerce-платформу. Мы <a href="https://quality-lab.ru/black-friday-nagruzochnoe-testirovanie/" data-type="page" data-id="28307">сымитировали поведение 50 000 одновременных пользователей</a>, оформляющих заказы, и быстро нашли критические узкие места: неэффективные запросы к базе данных (классическая проблема «N+1») и неверно настроенное кэширование. Система падала уже при 10% от ожидаемой нагрузки.</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>Стоимость нагрузочного тестирования</td>
<td>1,8 млн ₽</td>
</tr>
<tr>
<td>Потенциальные убытки от простоя</td>
<td>> 30 млн ₽</td>
</tr>
<tr>
<td>Чистая экономия</td>
<td>> 28 млн ₽</td>
</tr>
<tr>
<td>Рентабельность инвестиций (ROI)</td>
<td>> 1000%</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#d7f4ffcf"}}} --></p>
<p class="has-background" style="background-color:#d7f4ffcf">Если бы платформа отказала во время распродажи, компания потеряла бы не только заказы, но и доверие покупателей. Вместо этого бизнес получил возможность устранить проблемы до того, как они повлияли на продажи.</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":31598,"width":"331px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/11/nastroit-sayt-dlya-uvelicheniya-prodazh.png" alt="nastroit-sayt-dlya-uvelicheniya-prodazh" class="wp-image-31598" style="width:331px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/11/nastroit-sayt-dlya-uvelicheniya-prodazh.png 512w, https://quality-lab.ru/wp-content/uploads/2026/11/nastroit-sayt-dlya-uvelicheniya-prodazh-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/11/nastroit-sayt-dlya-uvelicheniya-prodazh-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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>Здесь предлагается алгоритм действий для тех, у кого еще есть время. Но если понимаете, что не успеете все проверить самостоятельно &#8212; пишите нам. Усилим вашу команду, сделаем необходимые тесты в сжатые сроки. В нашей практике есть и ночные смены, и тестирование на проектах без требований. Все обсуждаемо.</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>Сайт</td>
<td>Нагрузочное тестирование (в идеале за месяц до старта распродаж), чтобы успеть внести нужные изменения для усиления отказоустойчивости.</td>
</tr>
<tr>
<td>Цены</td>
<td>Исключить ручной ввод цен на разных площадках. В ERP задать минимальную цену, ниже которой скидка не опустится ни при каких условиях.</td>
</tr>
<tr>
<td>Остатки</td>
<td>Единая система учета с моментальным резервированием товара в корзине.</td>
</tr>
<tr>
<td>Чекаут</td>
<td>Проверить все способы оплаты, промокоды, сценарии с ошибкой банка и повторным заказом из истории. Протестировать интеграции.</td>
</tr>
<tr>
<td>Мобильная версия</td>
<td>Пройти воронку на реальных устройствах, разных экранах и в разных ориентациях.</td>
</tr>
<tr>
<td>Юридическая защита</td>
<td>Провести комплаенс-тестирование, прописать в оферте пункт о технической ошибке. В суде отмену заказа защитить сложно, поэтому надежнее блокировать корзину при аномальной скидке.</td>
</tr>
<tr>
<td>Мониторинг</td>
<td>Алерты на доступность, скорость страниц и ошибки оплаты на время акции.</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph --></p>
<p>Не стоит откладывать все проверки на последнюю неделю. Если нагрузочное тестирование выявит проблемы с архитектурой или базой данных, разработчикам потребуется время на исправления и повторные испытания.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e3f2e9"}}} --></p>
<p class="has-background" style="background-color:#e3f2e9">А если вы хотите самостоятельно проверить готовность площадки к большой распродаже, скачайте бесплатный гид по подготовке интернет-магазина (14 страниц). В нем собрали практические рекомендации по тестированию, инфраструктуре и пользовательскому опыту. Документ можно передать технической команде и использовать как рабочий чек-лист.</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: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><span class='font-weight-bold'>За 4–6 недель: аудит и планирование</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>Проведите первичную оценку технического состояния интернет-магазина.</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'>За 2–4 недели: тестирование и исправление ошибок</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>Проверьте мобильную версию.</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'>За 1–2 недели: контрольная проверка</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>Убедитесь, что мониторинг работает и команда знает порядок действий при инцидентах.</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>Контролируйте ошибки оформления и оплаты заказов.</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:heading --></p>
<h2 class="wp-block-heading">Что делать дальше?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Собственный <a href="https://quality-lab.ru/black-friday-software-testing/" data-type="page" data-id="28548">интернет-магазин</a> – это инвестиция в независимый канал продаж. Но его запуск и развитие требуют не только маркетингового бюджета и работы над ассортиментом. Техническая устойчивость напрямую влияет на то, сколько заказов вы сможете обработать и какую выручку получите в итоге.</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: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><a href="https://quality-lab.ru/blog/5-smertnykh-grekhov-podgotovki-k-black-friday/">5 смертных грехов подготовки к Black Friday</a></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><a href="https://quality-lab.ru/blog/kak-bagi-snizhayut-prodazhi-v-riteile-2026/">Как баги снижают продажи в ритейле</a></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><a href="https://quality-lab.ru/blog/11-instrumentariy-dlya-avtomaticheskoy-proverki-i-monitoringa-sayta-pered-black-friday/">Инструменты автоматической проверки и мониторинга сайта перед распродажей</a></li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>]]></description>
<link>https://quality-lab.ru/blog/kak-podgotovit-internet-magazin-k-rasprodazhe-testirovanie-i-plan-dejstvij/</link>
<pubDate>Fri, 06 Nov 2026 17:57:11 +0300</pubDate>
</item>
<item>
<title>Регресс без регресса: стратегия автотестов</title>
<description><![CDATA[<p><img src="https://software-testing.ru/images/stories/library/11hs/e2e.png" mce_src="https://software-testing.ru/images/stories/library/11hs/e2e.png" width="400" mce_style="float: left;" style="float: left;" />Автор — Гайнутдинов Роман, senior QA automation, Компания «БКС».
<br /><a href="https://habr.com/ru/companies/bcs_company/articles/1021368/" mce_href="https://habr.com/ru/companies/bcs_company/articles/1021368/" style="">Оригинальная публикация</a></p><p>
<em>Самый дорогой регрессионный набор не тот, который долго выполняется, а тот, которому команда перестала верить. Когда команда внедряет автоматизацию, она быстро приходит к соблазнительной идее: если автотесты ускоряют проверки и исключают человеческий фактор, значит автоматизировать нужно всё, до чего можно дотянуться. Но здесь и начинается ошибка. Автоматизировать всё, что можно, и автоматизировать то, что действительно нужно, не одно и то же.</em></p><p>Меня зовут Гайнутдинов Роман, я старший инженер по автоматизированному тестированию в компании «БКС Мир инвестиций». За плечами построение автоматизации с нуля, поддержка готовых решений и оптимизация уже раздутых регрессионных наборов. </p><p>В этой статье разберём логику приоритизации: что автоматизировать в первую очередь, что не стоит тащить в обязательный регресс совсем, и как выбрать уровень проверки. Если вам ближе автоматизация с расчётом на пользу и стоимость, а не всё подряд, сначала стоит разобраться, почему автоматизация без стратегии почти неизбежно превращается в набор дорогостоящих и малополезных проверок. Этот материал будет полезен тестировщикам, разработчикам, менеджерам и всем, кто связан или только знакомится с автоматизацией тестирования.</p>]]></description>
<link>https://www.software-testing.ru/library/testing/testing-automation/4569-regression-without-regression</link>
<pubDate>Wed, 04 Nov 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Однажды дядя честно справил</title>
<description><![CDATA[<p>А один дядя решил, что теперь-то у него развязаны <del>муки</del> руки творчества, и он напишет программу, которая должна помогать людям экономить время. Не сам, конечно, а глядя в консоль с AI, но кому какое дело.</p>
<p>И вот он таки «написал» эту программу, а потом ВНЕЗАПНО понял, что ничего не изменилось. Программа сама по себе ничего не значит. Её нужно превратить в полноценный продукт, а там установка, интерфейс, обновления, тестирование, поддержка, распространение, инструкции, продажи, для чего нужны реклама, маркетинг, материалы, а он реально подзастрял на багфиксинге.</p>
<p style="padding-left: 40px;">AI очень хорошо в этом помогает…</p>
<p>А ещё ему хотелось написать книгу про всякое важное. И музыку. И фильм. И оплачивать коммуналку. Всё это мог бы делать за него AI, но до зарабатывания дядя никак не мог дойти. Надо же довести продукт до ума? Надо. Надо заняться продвижением? Надо. Надо искать покупателей? Надо. И багфиксы тоже надо забагфиксить.</p>
<p>Дядя творчески воображал, что AI будет за него делать всё, освобождая время для, эээ, творчества. Оказывается, надо сперва уметь что-то делать, чтобы суметь это делегировать кому-то и, раздавая ценные указания, довести проект до успеха. И надо найти правильных исполнителей.</p>
<p>В телевизоре нам обещают, что вот же AI, берите и делайте всё, что завгодно, просто подождите пятак минут и получите работающий софт, программисты могут умереть, продавцы могут умереть, мёртвые могут умереть заново, нам больше <a href="https://testitquickly.com/2026/11/03/trebuiala/">никто не будет нужен</a>. Он умеет делать сразу всё, да.</p>
<p>Но знаете, в том Agile никто не говорил, что будут нужны тестировщики — их туда не придумывали. И когда обещали, что в конце каждого спринта у вас будет работающий софт, никто же не уточнял, что это будет ПРАВИЛЬНО работающий софт, лишённый багов.</p>
<p>А, но если найдётся баг, то мы его быстро пофиксим. А если десять? А если сто?</p>
<p>А, но если вы захотите всё переделать, то мы просто всё переделаем. А за чей счёт? А сколько это будет стоить вообще? А сколько времени на это понадобится?</p>
<p>Постоянно продолжается уйма дел, которые надо делать или самому, или делегировать. Что вы можете это делегировать AI? Вы можете делегировать ему <em>любую</em> задачу и пойти заниматься другой задачей, или вы может делегировать ему <em>условную</em> задачу, сесть рядом и постоянно указывать, как её надо делать и что надо переделать? Насколько это является «делегированием»?</p>
<p>Ну и пришёл той дядя пришёл к очень неочевидной мысли — теперь ему нужны люди, которые будут выполнять все задачи, которые появились в контексте его проекта — рекламировать, продавать, обслуживать… Мёртвые <del>матросы не спят</del> программисты только-только уложились по гробам, а их уже зовут на помощь, за мелкий прайс, конечно, вы же видите, что у меня нет денег, потому что ещё нет продаж, потому что я застрял в багфиксинге, и вообще у нас кризис…</p>
<p>Не каждый программист захочет вернуться в мир живых за мелкий прайсик. Некоторые ещё мыкаются с лицом зомби, который помнит прекрасные времена своей дикой востребованности, которые так ВНЕЗАПНО миновали, но то некоторые, а которые-то уже начинают согласно махать киньцывками, потому что даже мёртвым голодно и холодно жить.</p>
<p style="padding-left: 40px;">Йоеснь, йопт…</p>
<p>На этом мы того дядю оставим (в окружении голодных зомбаков, которые помнят как назвать класс в Java) и подумаем о том, что эту проблему уже решали специально обученные люди — бизнесмены же.</p>
<p>Бизнесмен умеет договариваться. Иногда с добрым пистолетом, иногда словом, иногда несолоно хлебавши, но умеет. И поэтому умеет делегировать задачи. То есть, бизнесмен может сказать «Я делаю софт, пишу книгу и снимаю фильм», не уточняя, что он не делает, а финансирует. Делают всё отдельно нанятые люди, но в целом результат представляет заказывающий, так что да, софт и книгу и фильм в итоге «делает» делегирующий бизнесмен. А ещё эти процессы запускаются им в параллель, поэтому книги и фильмы и софт у него появляются часто и условно быстро.</p>
<p>А в чем тогда разница между бизнесменом и дядей с AI в кармане? Огромная. Бизнесмен делегирует задачу человеку и не вынужден стоять рядом с ним на раздаче постоянных указаний о том, как всё надо переделать. А дядя вынужден сидеть с AI и заниматься только той задачей, которую должен делать AI. Это не делегирование. Это вас так зомбируют, чтобы вы сами выдернули из ноута всю оперативку и отнесли её тому, кому она нужнее…</p>
<p>А в чем тогда разница между бизнесменом и бизнесменом с AI в кармане? А такая же, как между бизнесменом и упомянутым дядей — мечты о дешёвом делегировании разбиваются о жестокий быт людей, которые веруют в неверное.</p>
<p>А ещё, когда упоминают про делегирование, то припоминают уже мертвого, как будущего программиста, бывшего президента США Эйзенхауэра с его матрицей, по которой старый раскладывал задачки по квадратикам, это, мол, важная и срочная, это я сделаю сам, а эта несрочная, но важная, её я кому-то делегирую. Дайте эту матрицу обычному современному тим-лиду и попросите стать вместе с ней, наконец-то, собранным, эффективным и продуктивным.</p>
<p>Ну возьмёт добрый молодец все задачки свои, и что? Какие он может отложить и забыть? Никакие, вы чо, с ума сошли? Какие он может делегировать? Да никакие, бо второго такого же тимлида рядом нет, а все задачи, которые могут выполнять его подчинённые, его подчинённые уже выполняют. Какие задачи он может сделать сам? Да все! А какие может отложить? Да все же…</p>
<p>Чтобы уметь договариваться о результате, сроках, средствах, надо сперва быть ресурсным дядькой, который может кому-то что-то делегировать и в обмен на что-то получить внятный результат, а потом уже менеджером.</p>
<p style="padding-left: 40px;">Надо быть бизнесменом-президентом США!</p>
<p style="padding-left: 40px;">Тут почему-то вспоминается мистер Трамп, который и президент США, и ведёт себя как бизнесмен на жёстких переговорах, когда важнее сбить с толку собеседника, нежели просто и предметно поговорить.</p>
<p>Будет ли прорыв в технологиях, когда условный AI будет способным выполнять задачи, которые ему будут делегировать дяди без ресурсов, неспособные нанимать других дядей? Да, наверное. Следим за новостями — если там некий неизвестный начнёт непредсказуемо выпиливать всех программистов, которые ещё смогут конкурировать с ним за ещё не разделегированные рабочие задачи очередного президента США, то напрягаемся, иначе нет.</p>]]></description>
<link>https://testitquickly.com/2026/11/04/prostii-si-deznadejde/</link>
<pubDate>Wed, 04 Nov 2026 21:02:23 +0300</pubDate>
</item>
<item>
<title>Никто нигде никому не нужен</title>
<description><![CDATA[<p>Развлечём закисших блаародных донов, которые страдают от общего падения уровня веселия в Арканаре. Говорят, мол, плохо всё, в жизни нет смысла.</p>
<p>Кагбэ да, но не совсем. Смысл <em>любой</em> жизни, от цветов до динозавров, которые боятся подходить к банкомату, в том, чтобы передать свои гены по цепочке дальше, в неизведанное. Передайте, товарищ.</p>
<p>Относительно современных подий, которые описывают как «а если сегодня не нанимать джунов — где вы завтра возьмете сеньоров, а!!!!??!!?!?!» — так а с чего вы взяли, что завтра эти ваши сеньоры будут нужны? Завтра будут нужны сеньоры другой формации, они будут жить в другом контексте, им будет нужна другая подготовка. Это раз.</p>
<p>А вот вам два — джуны тоже будут нужны. Когда джуны нужны, бизнес автоматически клепает курсы и подталкивает «рынок» нагонять ему джуниоров. Отсюда взлет курсов «на рынке», потому что появляются сразу два источника спроса, готовые заплатить — 1) бизнес и 2) желающие к этому бизнесу пристроиться.</p>
<p>Сейчас спрос на джунов со стороны бизнеса упал, потому что непонятно, куда и как их прикладывать (прикладное программирование же?!), за этим доминошками посыпались курсы, бо нет спроса с обеих сторон и нечего обещать в обмен на деньги.</p>
<p>И кажется, что так уже будет всегда.</p>
<p style="padding-left: 40px;">Программисты не нужны.<br />
Тестировщики не нужны.<br />
Заказчики не нужны.<br />
Клиенты заказчикам не нужны.<br />
Никто никому не нужен.</p>
<p>Не будет.</p>
<p>Это ваше рассуждение — не рассуждение, а экстраполирование отдельных эффектов на неопределенное будущее, вроде как люди образца 1890-х годов думали о будущем как о городах, полных навоза, потому что они понимали только лошадиный транспорт, который «работает на навозе». Идея автомобиля в те времена была незначительной, бо машинки были стрëмными. А сейчас вон оно как…</p>
<p>Бизнес сам по себе это бессердечный алгоритм, который делает чих-пых в цикле. В этом алгоритме находятся юниты, которые делают строго отдельные задачи. Если какой-то юнит поломался, то вместо него с бессердечным сожалением возьмут другого, и он будет выполнять ту же задачу, что и предыдущий, потому что алгоритм бизнеса делает бесконечно чих-пых, невзирая на смену юнитов.</p>
<p style="padding-left: 40px;">Давно уже умерли братья Ади и Руди Дасслеры, и все их работники, и все дети всех их работников, а компания Adidas всё ещё живёт и носится на чьих-то ногах. И времена она переживала более, эээ, мерзкие, нежели современные. И шо?</p>
<p>А если нет возможности регулярно заменять юнитов, то бизнес захочет нанимать только длинноногих, политически грамотных, юных и всесторонне развитых работников, которые будут незаменимо отвечать сразу «за всë». И вроде это логично, но от таких уникумов алгоритм бизнеса под большой угрозой, бо юнит может заболеть, взбрыкнуть, получить бан от антропика, тощо. И чо будет делать бизнес? Бизнес всегда основывается на заменяемых юнитах, а на незаменяемых ездит изредка и недолго, когда прижмёт.</p>
<p style="padding-left: 40px;">В девяностых вдруг возник спрос на бухгалтеров со знанием испанского языка, например. Тогда это казалось дуростью, ну возьми ты бухгалтера отдельно и переводчика отдельно. Но нет, в кризис происходит совмещение.</p>
<p style="padding-left: 40px;">Или ближе к нам — куда исчезли отдельные профессии тест-аналитиков и тест-дизайнеров? А мы сами начали заниматься сразу и тест-аналитикой и тест-дизайном, и их выполнением, и сегодня это уже никому не кажется странным. А это странно.</p>
<p>Поэтому когда джуны не нужны — они не нужны, точка. Когда джуны нужны — их начинают нанимать и обучать, и тут тоже точка. Припомните доисторический 2010-й год, например, когда надо было объяснять, что существует такое тестирование, и приходите к нам, вам будет интересно, мы вас всему научим, давайте к нам тестировать… Что было потом — вы уже знаете. А что происходит сегодня — вы знаете однозначно.</p>
<p>Сейчас кризисов несколько:</p>
<ol>
<li>просто <strong>экономический</strong> — заказов мало, все застыли в ожидании. На работе уже нужны не много отдельных юнитов, а всего лишь несколько точечно работающих многостаночников, за мелкий прайс. В норме это смешной оксюморон, но в кризисе не до смеха. Таких найти трудно, и риски с ними опять же растут, но это логичный ход (и, ЧСХ, массовый), поэтому фулстеки фнезапно фнорме и фсем нужны</li>
<li><strong>идейный</strong> — непонятно, кто нужен/понадобится на работе, потому что заказчиков стало мало, отчего алгоритмы бизнеса сбоят, спрос поменялся, стал неопределенным, все застыли в ожидании</li>
<li><strong>политический</strong> — стабильность стала очень нестабильной, на пять лет вперед задачи уже не прикинуть, и мы не можем понять, кого мы будем хотеть видеть на работе завтра. Отсюда замороженный спрос, все в ступоре</li>
<li><strong>социальный</strong> — непонятно, кого бизнес будет искать в будущем, какая профессия будет нужна (тут и дети, и мы сами), и тоже все зависли в ожидании знака свыше</li>
</ol>
<p>Отсюда вывод: фулстеки. Усидчивые. С большим AI в кармане.</p>
<p>И это хорошее решение, но временное. Как только ситуация выровняется, их начнут топить в ведре сызмальства, чтобы не размножались, потому что бизнесу нужно стабильно и планомерно делать чих-пых, а не зависеть от отдельных многоруких шив, которые капризничают, да и сами очень зависимы от отдельных компаний, которые могут дать, а могут не дать доступ к «рабочим инструментам». А пацаны, которые будут сегодня начинают мечтать стать фулстеками, в будущем резко присядут, потому что спрос поменяется, технологии поменяются, всё поменяется.</p>
<p>И да, поверх всей этой прохладной истории всегда будут нужны менеджеры — оркестраторы очередей исполнения задач, которые могут какой-то магией выравнивать провалы, сбои и пики нагрузки, ну и просто отвечать за то, что они сами не могут сделать, но взялись обеспечить.</p>
<p>Почему тяжко тестировщикам — а потому, что тестирование это сервис для менеджеров, а не необходимость для разработчиков вообще и для бизнеса в условной частности. В расцвете рынка сервисы — самое прибыльное занятие (вы посмотрите на наш славный аутсорс образца 2000-х!). В кризис сервисы первыми идут под нож, так что…</p>
<p>Что же делать, когда не знаешь, что делать? Тут ничего нового не придумано — придерживайся хоть какого-то плана. Продолжай движение хоть куда-то, чтобы не остаться на месте. У тебя же был какой-то план на пять лет, вроде выучить немецкий, выучить питон и эмигрировать в Старую, скажем так, Зеландию — достаём учебник и продолжаем учить по нему питон, не обращая внимания на все эти ваши AI, просто потому, что больше заняться нечем. Может той Зеландии и не будет — будет что-то другое, сейчас неочевидное.</p>
<p>Если потерялась вся профессия — забываем про торты и доставку гаджетов с Amazon, смотрим кругом и коммитимся на любую чухню, которая подвернётся, просто чтобы была возможность оплачивать коммуналку, а там уже куда кривая молдавской эмигрантской мечты вывезет, stay tuned…</p>]]></description>
<link>https://testitquickly.com/2026/11/03/trebuiala/</link>
<pubDate>Tue, 03 Nov 2026 14:23:22 +0300</pubDate>
</item>
<item>
<title>Гибкое тестирование аппаратного обеспечения: внедрение сдвига влево с программно-аппаратным моделированием</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/agile-hardware-testing1.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/agile-hardware-testing1.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Ренато Руджеро (Renato Ruggiero)<br /><strong><a href="https://www.ministryoftesting.com/articles/agile-hardware-testing-enabling-shift-left-with-hardware-in-the-loop-hil-testing" mce_href="https://www.ministryoftesting.com/articles/agile-hardware-testing-enabling-shift-left-with-hardware-in-the-loop-hil-testing" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><p>Тестирование программного обеспечения как можно раньше в цикле разработки – это широко признанная лучшая практика: чем раньше обнаружен дефект, тем дешевле его исправить. В этом заключается суть подхода со сдвигом влево (shift-left).</p>
<p>Но когда речь идёт о встроенных системах, таких как системы, используемые в промышленности, <a href="https://www.ministryoftesting.com/software-testing-glossary/internet-of-things-iot" mce_href="https://www.ministryoftesting.com/software-testing-glossary/internet-of-things-iot" target="_new">Интернете вещей (IoT)</a> или автомобильных приложениях, слово «рано» приобретает особое значение. Представьте, что вы можете тестировать программное обеспечение вашего электронного блока управления (ECU) сразу после того, как устройство становится доступным, даже если среда, с которой оно будет взаимодействовать, например автомобиль, производственная линия или облачный сервис, ещё не готова.</p>
<p>Именно здесь на помощь приходит <a href="https://www.ministryoftesting.com/software-testing-glossary/hardware-in-the-loop-hil-testing" mce_href="https://www.ministryoftesting.com/software-testing-glossary/hardware-in-the-loop-hil-testing" target="_new">тестирование hardware-in-the-loop (HIL)</a>. HIL-тестирование — это метод тестирования в реальном времени, при котором встроенное программное обеспечение работает на целевом аппаратном обеспечении и взаимодействует с имитируемой средой, воспроизводящей реальные сигналы и поведение. Это позволяет выполнять валидацию на уровне системы ещё до появления физических прототипов.</p>]]></description>
<link>https://www.software-testing.ru/library/around-testing/processes/4542-agile-hardware-testing</link>
<pubDate>Sun, 01 Nov 2026 23:00:00 +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/AVvXsEjuZpFzFnAXd3nnwRm2oPqZ9b9EDC-CqSMY7p9x_yI8rNkUIGMu4XDPcqC2AkOXSwhwgJRn3pcXucGPX4HWWuQWlkFUZcEB68O2jWWml0UPFjl1UXO7lNGTMgiG3Lwj-eBnSLC4ouBZyTv4efli5P5mhztscgoJzv2lYXsRYgvXdbZG5aBXZ_jSxgzRSUE/s2752/17932602363ebf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1536" data-original-width="2752" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuZpFzFnAXd3nnwRm2oPqZ9b9EDC-CqSMY7p9x_yI8rNkUIGMu4XDPcqC2AkOXSwhwgJRn3pcXucGPX4HWWuQWlkFUZcEB68O2jWWml0UPFjl1UXO7lNGTMgiG3Lwj-eBnSLC4ouBZyTv4efli5P5mhztscgoJzv2lYXsRYgvXdbZG5aBXZ_jSxgzRSUE/s320/17932602363ebf.png" width="320" /></a></div><br /><p></p><p>Я тут интеграцию двух приложений тестирую. <i>Вообще не представляю, что бы я делала без ИИ, поднимая эти приложения с нуля (инструкция была, скажем так, неидеальна).</i></p><p>И вот я все подняла, запускаю запрос в приложение 1, который должен скачать справочник и положить его в папку приложения 2. Огребаю «permission denied».</p><p>Перепроверили права по инструкции, все есть. Начали диагностику, в том числе снимать&nbsp;strace, который почему-то не сработал во время ошибки. И тут я вижу в рассуждениях ChatGPT:</p><p></p><blockquote><p>У нас есть два возможных сценария:</p><ul><li><p>Ошибка появилась в <b>приложении 2</b> и одновременно зафиксирована в <code>strace</code> — увидим конкретный системный вызов и причину отказа.</p></li><li><p>Ошибка появилась в&nbsp;<b>приложении 2</b>, но обращения к файлу в <code>strace</code> нет — возможно, загрузку выполняет другой процесс, а не Java с PID <code>8459</code>.</p></li></ul></blockquote><p>Я ж ему исходно просто лог скинула и спросила "как убедиться, что права нужные?", а в логе было "не могу положить файл в папку приложения 2", вот он и подумал, что именно оно падает.</p><p>Скидываю ему результат выполнения последних запросов и добавляю: «только ошибка в приложении 1, а не 2, оно пытается файл сохранить». Ответ чатика:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxkcqkLVGAY8_zkRvOpRpowrIRX65xLZt-TGeQQIf8SV83ivJotjQ5UHTCNWefGwkIK5muUmsAD8bxyvvun4sZynjkqZk7oezpcXut_1FkJyHsTMHnFVhTw_ZBv7wHM7vI16IiWLX7xkU0PCgyZPApFyTOqgmH-AvNiDNGG7Cy9wHGE-tXorEFugKW_y8/s1264/%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-10-29%20105311.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="363" data-original-width="1264" height="92" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxkcqkLVGAY8_zkRvOpRpowrIRX65xLZt-TGeQQIf8SV83ivJotjQ5UHTCNWefGwkIK5muUmsAD8bxyvvun4sZynjkqZk7oezpcXut_1FkJyHsTMHnFVhTw_ZBv7wHM7vI16IiWLX7xkU0PCgyZPApFyTOqgmH-AvNiDNGG7Cy9wHGE-tXorEFugKW_y8/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-10-29%20105311.png" width="320" /></a></div><br /><p>Ну, по крайней мере мы поняли, почему&nbsp;strace ничего не поймал ????</p><p>И чатик выдал уже новые инструкции.&nbsp;</p><p><br /></p><p><b>Вывод</b></p><p>Вводите в контекст! Да, даже умную ИИ-шку, тогда вам придется совершать меньше телодвижений. И тратить меньше токенов, если делать через агент, но моя задача — проверить инструкцию самой и записать все грабельки, которые агент просто молча порешает.</p><p>&nbsp;</p>]]></description>
<link>http://okiseleva.blogspot.com/2026/10/blog-post_29.html</link>
<pubDate>Thu, 29 Oct 2026 11:04:42 +0300</pubDate>
</item>
<item>
<title>Мои 12 недель в году. Часть 35 (Работа, ИИ, ДР сына и мамы: Владу 8 лет, отмена Атенолола)</title>
<description><![CDATA[<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8_TMcXdO_T3WxsX2LNgRt39mfGsXizqUUzehYirUVhbiTbpix3M7CMRI11Fsx1fyTnP2PZFUf_JR1Sl8Vr8N29gQav6buz5glr3KSwqXvsWo8QOtGafZNE5-WrhmypwlZ9Vb_0Ew4SqeX-AC0basxRXL_XDPWbQ7MW-ilcxSRbcb1jzCKB-OGXmM_LGc/s4080/IMG_20260917_101217.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="3072" data-original-width="4080" height="241" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8_TMcXdO_T3WxsX2LNgRt39mfGsXizqUUzehYirUVhbiTbpix3M7CMRI11Fsx1fyTnP2PZFUf_JR1Sl8Vr8N29gQav6buz5glr3KSwqXvsWo8QOtGafZNE5-WrhmypwlZ9Vb_0Ew4SqeX-AC0basxRXL_XDPWbQ7MW-ilcxSRbcb1jzCKB-OGXmM_LGc/s320/IMG_20260917_101217.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><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>,&nbsp;</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.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" style="color: #336699; text-decoration: none;">33</a>, <a href="https://okiseleva.blogspot.com/2026/07/12-34-1-2.html" target="_blank">34</a></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>-&nbsp;<span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #333333; font-size: 14.85px;">????</span>книга по тайм-менеджменту — написать 5 глав</p><p>- ????выпустить курс по ИИ</p><p>- ????сделать 1 тему нового курса</p><p>- ????1 статья на Хабр</p><p>-&nbsp;<span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #333333; font-size: 14.85px;">????</span>2 видео на ютуб</p><p>Осень, осень... Время года то, конечно, золотое, но это здравствуйте, болезни, и до свидания, привычный уклад — так как средний сын пошел в садик! Летом иногда получалось до прихода няни в 10 утра поспать. Ему ))) А нам развлекать только дочку. Всяко проще, чем обоих!</p><p>А я еще взяла себе больше рабочих часов на основной работе. Это очень интересно, так как активно использую ИИ-агентов, что полезно и на работе, и вне ее (как тренеру курсов). Но еще сложнее встроить сюда спортзал и отдых. И прям паникуешь в очередной "ой, я приболела" няни...</p><p>А еще я тут вписалась в SQA Days и Analyst Days и готовилась к ним, очень много времени это все выжрало. Хотя мои доклады в резерве, подготовку это не отменяет...</p><p>Но на самом деле мой основной план — это книга и курсы. Я ими и занималась. С курсами не вышло успеть, что задумала, а с книгой получилось. Уже хорошо! Что я успела за этот цикл:</p><p></p><ol style="text-align: left;"><li>Книга 5, ChatGPT:</li><ol><li>прошли верстку</li><li>прошли вычитку корректором</li><li>сдали в печать! Ждем ))))</li></ol><li>Книга 6, тайм-менеджмент — уже 18 глав ????</li><li>Курсы:</li><ol><li>автоматизация в Postman — доделала!</li><li>новый курс — записала, работаю над ним ????</li></ol><li>Статьи на Хабр — 0 статей ????</li><li>Пополнила свой youtube-канал — 3 видео ????</li><li>Подала доклады сразу на 2 конференции — SQA Days и Analyst Days</li><li>ДР Влада: 8 лет</li><li>Госпитализация с Катей, сделали лазер</li><li>Начали отмену атенолола (неужели дождалась?!!)</li><li>Купили 3д принтер))</li><li>Поседела, получив квитанцию на 80 тысяч квартплаты)</li></ol><p></p><p><br /></p><h3 style="text-align: left;">Результаты подробнее</h3><span><a name='more'></a></span><div><br /></div><h3 style="text-align: left;">Книга 5: ChatGPT</h3><div>Прошлый цикл:</div><div><ul style="text-align: left;"><li>9 июня — начали редактуру.</li><li>22 июля — начали верстку (хотя редактура еще не закончилась)</li></ul></div><div>В итоге:</div><div><ul style="text-align: left;"><li>30 июля — закончили редактуру</li><li>31 августа — закончили верстку</li></ul><div>Корректор был без меня, так что не знаю, когда точно книга ушла в печать, но где-то в сентябре, так что есть шанс получить книги уже в этом году. Ура-ура!</div></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Книга 6: тайм-менеджмент</h3><div><ul style="text-align: left;"><li>Прошлый цикл — 5 глав</li><li>Текущий — 18 глав</li></ul><div>Итого я написала 13 глав за цикл. В целом очень неплохо! Особенно если учесть не слишком быстрый темп. Хотелось бы, конечно, писать по главе в день. Или хотя бы в неделю! Но увы, некоторые занимали чуть ли не месяц... Не то чтобы главы такие сложные, просто "то это мешает, то то..."</div></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSFseGZOsmeEPsIXhfDKoMtMoKNDwp7_g2kuFVQ-bvGiUpHTKnna2DmtamULGoGyQ45OCrGOG-R5NFjr5DIqHYA54v0Sp-GrxkEF0_iY2lpTM8OnMHMbQJGMtHQrudE54_7L06Gc-8X0sCGGgppUM3SirYNf4Ipayhs1SUXBoTZkAtcHoJNYQjxfgUCf8/s1541/%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81%D1%8B.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1087" data-original-width="1541" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSFseGZOsmeEPsIXhfDKoMtMoKNDwp7_g2kuFVQ-bvGiUpHTKnna2DmtamULGoGyQ45OCrGOG-R5NFjr5DIqHYA54v0Sp-GrxkEF0_iY2lpTM8OnMHMbQJGMtHQrudE54_7L06Gc-8X0sCGGgppUM3SirYNf4Ipayhs1SUXBoTZkAtcHoJNYQjxfgUCf8/s320/%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81%D1%8B.png" width="320" /></a></div><br /><div>Сейчас у меня хороший темп, буду стараться его поддерживать. Посмотрим, что будет в следующий раз!</div><div><br /></div><div><br /></div><div><h3 style="text-align: left;">Курсы</h3><div><br /></div><div><b>Автоматизация в Postman</b></div></div><div><br /></div><div>Прошлый результат — 14 уроков готовы</div><div>Текущий — все закончено, ура!</div><div><br /></div><div>Я планировала потратить на это сильно меньше времени, но как есть. В прошлый раз у меня уже было все готово, но Постман взял и кучу всего наменял. Так что мне пришлось переписать часть видео снова. Ну и ладно, НАКОНЕЦ-ТО я это закончила!</div><div><br /></div><div>Подробнее писала тут —&nbsp;<a href="https://okiseleva.blogspot.com/2026/10/postman.html" target="_blank">Курс автоматизации в Postman полностью обновлен!</a></div><div><br /></div><div><br /></div><div><br /></div><div><b>Новые курсы</b></div><div><br /></div><div>Был план запуститься чуть ли не в сентябре. Но... В сентябре моя помощница по монтажу отдыхала, и я сама расслабилась. Просто каждый день выбирала "не курс". То слишком устала и хочу отдохнуть, то после тренировки никакая, то вечер настолок, то... Да сделаю когда-нибудь потом!</div><div><br /></div><div>Но, надо признать, входить в режим "мама троих детей вышла на работу" тяжело. Особенно с учетом того, что в августе я взяла больше часов и 2 дня работаю фулл-тайм. Особенно с учетом того, что в сентябре средний сын пошел в садик...</div><div><br /></div><div>В общем, отмазок громадье, но в конце сентября я ужаснулась тому, что за месяц вообще ничего не сделала. Взяла себя в руки и начала ДЕЛАТЬ, а не только планировать.</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>Увы, в этот раз не дошли руки, хотя была пара идей.&nbsp;</div><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Блог</h3><div><br /></div><div>Продолжаю писать посты про ИИ. Хотелось бы больше, но... Работа поглощает)</div><div><br /></div><div><a href="https://okiseleva.blogspot.com/2026/08/blog-post.html" target="_blank">Курсор, куда ты лезешь? Эх, не прокатило...</a></div><div><a href="https://okiseleva.blogspot.com/2026/08/redash.html" target="_blank">Как мне ИИ помог в Redash разобраться</a></div><div><a href="https://okiseleva.blogspot.com/2026/09/blog-post.html" target="_blank">А я тебе говорю, оно работает! (ИИ косячит)</a></div><div><br /></div><div>И еще один пост про книги сделала, когда мне на качество покупки пожаловались, а это оказались пираты —&nbsp;<a href="https://okiseleva.blogspot.com/2026/10/blog-post.html" target="_blank">Осторожно, пираты! (бумажные книги на озоне)</a>.</div><div><br /></div><div><br /></div><div><h3 style="text-align: left;">Youtube / ВК</h3><div><br /></div><div>Мой канал — <a href="https://www.youtube.com/c/okiseleva">https://www.youtube.com/c/okiseleva</a> (<a href="https://vkvideo.ru/@club227447987" target="_blank">Дубль в ВК</a>).</div><div><br /></div><div>Обновления в этом цикле:</div></div><div><ol style="text-align: left;"><li><a href="https://www.youtube.com/watch?v=bcOIbdFPoPA" target="_blank">Курсор пропал! На что меняем?</a></li><li><a href="https://www.youtube.com/watch?v=6UI1L2vOEGU" target="_blank">Как я за пару минут сделала приложение с API через Cursor</a></li><li><a href="https://www.youtube.com/watch?v=lrl6TWmz8Nk" target="_blank">Как я перенесла код с bitbucket на GitHub через Cursor</a></li></ol></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Конференции</h3><div><br /></div><div>Подала доклады сразу на 2 конференции — SQA Days и Analyst Days&nbsp;<span style="background-color: white; color: #333333; font-family: Arial; font-size: 14.4px;">＼(〇_ｏ)／</span></div><div><br /></div><div>Все дело в том, что я не шибко выездная пока, так что мне подходит вариант "конференция в Москве". А тут обе в Москве, а у меня идеи есть!</div><div><br /></div><div>В итоге подала доклады, и понеслось. На этой неделе встреча с кураторами одной конференции, надо готовиться. На следующей — встреча с кураторами второй конференции, надо готовиться...</div><div><br /></div><div>На SQA Days я подавалась на волнах эйфории от крутой штуки с ИИ, но, пообщавшись с кураторами, поняла, что конкретно эта тема неинтересна. Переобулась, поменяла направление доклада, мне поменяли кураторов (разные направления, технический и обычный доклады). Снова готовиться!</div><div><br /></div><div>И в такой запарке прошло месяца два. Если честно, очень напряжно сразу к двум конференциям готовиться, врядли я впишусь в это снова в следующем году, лучше выберу одну.</div><div><br /></div><div>Ну а пока... Я в резерве, на конференциях буду, может даже буду выступать. А если нет, буду думать, куда отнести потом свои доклады, а то жалко же, готовилась... В Московский клуб тестировщиков, наверное))</div><div><br /></div><div><br /></div><div><br /></div><div><h3>Магия утра</h3></div><div><br /></div><div>Вернулась к этой технике тайм-менеджмента, пока радует:</div><div><br /></div><div><blockquote><i>Магия утра! Катя спит, ура ура</i></blockquote></div><div><br /></div><div>Такой кайф, когда дети спят, а у тебя есть свободное время! Жаль, это было ровно до сентября ))) Да и Катя то спала до 9-10, то подскакивала в 7 утра, так что магия у меня не каждый день...</div><div><br /></div><div>Но практикую, как могу. Посмотрим, надолго ли ее хватит в этот раз. За лето я выдохлась, тяжело вставать в 7 утра КАЖДЫЙ день, без выходных. Но есть планы продолжать вставать и после отмены лекарства (об этом ниже), просто уже через день. Поспать - поработать, и так по кругу.</div><div><br /></div><div><br /></div><div><br /></div><div><h3>Внерабочее</h3></div><div><br /></div><div><br /></div><div><b>ДР Влада: 8 лет</b></div><div><b><br /></b></div><div><b><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVJHWkv6rBq-ImQoyPnflsljYvrKHHOMKM8Ndy5V2ShkNzOSgrgjOuQaMKkPlE6V4Kh42evJxEiG4As4iRVCB_KCQqBSsCz20BmBSpD1XGZzStTK_yWfrmhmImVY_NrGJTSJ7Jmx1rQHYoCdvid30xe5Rr2phUbf9LJfb9Lia_Ei9Org7IljnxoO6mazY/s1530/IMG_20260810_200419.jpg" 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/AVvXsEgVJHWkv6rBq-ImQoyPnflsljYvrKHHOMKM8Ndy5V2ShkNzOSgrgjOuQaMKkPlE6V4Kh42evJxEiG4As4iRVCB_KCQqBSsCz20BmBSpD1XGZzStTK_yWfrmhmImVY_NrGJTSJ7Jmx1rQHYoCdvid30xe5Rr2phUbf9LJfb9Lia_Ei9Org7IljnxoO6mazY/s320/IMG_20260810_200419.jpg" width="240" /></a></div><br /></b>Старшенький уже большой, во второй класс пошел! Фоткаться на 1 сентября, правда, отказался, уже не по возрасту )</div><div><br /></div><div>А на день рождения Влада мы купили... 3д принтер))&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/AVvXsEgWvRqUvcBQ8u6jQGiwDZd4PKlpUMGMHL-BrfxC8jfRgfbMwOsobJ2VSDupW26k-wcoc_ncdwkMCFKma2rO2e7lrl7uAYPo2VW9rb-9jw9Vi3sVe_xhio98aIYsD8RCR3Bed_TkqPKp6GlXlE7vRnTtyRrH5x8DawjUWiPL_u9iFEEADW2hUwW3Bntg6Nc/s2040/IMG_20260820_204539.jpg" 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/AVvXsEgWvRqUvcBQ8u6jQGiwDZd4PKlpUMGMHL-BrfxC8jfRgfbMwOsobJ2VSDupW26k-wcoc_ncdwkMCFKma2rO2e7lrl7uAYPo2VW9rb-9jw9Vi3sVe_xhio98aIYsD8RCR3Bed_TkqPKp6GlXlE7vRnTtyRrH5x8DawjUWiPL_u9iFEEADW2hUwW3Bntg6Nc/s320/IMG_20260820_204539.jpg" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilh504P4O7ukT-G26nUyi6GBLflDYB4UJQRA4iF0rtG4BtMF_AWleMdxRt7dIdtVCTzOwijpC-fyf8EuWaaBgU-1ql0pqMSa3AMvm9rPqqDwQO6fqgldJc0aQnfM5EYm0DJN-g5yXyXPQcOP5Nywfo4qlpwZpdb1aRDbJYD4HDp02MAPbgR09yoTVv59o/s277/IMG_20260822_193941.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="208" data-original-width="277" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilh504P4O7ukT-G26nUyi6GBLflDYB4UJQRA4iF0rtG4BtMF_AWleMdxRt7dIdtVCTzOwijpC-fyf8EuWaaBgU-1ql0pqMSa3AMvm9rPqqDwQO6fqgldJc0aQnfM5EYm0DJN-g5yXyXPQcOP5Nywfo4qlpwZpdb1aRDbJYD4HDp02MAPbgR09yoTVv59o/s1600/IMG_20260822_193941.jpg" width="277" /></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/AVvXsEh84z3UfKGJcR9nhkU85MbKiis4VNLrBNtKWSdQoVf90IlKZWbE57PWO9IbFaIxXhOKo52NiRHVhW-PHjK6l849xZ5dRgkR6ZYysAHZ3hIV-Gf6vK3Yv6iZDnusSKh6-p9o4rmFe4tmQVyA-VulVwTwVaiKZDUGWcs9BAcW-w5jTNsnVI3sVWO71BB0fjA/s1530/IMG_20260818_202353.jpg" 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/AVvXsEh84z3UfKGJcR9nhkU85MbKiis4VNLrBNtKWSdQoVf90IlKZWbE57PWO9IbFaIxXhOKo52NiRHVhW-PHjK6l849xZ5dRgkR6ZYysAHZ3hIV-Gf6vK3Yv6iZDnusSKh6-p9o4rmFe4tmQVyA-VulVwTwVaiKZDUGWcs9BAcW-w5jTNsnVI3sVWO71BB0fjA/s320/IMG_20260818_202353.jpg" width="240" /></a></div><br /><div><br /><div><br /></div><div><br /></div><div><br /></div><div><b>ДР бабушки</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/AVvXsEj837jpuxt4a4kCeMgcDYqWdXz5uqvDaJPYYbRx0zfrT-tG-Io5wmcqjgKUr5SLxfRlK2KAKouossIcTDfP4swaFd9_f2BBlD-HytTOSwnDI4IJyO5pqTJqMzKgd-DOYr_Yjjp5qTYbSXGjlWaiIJRasHmENwLnBHjXyLpef_A2rH4DqmO2GEKEnJ1EUls/s2040/IMG_20260825_183945.jpg" 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/AVvXsEj837jpuxt4a4kCeMgcDYqWdXz5uqvDaJPYYbRx0zfrT-tG-Io5wmcqjgKUr5SLxfRlK2KAKouossIcTDfP4swaFd9_f2BBlD-HytTOSwnDI4IJyO5pqTJqMzKgd-DOYr_Yjjp5qTYbSXGjlWaiIJRasHmENwLnBHjXyLpef_A2rH4DqmO2GEKEnJ1EUls/s320/IMG_20260825_183945.jpg" width="320" /></a></div><br /><div><b>Младшие детки</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/AVvXsEg9WhH1wS75TgJPC8yIZrneqoljycJ2bR-xoZ1GwN0JR3cPq8UprB-JuKa3Viy8TsF0BSxNlD3Lhmd5hh7NvzH4Ee-uB4P2fZgjeD7LCwHtXrXr9pEpQbVZvJLugs1nEzEJds3euaYrTXiMriGXKzjmUlCN7a7GjDFVQ53LE9WW6VbJxKvJ5iszTOd9d4c/s1530/IMG_20260827_175815.jpg" 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/AVvXsEg9WhH1wS75TgJPC8yIZrneqoljycJ2bR-xoZ1GwN0JR3cPq8UprB-JuKa3Viy8TsF0BSxNlD3Lhmd5hh7NvzH4Ee-uB4P2fZgjeD7LCwHtXrXr9pEpQbVZvJLugs1nEzEJds3euaYrTXiMriGXKzjmUlCN7a7GjDFVQ53LE9WW6VbJxKvJ5iszTOd9d4c/s320/IMG_20260827_175815.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/AVvXsEjbbRodB1P4OYdqowh-vzsRx5eWzD_he-zVWZLs_lOXLc1gJ2y2eCJasmzJgDw4x27qGDvWncOsc737XxVnecGZhqD7Utgthr3dvwQv7nvxGUbv9cIgMP46z5hF-vMARtBs4_B1R96_FCSgw0mAGaL_aSkXO5LrC0i1tz3yh2tb3Rp_j-nNAE7tsjE2JAc/s1530/IMG_20260828_171721.jpg" 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/AVvXsEjbbRodB1P4OYdqowh-vzsRx5eWzD_he-zVWZLs_lOXLc1gJ2y2eCJasmzJgDw4x27qGDvWncOsc737XxVnecGZhqD7Utgthr3dvwQv7nvxGUbv9cIgMP46z5hF-vMARtBs4_B1R96_FCSgw0mAGaL_aSkXO5LrC0i1tz3yh2tb3Rp_j-nNAE7tsjE2JAc/s320/IMG_20260828_171721.jpg" width="240" /></a></div><br /><div>Буквально полгода назад это были истерики и слезы, последний раз он уже понимал, что ничего страшного нет, в этот раз совсем спокойный был. Растет!</div><div><br /></div><div>В сентябре Леша пошел в садик на полный день. Но не с 1 числа, а с 15-ого, так как у нас была госпитализация с Катей и я каждый раз паникую, что она заболеет невовремя, а это может отодвинуть госпитализацию аж на 2 месяца, и снова все анализы пересдавать...</div><div><br /></div><div>Тем не менее в садик вышел, и ему понравилось! А я так и думала, что ему садик зайдет. Мы еще и велосипед для двойни купили, потому что сначала отвели сына одного, а Катя уже встала к тому времени и очень громко возмущалась, почему это брат пошел гулять, а она нет )))</div><div><br /></div><div>Потом мы стали возить их так:&nbsp;</div><div><ul style="text-align: left;"><li>в садик — сын в велосипеде, дочь в коляске</li><li>назад — дочь в велосипеде, второй родитель везет пустую коляску</li></ul><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/AVvXsEjNpbf8AkFlirKYFOMZDvcKbap9kt21xV7i21iEzu0nmZptt7AvXLr0yk8BKTFgjzYwqWhZ9zeIccJAZAqPIXK1pIlW7H_7_6Z9BC5d8merFI0ixaSf6YPDWsrM06dw3mKpsXX9vTYAugevzlA8qqjupLLtjcUyCQukOEvSp-BICgdxipMfM7F0uNtkNwE/s1530/IMG_20260928_091750.jpg" 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/AVvXsEjNpbf8AkFlirKYFOMZDvcKbap9kt21xV7i21iEzu0nmZptt7AvXLr0yk8BKTFgjzYwqWhZ9zeIccJAZAqPIXK1pIlW7H_7_6Z9BC5d8merFI0ixaSf6YPDWsrM06dw3mKpsXX9vTYAugevzlA8qqjupLLtjcUyCQukOEvSp-BICgdxipMfM7F0uNtkNwE/s320/IMG_20260928_091750.jpg" width="240" /></a></div><br /><div><br /></div><div>Теперь у нас один спит / работает, второй развозит детей — туда оба едут, назад одна))&nbsp;</div><div>И благодаря этому муж может доспать, а у меня есть магия утра!&nbsp;</div><div><br /></div><div><br /></div><div><br /></div><div><b>Госпитализация</b></div><div><b><br /></b></div><div>Снова были с Катюшкой в больнице Святого Владимира, красиво там:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEhrfg7C0ccckjT8LmZ3WibUFsj0ilfsZc8rH3oFGtp9DDWzaiBev0q6O83F7kwl39r77Ol3YgaWwbsMWoxirgON8nhd7nixqHWJMA0HvqxMa7HG_QsJeLDTBWXtwYK8vPdvBxlMUW6Bo5L5YRHTsTflPMiI-KPt5CPq5fIC7msvNmFzJN7dYihkv-zWg/s1530/IMG_20260914_092630.jpg" 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/AVvXsEjEhrfg7C0ccckjT8LmZ3WibUFsj0ilfsZc8rH3oFGtp9DDWzaiBev0q6O83F7kwl39r77Ol3YgaWwbsMWoxirgON8nhd7nixqHWJMA0HvqxMa7HG_QsJeLDTBWXtwYK8vPdvBxlMUW6Bo5L5YRHTsTflPMiI-KPt5CPq5fIC7msvNmFzJN7dYihkv-zWg/s320/IMG_20260914_092630.jpg" width="240" /></a></div><br /><div>Нам сделали лазер (гемангиомы, это как огромная родинка) и сказали, что всё, можно отменять Атенолол — а это сильное лекарство, поэтому отмена идет 7,5 недель.</div><div><br /></div><div>И вот сейчас я пишу эти строки, а у нас сегодня первый день БЕЗ лекарства, ю-ху! Я так ненавидела его порой, ведь его надо давать СТРОГО по часам. Летом бывало, что я принесу лекарство в 8 утра, доча спит. Я ей впрыскиваю из шприца в рот, она проглотит, отвернется и дальше спать.</div><div><br /></div><div>А у меня счастье и релакс. Но чаще всего она просыпалась при попытке дать ей лекарство, и я в это время всегда его ненавидела. И вот, наконец! Дождалась! Больше этого делать НЕ надо, ура-а-а-а!&nbsp;</div><div><br /></div><div>Год принимали лекарство и ездили на лазер. И вот она, свобода!</div><div><br /></div><div><br /></div><div><b>Няни</b></div><div><br /></div><div>Началась осень, пора простуд... Няни болели, мы выкручивались. Повезло, замену всего 1 раз не нашли, и как раз тогда ко мне Наташа в гости приехала, пока я с Катюхой гуляла (а Леша вроде в садике был).</div><div><br /></div><div>Тем не менее один раз мне пришлось в свой выходной отрабатывать внезапный отгул, потому что няня заболела и сообщила "день в день", а пока нашли замену, пока няня вторая приехала, уже работать было поздно...</div><div><br /></div><div>Но, тьфу-тьфу-тьфу, это редкость. Пока на работе дети не сказываются практически)</div><div><br /></div><div><br /></div><div><b>Всякое</b></div><div><br /></div><div>Мы с мужем много гуляли, и это прикольно. Пока погода еще хорошая была, каждый день старались выбраться на улицу — после работы пройтись туда-сюда по аллее. И воздухом подышать, и мороженку схомячить, и расскать друг другу, как день прошел — супер комбо!</div><div><br /></div><div>А еще я получила квитанцию за квартиру, которую мы сдаем — на 80 тысяч рублей... Там квартиранты пару лет живут, они сначала сдавали показания счетчиков, потом забили и платили по общедомовому.&nbsp;</div><div><br /></div><div>А тут пора было поверку делать, ну мастер пришел, все сделал, в итоге показания автоматически подали. И выяснилось, что они тратят ОЧЕНЬ много воды... Ходили в УК, разбирались, и нет, это не ошибка (((</div><div><br /></div><div>Но в итоге мы договорились, что это их долг, мне просто неоткуда взять столько денег, чтобы его погасить. Они ходили в УК, просили о рассрочке, и вот сейчас платим по частям. Так что я снова сплю спокойно, но тогда был шок, конечно))</div><div><br /></div><div><br /></div><h3 style="text-align: left;">Проверка планов, поставленных в прошлый раз</h3><div><br /></div><div><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="color: #333333; font-size: 14.85px;">Основные цели:</span></div><div><div style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><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 style="background-color: white;"><b><b><b><b><b><b><b><b><span style="font-weight: 400;">????</span></b></b></b></b></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 style="background-color: white;"><b><b><b><b><b><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b></b></b></b></b></b></b></b></b>Книга по тайм-менеджменту</b> — написать 3 главы, по одной в месяц норм план! → сделала 13! ????</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 style="background-color: white;"><b><b><b><b><b><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b></b></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 style="background-color: white;"><b><b><b><b><b><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b></b></b></b></b></b></b></b></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 style="background-color: white;">????&nbsp;</b>Статья на Хабр </b>— ну хоть одну!&nbsp;</li></ul></div><div style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><br /></div><div style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">Найс ту ду:</div><div style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><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 style="background-color: white;"><b><b><b><b><b><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b></b></b></b></b></b></b></b></b></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><b><b style="background-color: white;">????&nbsp;</b></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><b><b><b style="background-color: white;"><b><b><b><b><b><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b></b></b></b></b></b></b></b></b></b>Встретиться с друзьями&nbsp;</b></li></ul><div><br /></div><div><br /></div></div></div><h3 style="text-align: left;">Планы на следующие 12 недель</h3><div><div style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">Они особо не меняются, хотя книгу про питон пока уберу, я все равно уже забыть успела все, что прочитала, там перечитывать надо будет. Но у меня сейчас такой план по курсам, ух!</div><div style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><br /></div><div style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">Основные цели:</div><div style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><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> — написать 6 глав, по 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>— выпустить курс про ИИ</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 style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><br /></div><div style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">Найс ту ду:</div><div style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><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>Встретиться с друзьями&nbsp;</b></li></ul></div></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Итого</h3><div>Ого, в этом цикле я еще вычитывала книгу по ИИ! Кажется, что так давно это было)))</div></div><div><br /></div><div>Всегда забавно оглядываться назад, особенно на самое начало цикла. Перелистать заметки и заметить, как много я успела сделать, а то ведь кажется, что почти ничего. А так вроде получается, и это при том, что я вышла на работу и взяла себе побольше часов (поменьше на остальные активности осталось).</div><div><br /></div><div>Планов на следующий цикл громадье! Да там не на один цикл теперь хватит, поэтому надо пахать, что я и пошла делать)</div>]]></description>
<link>http://okiseleva.blogspot.com/2026/10/12-35-8.html</link>
<pubDate>Thu, 29 Oct 2026 07:58:21 +0300</pubDate>
</item>
<item>
<title>Укрощаем зоопарк, или Тестируем с помощью собственных API-mocks</title>
<description><![CDATA[<p><img src="https://software-testing.ru/images/stories/library/11hs/API-mocks/api-mocks1.png" mce_src="https://software-testing.ru/images/stories/library/11hs/API-mocks/api-mocks1.png" width="200" mce_style="float: left;" style="float: left;" /></p><p>Статья из блога компании <a href="https://habr.com/ru/companies/infotecs_tech/profile/" mce_href="https://habr.com/ru/companies/infotecs_tech/profile/" target="_blank" style="">ИнфоТеКС Tech</a></p><p>Как тестировать систему, если половина её компонентов — это «чёрные ящики» с уникальными протоколами, а стандартные API-mocks не справляются? С точки зрения готовых решений — тупик…&nbsp;</p><p>Меня зовут Дмитрий, я AQA-инженер в&nbsp;ИнфоТеКС. Мы с командой столкнулись с этой проблемой и создали собственные API-mocks, которые не просто отвечают шаблонными сообщениями, а ведут себя как настоящие компоненты системы. В этой статье — наш путь от идеи до работающего решения, которое можно адаптировать под ваши задачи.&nbsp;</p>]]></description>
<link>https://www.software-testing.ru/library/testing/testing-automation/4568-api-mocks</link>
<pubDate>Tue, 27 Oct 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Я думаю, следовательно, я тестирую: важность мышления для тестировщиков</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/i-think1.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/i-think1.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Эди Стоукс (Ady Stokes)<br /><strong><a href="https://www.ministryoftesting.com/articles/i-think-therefore-i-test-the-importance-of-thinking-for-testers" mce_href="https://www.ministryoftesting.com/articles/i-think-therefore-i-test-the-importance-of-thinking-for-testers" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><h1>Странно, правда, получать деньги за использование своего мозга?</h1>
<p>Только мне кажется, что получать деньги за работу мозга и за то, как ты думаешь, действительно странно? Вполне возможно, что дело только во мне: когда в школе тебе говорят, что у тебя нет никаких способностей, и ты сгодишься только на грузчика, червь синдрома самозванца обустраивается в голове надолго. Но хватит уже о моей неуверенности в себе.</p>
<p>Тестировщики и разработчики могут не воспринимать себя так, но на самом деле мы работники умственного, интеллектуального труда. Нам платят за силу нашего мозга и нашу способность думать — в равной или даже большей степени, чем за наши конкретные навыки.</p>]]></description>
<link>https://www.software-testing.ru/library/testing/general-testing/4541-i-think-therefore-i-test-the-importance-of-thinking-for-testers</link>
<pubDate>Sun, 25 Oct 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Как получить реальные данные с прода для тестирования, не сесть в тюрьму и не получить по шапке от службы безопасности</title>
<description><![CDATA[<p><img src="https://software-testing.ru/images/stories/library/11hs/security/security1.png" mce_src="https://software-testing.ru/images/stories/library/11hs/security/security1.png" width="400" mce_style="float: left;" style="float: left;" /></p><p>Меня зовут Семён Ремезов, я Senior QA в компании «Гринатом» (мы пишем софт для «Росатома»).</p><p>Про такие вещи обычно говорят шёпотом в курилках либо громко обсуждают, только когда уже «прилетело».</p><p>Можно, конечно, наклепать синтетических моков, но в сложных системах это мало что даст. У нас в «Гринатоме» крутятся огромные системы. Это не просто «магазин с корзиной». Это продукты с чудовищным уровнем вложенности, тоннами информации и зависимостями, которые переплетаются между собой, как корни столетнего дуба. Данные пересекаются везде и всюду.</p><p>Синтетика — это стерильная лаборатория. Моковые данные — это то, как разработчик представляет себе данные. А их реальный массив — это то, как пользователи на самом деле кошмарят систему.</p><p>Мы внедрили у себя security-лейблы в Postgres Pro Enterprise для анонимизации, и этот путь был, мягко говоря, тернистым. Если вы думаете, что анонимизация — это просто скрипт UPDATE users SET name = 'Ivan', то у меня для вас плохие новости.</p><p>Давайте разберём, как мы построили процесс, почему отказались от дорогих «коробочных» решений и как заставили Postgres 15-й версии работать нормально.</p>]]></description>
<link>https://www.software-testing.ru/library/testing/security/4566-security</link>
<pubDate>Tue, 20 Oct 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Практическое руководство по тестированию миграции цифровой инфраструктуры</title>
<description><![CDATA[<p><!-- wp:paragraph {"style":{"color":{"background":"#d7f4ffcf"}}} --></p>
<p class="has-background" style="background-color:#d7f4ffcf"><em><span class='font-weight-bold'>От функциональной приемки до нагрузочных и аварийных испытаний. Полезно для CTO, CIO и владельцев продуктов.</span></em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Мы вошли в эру все более нестабильного интернета. Прежняя уверенность в неуязвимости облачных систем рассыпалась, оставив трезвое осознание, что так как раньше, больше не будет. Недавняя <a href="https://www.kommersant.ru/doc/9025289" rel="nofollow">критическая ситуация</a> с дата-центрами в России показала бизнесу, как важно иметь план Б. Практически все игроки IT-рынка получили повод серьезно задуматься о диверсификации данных по разным ЦОД.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Одни компании уже начали частичный или полный переезд на альтернативные мощности, другие заложили перенос инфраструктуры в план на ближайшие недели. Мы, в свою очередь, как QA-команда, хотим рассказать как сделать все правильно и снизить риски потерь при миграции с помощью тестирования.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Представьте, сервера запустились, база перенеслась, мониторинг светится зеленым. Миграция удалась, не так ли?&nbsp;</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":31508,"width":"367px","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="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/10/migraciya-v-oblako.png" alt="migraciya-v-oblako" class="wp-image-31508" style="width:367px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/migraciya-v-oblako.png 512w, https://quality-lab.ru/wp-content/uploads/2026/10/migraciya-v-oblako-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/10/migraciya-v-oblako-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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 --></p>
<p>Поэтому нужно смотреть на тестирование при миграции не как на контрольную проверку в конце проекта, а как на способ узнать о наличии реальных проблем <a href="https://quality-lab.ru/blog/shifting-left-strategiya-kogda-celesoobrazno-pereklyuchatsya-v-testirovanii/" data-type="post" data-id="14215">как можно раньше</a>, что сэкономит массу финансовых и временных затрат всей команде. </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> <span class='font-weight-bold'>Миграция – это перенос приложения или его частей на другую технологическую базу</span>: в новый ЦОД, облако, кластер Kubernetes, СУБД, хранилище, либо к другому поставщику API. При смене хоста меняется в основном среда; при смене платформы – платформенные компоненты; при рефакторе – еще и поведение приложения.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Стоит всегда помнить, что даже самый легкий переезд не означает нулевой риск. Адреса, DNS, сертификаты, время жизни сессий, версии драйверов, сетевые ACL, файловые пути, тайм-ауты, транзакционная семантика, лимиты внешних сервисов, балансировщики и очереди могут измениться незаметно для разработчика. Система при этом продолжает отвечать, но не проводит платежи, теряет события или выдает отчеты с устаревшими данными.</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 --></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>операционный (сервис выдерживает реальную нагрузку, сбой и восстановление).&nbsp;</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Именно третий уровень (операционный) позволяет отвечать за непрерывность бизнеса.</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'>Как QA закрывает риски?</span></td>
</tr>
<tr>
<td>Скрытая зависимость или новый сетевой маршрут</td>
<td>Иногда не проходит оплата, пропадают уведомления</td>
<td>Сквозные сценарии, контрактные тесты, сбои внешних API</td>
</tr>
<tr>
<td>Ошибки переноса данных и CDC</td>
<td>Разошлись остатки, заказы, права доступа</td>
<td>Сверка ключевых сущностей, сумм, связей, лагов репликации</td>
</tr>
<tr>
<td>Новая конфигурация вычислений/БД</td>
<td>Падение конверсии и нарушение SLA</td>
<td>Базовая линия, реалистичная нагрузка, p95/p99, ошибки</td>
</tr>
<tr>
<td>Непроверенное восстановление</td>
<td>Простой длится часы вместо минут</td>
<td>Failover/restore, измерение RTO/RPO и репетиция отката</td>
</tr>
<tr>
<td>Новые IAM, секреты, сетевые правила</td>
<td>Утечка данных или доступы не работают</td>
<td>Проверки ролей, запретов, TLS, секретов, аудита</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,"style":{"color":{"background":"#f78da847"}}} --></p>
<h3 class="wp-block-heading has-background" style="background-color:#f78da847">TSB Bank: перенести данные – не значит перенести сервис</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>В апреле 2018 года шотландский TSB переводил банковские сервисы на новую IT-платформу. Перенос данных сам по себе состоялся, но после переключения возникли серьезные проблемы с обслуживанием через отделения, контакт-центр, цифровой и мобильный банк. Регуляторы указывали на недостатки управления миграцией, испытаний, контроля рисков и готовности к инцидентам. Проблемы затронули значительную долю 5,2 млн клиентов; в 2022 году FCA и PRA (британские регуляторы) <a href="https://www.cnews.ru/news/top/2022-12-20_britanskij_bank_krupno_oshtrafovali" rel="nofollow">оштрафовали</a> банк на £48,65 млн.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Да, возможно, дополнительное <a href="https://quality-lab.ru/testing-fintech/" data-type="page" data-id="29753">QA-тестирование</a> не предотвратило бы катастрофу гарантированно, так как причины были организационными и техническими. Но именно комплексная приемка реальных бизнес-процессов, проверка объема и пиков нагрузки, заранее заданные критерии Go/No-Go и операционные репетиции дали бы руководству основания вовремя остановить переключение.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3,"style":{"color":{"background":"#f78da847"}}} --></p>
<h3 class="wp-block-heading has-background" style="background-color:#f78da847">Knight Capital: одна ошибка вызвала крах бизнеса</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>В августе 2012 года Knight Capital (один из крупнейших участников фондового рынка США) <a href="https://www.computerra.ru/187019/kcg/" rel="nofollow">ошибочно</a> развернула торговое ПО: обновление попало не на все серверы, а старый компонент неожиданно начал отправлять некорректные заявки. По данным SEC, за 45 минут система отправила более 4 млн заявок, а убытки превысили $460 млн. Это не пример инфраструктурной миграции в узком смысле, но точная иллюстрация риска перехода.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Контрмеры для миграции в QA: контроль артефактов и конфигурации на каждом узле, проверки однородности среды, канарейки, ограничение масштаба ошибок, кнопка остановки и мониторинг бизнес-эффектов, а не только CPU.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Кстати, <span class='font-weight-bold'>KCG так и не смогла оправиться от инцидента как независимый бизнес.</span> Технический сбой 1 августа 2012 года нанес фирме непоправимый ущерб, который привел к потере самостоятельности и последующему поглощению.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3,"style":{"color":{"background":"#e3f2e9"}}} --></p>
<h3 class="wp-block-heading has-background" style="background-color:#e3f2e9">Cloudflare: пример грамотного переноса инфраструктуры</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>В 2024 году Cloudflare <a href="https://blog.cloudflare.com/migrating-billions-of-records-moving-our-active-dns-database-while-in-use/" rel="nofollow">описала в своем блоге</a> перенос активной DNS-базы, содержащей миллиарды записей. Команда применяла: перенос партиями, многонедельную синхронизацию изменений, проверки исходной и целевой базы и контролируемое переключение записи. Обнаружились даже редко используемые сервисы, упущенные при инвентаризации, а предусмотренный путь возврата помог их обработать. Это не универсальный рецепт для любой СУБД, но сильный пример совмещения проверки данных, постепенности и готовности к исключениям.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Что именно проверяет команда тестирования?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#d7f4ffcf"}}} --></p>
<p class="has-background" style="background-color:#d7f4ffcf"><em>Это не просто список видов тестирования, а путеводитель по <a href="https://quality-lab.ru/blog/positive-and-negative-risks-on-the-project/" data-type="post" data-id="5613">снижению рисков</a> дорогих бизнес-потерь: платеж проведен дважды; клиент не может войти; отчет показывает неверный остаток; заказ исчез из очереди; сервис недоступен в пиковый час. <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>Тестируются полные цепочки: авторизация &#8212; действие &#8212; запись в БД &#8212; событие &#8212; внешний сервис &#8212; статус пользователя &#8212; журнал аудита.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Не только позитивные сценарии, но повторный запрос, обрыв сессии, дубли, некорректные данные, конкурирующие операции, права разных ролей. Регресс проверяет то, что работало раньше; UAT с владельцем процесса подтверждает, что бизнес принимает результат. Результат – перечень критических сценариев и доказательства их прохождения в целевой среде.</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>Проверяются API-контракты, версии схем, TLS, сертификаты, DNS, тайм-ауты, ретраи, идемпотентность, DLQ, порядок и доставка событий.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Для миграции СУБД дополнительно нужны полнота, уникальность, контрольные суммы, агрегаты и референциальная целостность. Равенство количества строк – лишь первый фильтр: 10 млн перенесенных записей не гарантируют, что верно посчитан баланс каждого клиента.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Если использована CDC-репликация, QA отдельно фиксирует допустимый лаг, момент остановки записи, финальную сверку, специфические сценарии и то, кто является единственным источником истины после перехода. Автоматическая валидация в <a href="https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Validating.html" rel="nofollow">AWS</a>, например, сравнивает строки, но сама по себе не заменяет проверку бизнес-инвариантов.</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":31511,"width":"408px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/10/process-migracii-infrastruktury.png" alt="process-migracii-infrastruktury" class="wp-image-31511" style="width:408px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/process-migracii-infrastruktury.png 512w, https://quality-lab.ru/wp-content/uploads/2026/10/process-migracii-infrastruktury-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/10/process-migracii-infrastruktury-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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'>Руководителю важно знать не сколько RPS выдержал кластер, а как меняются успешные заказы, задержка и ошибки при реальной структуре трафика.</span> Грамотно сначала снять базовые показатели на старой платформе: профиль запросов, суточные пики, распределение транзакций, p50/p95/p99, долю ошибок, очередь, CPU, память, DB locks и внешние лимиты. Затем повторить профиль в сопоставимой целевой среде.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Набор испытаний: baseline-сравнение; ожидаемый пик; spike-тест (резкий всплеск); стресс-тест до найденной точки деградации; отказоустойчивости под нагрузкой. Генератор должен создавать не абстрактные запросы к главной странице, а сочетание чтений, изменений, фоновых задач и вызовов подрядчиков. Особое внимание – &#171;тихим&#187; отказам: очередь растет, но HTTP по-прежнему отвечает 200.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Например, для сервиса с 100 заказами/мин в обычный час и 400 в промо-пик можно согласовать испытание на 400 заказах/мин плюс реалистичный фоновый поток и запас, выведенный из прогноза роста. Критерий не &#171;150% потому что так принято&#187;, а бизнес-SLO: скажем, 99,9% корректно оформленных заказов за целевой период, p95 времени оформления по <a href="https://learn.microsoft.com/en-us/azure/architecture/guide/testing/mission-critical-deployment-testing" rel="nofollow">утвержденному</a> порогу, отсутствие потери и дублирования. Все числа в этом примере условные, не отраслевой стандарт.</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>При смене платформы проверяют по принципу минимальных привилегий, service accounts, смотрят секреты и их ротацию, шифрование и маскирование, сегментацию сети, логи доступа и аудит. Технический пентест не заменяет проверки бизнес-прав: менеджер не должен внезапно видеть чужие договоры.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Отдельно моделируются недоступность ноды, зоны, БД, очереди, платежного шлюза. Измеряются RTO – фактическое время восстановления – и RPO – фактический объем потери данных во времени; их сравнивают с заранее согласованными пределами. Проверяется именно восстановление из резервной копии, а не сообщение &#171;backup successful&#187;. Также чекаются алерты: кто, по какому сигналу и за сколько минут <a href="https://docs.cloud.google.com/architecture/framework/reliability/perform-testing-for-recovery-from-failures" rel="nofollow">узнает о сбое</a>.</p>
<p><!-- /wp:paragraph --></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: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'>Работа QA и команды</span></td>
<td><span class='font-weight-bold'>Артефакт для решения</span></td>
</tr>
<tr>
<td><span class='font-weight-bold'>0. До выбора окна</span></td>
<td>Product + QA выделяют 5–10 критических путей; Infra/Data строят карту зависимостей; SRE снимает базовые показатели</td>
<td>Согласованы ущерб, SLO, RTO/RPO и границы тестирования</td>
</tr>
<tr>
<td><span class='font-weight-bold'>1. Среда готова</span></td>
<td>Infra разворачивает целевую инфраструктуру; QA проверяет соответствие конфигураций,&nbsp;<br />также интеграции, данные, права</td>
<td>Target пригоден для функциональных и нагрузочных прогонов</td>
</tr>
<tr>
<td><span class='font-weight-bold'>2. Перед переносом</span></td>
<td>QA ведет регресс/UAT; performance команда – профили нагрузки; SRE – отказоустойчивость; все репетируют пошаговый план и откат на случай если все пойдет не по плану</td>
<td>Протокол дефектов, доказательства SLO и восстановление</td>
</tr>
<tr>
<td><span class='font-weight-bold'>3. Переключение</span></td>
<td>Infra исполняет пошаговую карту; QA – смоук-тесты критических сценариев; SRE – метрики и алерты; РП принимает бизнес-показатели</td>
<td>Разрешено расширить трафик либо выполнен откат</td>
</tr>
<tr>
<td><span class='font-weight-bold'>4. После старта</span></td>
<td>QA и SRE сравнивают базовые показатели, сверяют данные/очереди, наблюдают суточные циклы и фоновые задания</td>
<td>Закрыт испытательный период, ответственность передана эксплуатации</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Роли и зоны ответственности нужно назначить конкретно:</span> владелец продукта отвечает за допустимый бизнес-риск; руководитель миграции – за последовательность и окно; QA lead – за стратегию, качество доказательств и остаточные дефекты; Infra/Data – за среду и миграцию; SRE – за SLI, реакции на аварии и восстановление; Безопасность – за доступы и контроль данных.</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":31510,"width":"372px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/10/perenos-it-infrastruktury.png" alt="perenos-it-infrastruktury" class="wp-image-31510" style="width:372px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/perenos-it-infrastruktury.png 512w, https://quality-lab.ru/wp-content/uploads/2026/10/perenos-it-infrastruktury-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/10/perenos-it-infrastruktury-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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 формирует рекомендацию, а решение по конкретным действиям принимает уполномоченный владелец риска. Не тестировщик, который поставил галочку.</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.&nbsp; </span><span class='font-weight-bold'>Составить реестр компонентов и невидимых зависимостей:</span> сервисы, БД, очереди, планировщики, batch, FTP/SFTP, SMTP, SSO, DNS, API партнеров, сертификаты, IP allowlists. Для каждой зависимости – ответственный и сценарий отказа.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Шаг 2.&nbsp; </span><span class='font-weight-bold'>Снять базовые показатели старой системы на одной и той же модели данных и нагрузки. </span>Установить пороги выхода: SLI, SLO, бизнес-ошибки, p95/p99, объем очередей, долю тайм-аутов; пороги утвердить с продуктом.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Шаг 3.&nbsp; </span><span class='font-weight-bold'>Подготовить правдоподобную целевую инфраструктуру:</span> версии, лимиты, сетевые пути, объемы данных, обезличенные или синтетические наборы. Отдельно отметить отличия тестовой среды от продакшена – иначе нагрузочные выводы ограничены.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Шаг 4.&nbsp; </span><span class='font-weight-bold'>Исполнить риск-ориентированный набор проверок: </span>smoke &#8212; сквозные сценарии &#8212; сверка данных &#8212; безопасность &#8212; нагрузка &#8212; аварии. Критические сценарии автоматизировать и сохранять трассы, логи, результаты прогонов.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Шаг 5.&nbsp; </span><span class='font-weight-bold'>Провести репетицию переезда на копии: </span>синхронизация, финальная сверка, «заморозка» записи, переключение, прогон smoke, возврат трафика. Измерить время каждого действия. План отката проверять с учетом изменений данных, появившихся уже после старта.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Шаг 6.&nbsp; </span><span class='font-weight-bold'>Установить режим поэтапного включения.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Шаг 7.&nbsp; </span><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: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>Пользователь платит, но API отвечает timeout</td>
<td>Повтор запроса с тем же ключом идемпотентности: деньги не списаны дважды; итог виден в заказе и финансовом реестре.</td>
</tr>
<tr>
<td>Перенос данных прерван на середине</td>
<td>Повторная догрузка без потери/дублирования, сверка критичных сумм, контроль ссылок и временных меток.</td>
</tr>
<tr>
<td>Падение узла под пиковым трафиком</td>
<td>Ошибки и p95 остаются в согласованных пределах либо система деградирует предсказуемо; фиксируется время восстановления.</td>
</tr>
<tr>
<td>Новое сетевое правило блокирует callback</td>
<td>Проверка всех партнерских интеграций с реальными TLS/DNS-маршрутами, ретраями и DLQ.</td>
</tr>
<tr>
<td>Решено откатиться спустя 20 минут</td>
<td>Проверяется процедура возврата трафика и согласования накопившихся записей; если обратная синхронизация невозможна – заранее определен forward-fix.</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#d7f4ffcf"}}} --></p>
<p class="has-background" style="background-color:#d7f4ffcf">Тест считается полезным потому, что у него есть в основе закрытие конкретного риска, предусловия, шаги, наблюдаемый оракул и сохраненное свидетельство: ID транзакций, diff данных, график p95, трасса и время восстановления. Именно эти факты должны рассматриваться миграционным комитетом.</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":31509,"width":"344px","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="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/10/perenos-infrastuktury-na-oblako.png" alt="perenos-infrastuktury-na-oblako" class="wp-image-31509" style="width:344px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/perenos-infrastuktury-na-oblako.png 512w, https://quality-lab.ru/wp-content/uploads/2026/10/perenos-infrastuktury-na-oblako-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/10/perenos-infrastuktury-na-oblako-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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'>Главный вопрос CTO перед переносом инфраструктуры в идеале должен звучать так: </span>«Какие бизнес-потери мы уже исключили с помощью тестирования, какие еще возможны и что мы сделаем в первые 5 минут, если прогноз окажется неверным?» Если у команды есть четкий и, главное, аргументированный ответ, миграция становится предсказуемой. </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>Собственные тестировщики обычно лучше всех знают продукт, но во время переезда они заняты инфраструктурой и сопровождением. <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> полезна как отдельный поток контроля и дополнительный источник объективной оценки: она помогает описать пользовательские риски, построить тестовую модель, подготовить регрессию, провести производительные и аварийные испытания, зафиксировать непокрытые области и донести результаты до комитета без конфликта интересов. При этом ответственность за архитектуру и бизнес-решения остаются на заказчике.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#ddf3ed"}}} --></p>
<p class="has-background" style="background-color:#ddf3ed">Мы в «Лаборатории Качества» предлагаем начать разумно: не с закупки тысячи тест-кейсов, а с короткой диагностической сессии, где разберем: тип миграции, карту сервисов, критичные операции, доступные стенды, базовые показатели, допустимый простой и цену ошибок. По результатам составим план испытаний с оценкой трудозатрат, приоритетов, артефактов и точек принятия решения. Начать очень просто  – запишитесь на бесплатную консультацию. 30 минут концентрированного профессионального общения без продаж и обязательств.</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/prakticheskoe-rukovodstvo-po-testirovaniyu-migracii-cifrovoj-infrastruktury/</link>
<pubDate>Mon, 19 Oct 2026 17:38:22 +0300</pubDate>
</item>
<item>
<title>Хотите конфетку? Создаем культуру потрясающей обратной связи</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/candy/candy3.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/candy/candy3.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Джуди Мосли (Judy Mosley)<br /><strong><a href="https://www.ministryoftesting.com/articles/want-some-candy-creating-a-culture-of-fabulous-feedback" mce_href="https://www.ministryoftesting.com/articles/want-some-candy-creating-a-culture-of-fabulous-feedback" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><p>В бытность младшим QA-специалистом я быстро поняла, что не каждому разработчику нравятся те типы багов, которые я находила. Некоторые баги существовали годами до того, как я их обнаруживала, а другие было невероятно сложно воспроизвести. Я шутила, что мне нужно держать на столе целую горку леденцов на случай, если разработчики подойдут попросить продемонстрировать баг, который я описала. Непросто бывает услышать, что что-то не работает, и иногда сладости очень помогают.</p>
<p>Спустя годы работы в тестировании я поняла, что QA — это не просто проверка того, есть ли тут баг. Качество — это умение отстраниться и оценить все типы циклов обратной связи. Это может быть процесс, встречи, в которых мы участвуем, отчёты или формы регистрации багов. Оценка наших циклов обратной связи может помочь нам понять, получаем ли мы эффективную обратную связь, необходимую для принятия чётких решений.</p>
<p>Конечно, я говорю не о настоящих конфетах - мы будем использовать эвристику CANDY, которая поможет командам предоставлять друг другу и самим себе прекрасную обратную связь.</p>]]></description>
<link>https://www.software-testing.ru/library/around-testing/management/4539-candy</link>
<pubDate>Sun, 18 Oct 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>«Мелкий» баг, большие проблемы: почему переписки убивают карьеру тестировщика</title>
<description><![CDATA[<p><img src="https://software-testing.ru/images/stories/library/11hs/minor-bug.png" mce_src="https://software-testing.ru/images/stories/library/11hs/minor-bug.png" width="300" mce_style="float: left;" style="float: left;" />Автор: Поролло Глеб Владимирович, Инженер по нагрузочному тестированию</p>
<p>Твой тимлид открывает Jira и смотрит на статистику: за две недели ты завел три дефекта. Три. Он спрашивает, чем ты занимался все это время. Ты начинаешь объяснять про двадцать багов, исправленных через личку с разработчиками. Он кивает и говорит: «Понятно. Но в системе этого нет».</p><p>Через неделю тебя включают в список на сокращение. Это не страшилка. Это реальность для тестировщиков, которые считают, что быстрая личка эффективнее формального баг-трекера. В этой статье я расскажу, с какими рисками сталкиваются тестировщики ЛАНИТ и других ИТ-компаний, когда заменяют баг-трекер личными переписками, и как это защитит твою карьеру.</p>]]></description>
<link>https://www.software-testing.ru/library/around-testing/processes/4564-minor-bug</link>
<pubDate>Wed, 14 Oct 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Тестирование без требований: как навести порядок в QA за 90 дней</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p>Вот и пришло время опубликовать третью часть цикла о тестировании без требований. Мы уже рассказали об оракулах, карте продукта и риск-ориентированном подходе в <a href="https://quality-lab.ru/blog/testirovanie-bez-trebovanij-orakuly-karta-produkta-i-risk-orientirovannoe-testirovanie/" data-type="post" data-id="31383">первой части</a> и дали конкретные QA-практики<a href="https://quality-lab.ru/blog/qa-praktiki-kotorye-rabotayut-dazhe-na-proektax-bez-chetkix-trebovanij-i-tz/" data-type="post" data-id="31417"> во второй</a>. </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":31471,"width":"300px","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="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-koda.png" alt="testirovanie-koda" class="wp-image-31471" style="width:300px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-koda.png 512w, https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-koda-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-koda-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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-процессах за 90 дней. Пристегните ремни, приступаем! Полезно тестировщикам, техлидам и продакт-менеджерам, которые работают на проектах без чётких требований и ТЗ.</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>Трудно измерять то, что не прописано в ТЗ. Привычные способы здесь не работают. Процент покрытия требований посчитать нельзя, количество тест-кейсов не показывает ничего, кроме усердия QA-инженеров, а число найденных багов двусмысленно: их много, потому что тестировщики хорошие или потому что разработка плохая? Мы предлагаем остановиться на 5 честных показателях – всего 30 минут в неделю на сбор и вы получите качественные данные для управленческих решений.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<figure style="max-width:1100px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<table style="width:100%; min-width:850px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Пять метрик и что с ними делать</caption>
<thead>
<tr>
<th style="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; width:22%;">Метрика</th>
<th style="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; width:26%;">Как считать</th>
<th style="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; width:26%;">На какой вопрос отвечает</th>
<th style="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; width:26%;">Что делать, если плохо</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Первопричина дефектов</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Каждый баг помечается: непонятое требование, код, интеграция, данные, среда</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Мы вообще ту проблему решаем?</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Доля «требований» выше 30% — вкладывайтесь в контур 1, а не в автотесты</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Утечка в прод</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Дефекты, найденные пользователями, к найденным до релиза</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Работает ли приёмка в принципе?</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Разбирайте каждый утёкший баг вопросом «в каком контуре он должен был всплыть»</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Возраст открытых вопросов</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Сколько дней живут красные карточки и вопросы из сессий</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Отвечает ли бизнес на наши вопросы?</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Выше пяти дней — проблема не в QA, а в доступности того, кто принимает решения</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Доля переделок</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Задачи, вернувшиеся на доработку после демо, к общему числу</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Насколько мы попадаем в ожидания?</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Растёт — учащайте контур 2. Обычно спасает переход на показ раз в два дня</td>
</tr>
<tr>
<td style="padding:14px; color:#1f2937; vertical-align:top; font-weight:700;">Доля неудачных релизов</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Релизы с откатом или срочным хотфиксом (change failure rate из DORA)</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Сколько стоит наша скорость?</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Выше 20% — не ускоряйте тестирование, а стройте быстрый откат и фича-флаги</td>
</tr>
</tbody>
</table></div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Последняя метрика — из исследования DORA со статистикой по тысячам команд. Остальные четыре — наш рабочий минимум.</figcaption></figure>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Практика. </span>Про первую метрику хочется сказать отдельно: нам она буквально перевернула приоритеты. Полгода классификации багов на 4 проектах дали среднюю картину – <span class='font-weight-bold'>34% дефектов</span> возникали из-за <span class='font-weight-bold'>неправильно понятого требования</span>. Треть работы обеих команд уходила на исправление недоговоренностей. Это поменяло расчет вложений в тестирование, так как автоматизация не уменьшала эти <span class='font-weight-bold'>34% ошибок</span>, а только проверяла реализацию того же непонятого требования. <span class='font-weight-bold'>Нашли проблему с Example Mapping за 20 минут.</span> После трёх месяцев работы первого контура доля таких дефектов <span class='font-weight-bold'>упала до 12–15%</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>Обратите внимание, от выбора инструментов все описанное почти не зависит, так как живет в вики, таблице и трекере. Но если инструмент неудобный, то команда перестает им пользоваться и процесс постепенно умирает. Так что постоянно мониторьте рынок на новинки и больше смотрите на функционал, а не на названия.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<figure style="max-width:1100px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<table style="width:100%; min-width:850px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Инструментальный контур приёмки</caption>
<thead>
<tr>
<th style="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; width:24%;">Задача</th>
<th style="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; width:24%;">Международный стандарт</th>
<th style="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; width:28%;">Что работает у нас</th>
<th style="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; width:24%;">Комментарий</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Карта продукта, журнал решений</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Confluence, Notion</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Yandex Wiki, Teamly, Yonote, Outline, Wiki.js</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Требование одно: версии и поиск</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Трекер задач и рисков</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Jira, Linear</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Яндекс Трекер, Kaiten, YouGile, Weeek, EvaTeam</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Реестр рисков живёт отдельной доской. Для Example Mapping хватит Яндекс Борда или бумажных стикеров</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Управление тестированием</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">TestRail, Xray, Zephyr</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Test IT, ТестОпс (Qameta), DoQA, Devprom ALM</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Нужен, когда появились регресс-чек-листы и автотесты</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Автотесты, контракты, нагрузка</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Playwright, Postman, Pact, k6</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Playwright, Selenium, Hoppscotch, Apidog, Яндекс.Танк; Pact ставится локально</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Открытый код, ограничений нет. OpenAPI держите рядом с кодом</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Мониторинг и алерты</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Datadog, New Relic</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Grafana + VictoriaMetrics, Zabbix, GlitchTip</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Контур «ловим в проде» без этого не строится вообще</td>
</tr>
<tr>
<td style="padding:14px; color:#1f2937; vertical-align:top; font-weight:700;">Фича-флаги</td>
<td style="padding:14px; color:#374151; vertical-align:top;">LaunchDarkly</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Unleash, Flipt, самописные на конфиге</td>
<td style="padding:14px; color:#6b7280; vertical-align:top;">Самое дешёвое вложение с самой высокой отдачей. Начните с него</td>
</tr>
</tbody>
</table></div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Про очерёдность: фича-флаги и мониторинг важнее системы управления тестами. Возможность выключить фичу за минуту снимает больше рисков, чем сотня кейсов.</figcaption></figure>
<p><!-- /wp:html --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Кейс: миграция биллинга без актуальных требований и нормального ТЗ</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><em>Кейс обезличен (NDA): региональный телеком-оператор, миграция биллинга, 11 месяцев работы.</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>Заказчик готовился к переезду со старой биллинговой системы, которая работала уже 11 лет, на новую. Подрядчик, создавший первоначальную архитектуру, уже не существовал. Документация состояла из 4 томов 2014 года про систему, с тех пор изменившуюся до неузнаваемости. Людей, помнящих логику, осталось всего двое, но оба уже работали в других департаментах. Требование к проекту было написано одной строкой: «Абонент не должен заметить перехода». За ним стояли 340 тысяч абонентов, 60 тарифов, 14 акций и 11 лет истории начислений с перерасчетами и ручными корректировками.</p>
<p><!-- /wp:paragraph --></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":31473,"width":"320px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/10/proverka-programmnogo-obespecheniya.png" alt="proverka-programmnogo-obespecheniya" class="wp-image-31473" style="width:320px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/proverka-programmnogo-obespecheniya.png 512w, https://quality-lab.ru/wp-content/uploads/2026/10/proverka-programmnogo-obespecheniya-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/10/proverka-programmnogo-obespecheniya-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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">Первые два месяца были в режиме Шерлока Холмса: аналитики восстанавливали требования по документам и интервью. Описали 40% тарифной логики, наткнулись на противоречие – и выяснили, что описание расходится с реальностью примерно в каждом пятом случае.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Люди помнили, как задумывалось, а не как получилось после 11 лет правок. Сроки переехали на квартал, подход пришлось менять целиком.</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'>Построили карту продукта по SFDIPOT за 9 дней. </span>Нашли 11 фоновых задач, о которых не знал никто из действующих сотрудников. Например, одна ежемесячно корректировала начисления 900 корпоративным клиентам.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Собрали дифференциальный стенд. </span>Обе системы получали один поток обезличенных событий за реальный месяц – 47 млн триггеров тарификации. Результаты сравнивались автоматически. Расхождения раскладывали на три корзины: ошибка новой системы, ошибка старой, сознательное изменение. Третья корзина и стала тем документом требований, который не получалось написать заранее.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Ввели журнал решений. </span>214 записей для решений, воспроизводим то или иное поведение или исправляем. Журнал позже стал документацией к новой системе.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Приемку сделали в 9 волн:</span> 200 абонентов на простейшем тарифе, потом 5000, потом сегмент за сегментом. После каждой – сверка начислений.</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>Миграция заняла 11 месяцев вместо плановых восьми. Но план строился на основе фантазий о том, что требования можно восстановить всего за два месяца. От смены подхода до финала прошло 9 месяцев без сдвигов. Нашли 1 847 расхождений, из них 1 203 оказались ошибками старой системы, которые годами никто не замечал. Жалоб на начисления за первый месяц – 34 при прогнозе в несколько тысяч.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="max-width:1000px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="display:flex; gap:16px; flex-wrap:wrap;">
<div style="flex:1 1 200px; background:#f8faff; border:1px solid #e5eaf2; border-radius:12px; padding:24px 20px; text-align:center; box-shadow:0 4px 16px rgba(0,0,0,0.04);">
<div style="font-size:32px; font-weight:700; color:#0f7b6c; line-height:1.1; margin-bottom:10px;">47 млн</div>
<div style="font-size:13px; color:#4a5568; line-height:1.5;">событий прогнали через обе системы на дифференциальном стенде</div>
</p></div>
<div style="flex:1 1 200px; background:#f8faff; border:1px solid #e5eaf2; border-radius:12px; padding:24px 20px; text-align:center; box-shadow:0 4px 16px rgba(0,0,0,0.04);">
<div style="font-size:32px; font-weight:700; color:#0f7b6c; line-height:1.1; margin-bottom:10px;">1 203</div>
<div style="font-size:13px; color:#4a5568; line-height:1.5;">ошибки старой системы, о которых не знали одиннадцать лет</div>
</p></div>
<div style="flex:1 1 200px; background:#f8faff; border:1px solid #e5eaf2; border-radius:12px; padding:24px 20px; text-align:center; box-shadow:0 4px 16px rgba(0,0,0,0.04);">
<div style="font-size:32px; font-weight:700; color:#0f7b6c; line-height:1.1; margin-bottom:10px;">214</div>
<div style="font-size:13px; color:#4a5568; line-height:1.5;">записей в журнале решений, ставших документацией к новой системе</div>
</p></div>
<div style="flex:1 1 200px; background:#f8faff; border:1px solid #e5eaf2; border-radius:12px; padding:24px 20px; text-align:center; box-shadow:0 4px 16px rgba(0,0,0,0.04);">
<div style="font-size:32px; font-weight:700; color:#0f7b6c; line-height:1.1; margin-bottom:10px;">34</div>
<div style="font-size:13px; color:#4a5568; line-height:1.5;">жалобы абонентов за первый месяц после перехода</div>
</p></div>
</p></div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Из этого делаем вывод, что вся соль не в инструментах. Первые два месяца мы потратили на то, чтобы добыть хоть какие-то данные и документы о старой системе. Отсутствие требований перестает быть проблемой в тот момент, когда вы находите другой источник истины и решаете считать главным именно его.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">План внедрения QA-стратегии на проектах без требований на 90 дней</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":31472,"width":"341px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-programmnogo-obespecheniya.png" alt="testirovanie-programmnogo-obespecheniya" class="wp-image-31472" style="width:341px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-programmnogo-obespecheniya.png 512w, https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-programmnogo-obespecheniya-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-programmnogo-obespecheniya-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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:html --></p>
<figure style="max-width:1000px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="background:#ffffff; border:1px solid #e5eaf2; border-radius:16px; padding:24px 28px 28px; box-shadow:0 4px 20px rgba(0,0,0,0.06);">
<div style="font-size:17px; font-weight:600; color:#22302A; margin-bottom:22px;">90 дней: от хаоса к предсказуемой приёмке</div>
<p>    <!-- Таймлайн --></p>
<div style="margin:0 0 24px;">
<div style="border-top:2px solid #22302A;"></div>
<div style="display:flex; justify-content:space-between; margin-top:-8px;">
<div>
<div style="width:14px; height:14px; border-radius:50%; background:#2E6B4F;"></div>
<div style="font-size:13px; font-weight:700; color:#2E6B4F; margin-top:8px;">День 1</div>
</p></div>
<div style="text-align:center;">
<div style="width:14px; height:14px; border-radius:50%; background:#2B4E6F; margin:0 auto;"></div>
<div style="font-size:13px; font-weight:700; color:#2B4E6F; margin-top:8px;">День 30</div>
</p></div>
<div style="text-align:center;">
<div style="width:14px; height:14px; border-radius:50%; background:#8A6A17; margin:0 auto;"></div>
<div style="font-size:13px; font-weight:700; color:#8A6A17; margin-top:8px;">День 60</div>
</p></div>
<div style="text-align:right;">
<div style="width:14px; height:14px; border-radius:50%; background:#A33327; margin-left:auto;"></div>
<div style="font-size:13px; font-weight:700; color:#A33327; margin-top:8px;">День 90</div>
</p></div>
</p></div>
</p></div>
<p>    <!-- Таблица с тремя колонками --></p>
<table style="width:100%; border-collapse:collapse; table-layout:fixed;">
<tr>
<td style="width:33.33%; vertical-align:top; padding:16px 14px; background:#F3F4EF; border:1.5px solid #2E6B4F; border-radius:8px;">
<div style="font-size:13.5px; font-weight:700; color:#2E6B4F; margin-bottom:6px;">Месяц 1 · Видимость</div>
<div style="font-size:12px; color:#53645B; margin-bottom:12px;">Ничего не ломаем, только смотрим</div>
<div style="border-top:1px solid #C6D0C4; padding-top:12px; margin-bottom:12px;">
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Поставить диагноз (раздел 1)</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Собрать карту продукта</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Начать журнал решений</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Размечать баги по первопричине</div>
</p></div>
<div style="border-top:1px solid #C6D0C4; padding-top:12px;">
<div style="font-size:12px; font-weight:600; color:#22302A; margin-bottom:6px;">Результат месяца:</div>
<div style="font-size:12px; color:#53645B; line-height:1.5;">знаете, из чего состоит продукт и откуда берутся дефекты</div>
</p></div>
</td>
<td style="width:12px;"></td>
<td style="width:33.33%; vertical-align:top; padding:16px 14px; background:#F3F4EF; border:1.5px solid #2B4E6F; border-radius:8px;">
<div style="font-size:13.5px; font-weight:700; color:#2B4E6F; margin-bottom:6px;">Месяц 2 · Контур входа</div>
<div style="font-size:12px; color:#53645B; margin-bottom:12px;">Самая высокая отдача на вложение</div>
<div style="border-top:1px solid #C6D0C4; padding-top:12px; margin-bottom:12px;">
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Три вопроса на каждой задаче</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Example Mapping на сложных</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Первый RiskStorming на релиз</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Показ заказчику раз в 2–3 дня</div>
</p></div>
<div style="border-top:1px solid #C6D0C4; padding-top:12px;">
<div style="font-size:12px; font-weight:600; color:#22302A; margin-bottom:6px;">Результат месяца:</div>
<div style="font-size:12px; color:#53645B; line-height:1.5;">доля дефектов из-за требований падает вдвое</div>
</p></div>
</td>
<td style="width:12px;"></td>
<td style="width:33.33%; vertical-align:top; padding:16px 14px; background:#F3F4EF; border:1.5px solid #8A6A17; border-radius:8px;">
<div style="font-size:13.5px; font-weight:700; color:#8A6A17; margin-bottom:6px;">Месяц 3 · Форма и защита</div>
<div style="font-size:12px; color:#53645B; margin-bottom:12px;">Закрепляем и защищаем от отката</div>
<div style="border-top:1px solid #C6D0C4; padding-top:12px; margin-bottom:12px;">
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Перейти на чартеры и сессии</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Ввести протокол приёмки</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Фича-флаги на рискованное</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Автотесты на стабильное ядро</div>
</p></div>
<div style="border-top:1px solid #C6D0C4; padding-top:12px;">
<div style="font-size:12px; font-weight:600; color:#22302A; margin-bottom:6px;">Результат месяца:</div>
<div style="font-size:12px; color:#53645B; line-height:1.5;">решение о релизе принимается по документу, а не по ощущениям</div>
</p></div>
</td>
</tr>
</table>
<p>    <!-- Примечание --></p>
<div style="border-top:1px solid #C6D0C4; margin-top:20px; padding-top:14px; font-size:12.5px; color:#53645B; line-height:1.6;">
      Соблазн начать с третьего месяца велик — там всё выглядит солиднее. Но протокол приёмки без карты и реестра рисков превращается в бумажку.
    </div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Первые две недели не меняйте в процессе вообще ничего, только собирайте данные. Иначе через полгода вам нечем будет доказать, что стало лучше.</figcaption></figure>
<p><!-- /wp:html --></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 --></p>
<h2 class="wp-block-heading">Распространённые ошибки в QA без ТЗ</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Четыре ошибки, с которыми сталкиваются почти все. Предупрежден &#8212; значит вооружен. </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'>Отказ приступать к <a href="https://quality-lab.ru/blog/testirovanie-bez-trebovanij-orakuly-karta-produkta-i-risk-orientirovannoe-testirovanie/" data-type="post" data-id="31383">работе без ТЗ</a> </span>– после такой позиции вас перестают звать на ранние обсуждения.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Тест-кейсы на все подряд:</span> через два месяца их 300, актуальны 100, и все пятницы уходят на выяснение, какие именно действительно нужны. </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Автоматизация первым ходом</span> – на меняющемся продукте UI-автотесты дают обходится очень дорого при сомнительной пользе.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Баги на все, что не нравится:</span> без ТЗ граница между багом и сомнительным моментом, о котором просто не договорились &#8212; размыта. Спорное заводите вопросом в журнал решений.</li>
<p><!-- /wp:list-item --></ol>
<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'>Первая: </span>все описанное не заменяет <a href="https://quality-lab.ru/blog/the-purpose-of-test-documentation/" data-type="post" data-id="2945">документацию</a>. Если есть возможность иметь нормальные требования – это надежнее и дешевле. Речь о ситуации, где такой возможности нет, и встречается она чаще, чем принято признавать на конференциях и в профессиональной среде.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Вторая: </span>подход требует <a href="https://quality-lab.ru/outsourcing/" data-type="page" data-id="26">QA-инженеров высокого уровня</a>. Прогнать 200 тест-кейсов может человек после двухмесячных курсов. Провести сессию по чартеру, задать правильные вопросы на Example Mapping и понять, что мелочь на экране – это симптом крупной проблемы, может только человек с опытом и знанием предметной области. Если ваша стратегия – набирать джунов на поток и давать им сценарии, то эта методология не подойдет.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>И самое важное. Смена подхода здесь про переговорную позицию, а не про шаблоны. Пока тестировщики рассказывают, чего ему не хватает для работы, они находятся в роли жалобщиков. Как только они приносят документ со словами «вот на что мы опирались, вот что проверяли, вот что осталось за бортом, вот риски», то оказывается единственными в проекте, кто видит картину целиком. Отсутствие ТЗ этому не мешает. В некоторых случаях даже помогает.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#ddf3ed"}}} --></p>
<p class="has-background" style="background-color:#ddf3ed">Нужна помощь с тестированием, когда требований недостаточно? На бесплатной консультации разберем вашу ситуацию, определим основные риски и поможем определиться с первыми шагами к системному тестированию.</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:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>James Bach, <span class='font-weight-bold'><a href="https://www.satisfice.com/" rel="nofollow">Heuristic Test Strategy Model</a></span> – SFDIPOT и эвристики Rapid Software Testing. Michael Bolton, <span class='font-weight-bold'><a href="https://developsense.com/blog/2012/07/few-hiccupps" rel="nofollow">FEW HICCUPPS</a></span> – оракулы с разбором каждого.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Jonathan Bach, <span class='font-weight-bold'>Session-Based Test Management</span> (2000) — сессии, чартеры, метрики T/B/S. Matt Wynne, <span class='font-weight-bold'><a href="https://cucumber.io/blog/bdd/example-mapping-introduction/" rel="nofollow">Introducing Example Mapping</a></span>.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>ISO/IEC 25010:2023</span> – <a href="https://www.iso.org/standard/78176.html" rel="nofollow"><span class='font-weight-bold'>модель качества продукта</span></a>, в редакции 2023 года девять характеристик; годится как чек-лист забытых аспектов.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>]]></description>
<link>https://quality-lab.ru/blog/testirovanie-bez-trebovanij-kak-navesti-poryadok-v-qa-za-90-dnej/</link>
<pubDate>Tue, 13 Oct 2026 17:36:59 +0300</pubDate>
</item>
<item>
<title>Эксперты?</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/experts.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/experts.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Майкл Болтон (Michael Bolton)<br /><strong><a href="https://developsense.com/blog/2025/07/experts" mce_href="https://developsense.com/blog/2025/07/experts" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p>
<p>В пространстве Rapid Software Testing критическое мышление — это <em>мышление о мышлении с целью не быть обманутыми</em>. У нас есть простая мнемоника, которая запускает критическое мышление: WHeReAS. Задавайте вопросы: Кто? А? Правда? И что? И что с того?</p>
<p>Долгое время в нашем списке вопросов были только последние четыре пункта. Оценка наблюдения или утверждения зависит от того, убедились ли мы, что поняли утверждение или идею, которую рассматриваем. Это «А?». «Правда?» — о достоверности утверждений. «И что?» побуждает подумать о том, что могло быть упущено. А «И что с того?» — о последствиях и о том, стоит ли предпринимать какие-то действия.</p>
<p>Некоторое время назад один из наших коллег указал на то, чего не хватало в этой небольшой модели: социального измерения. Избежание ошибок в мышлении зависит от мотивов, экспертизы и надёжности людей, которые эти утверждения озвучивают. Поэтому мы добавили «Кто?». Кто говорит?</p>]]></description>
<link>https://www.software-testing.ru/library/around-testing/job/4509-experts</link>
<pubDate>Mon, 12 Oct 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Про неочевидные аспекты менторства</title>
<description><![CDATA[<p>Часть 1 &#8212; <a href="https://testitquickly.com/2026/10/03/cauta-ti-mentorul-singurel/">Про древнегреков</a></p>
<p>Итак, на стыке 17-го и 18-го века время было очень неприятное, Европа была истощена постоянными войнами «всех со всеми», продолжающимися локальными чумными эпидемиями, которые в те времена никто не мог лечить, знать жила в долгах, бедняки в обносках, монахи во грехе чревоугодия.</p>
<div id="attachment_37157" style="width: 785px" class="wp-caption aligncenter"><a href="https://testitquickly.com/wp-content/uploads/2026/10/Fenelon.jpg"><img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-37157" class="size-full wp-image-37157" src="https://testitquickly.com/wp-content/uploads/2026/10/Fenelon.jpg" alt="Франсуа Фенелон готов дидактировать напропалую" width="775" height="946" srcset="https://testitquickly.com/wp-content/uploads/2026/10/Fenelon.jpg 775w, https://testitquickly.com/wp-content/uploads/2026/10/Fenelon-246x300.jpg 246w, https://testitquickly.com/wp-content/uploads/2026/10/Fenelon-768x937.jpg 768w, https://testitquickly.com/wp-content/uploads/2026/10/Fenelon-660x806.jpg 660w" sizes="(max-width: 775px) 100vw, 775px" /></a><p id="caption-attachment-37157" class="wp-caption-text">Он был готов дидактировать напропалую</p></div>
<p>Внезапно в 1699-м году французский писатель <a href="https://ru.wikipedia.org/wiki/%D0%A4%D0%B5%D0%BD%D0%B5%D0%BB%D0%BE%D0%BD,_%D0%A4%D1%80%D0%B0%D0%BD%D1%81%D1%83%D0%B0_%D0%B4%D0%B5_%D0%A1%D0%B0%D0%BB%D0%B8%D0%BD%D1%8C%D1%8F%D0%BA">Франсуа Фенелон</a> создал на основе уже подзабытых древних текстов Гомера новый, продвинутый (проапгрейженный же!) литературный образ Ментора, который всячески воспитывает сына своего друга в наилучших традициях благородного, книжного рыцарства в сеттинге приключений в «прекрасной античности прошлого». Он не просто вещает дидактическую идеологию, а ещё и всячески довлеет своим поведением — то берёт меч и встаёт во главе чужой армии, то попадает в рабство и благородно не убегает, выполняя волю своего новоявленного хозяина, то ещё что-то.</p>
<p style="padding-left: 40px;">Не все знают, что к 12-му веку рыцарство оформилось в отдельную социальную группу, а к 14-му веку над ними уже смеялись все собаки, потому что придуманные «рыцарские правила» не стыковались ни с их образом, ни с их поведением (вооруженные гопники), ни с окружающей всех нас реальностью. На исходе 17-го века рыцари рыцари как самостоятельная военная сила практически исчезают, потому что артиллерия, регулярные армии, увядание феодальной экономики.</p>
<p style="padding-left: 40px;">Но мы и сегодня знаем о том, что «ради прекрасной дамы рыцарь должен…»</p>
<p>Книга стала топчиком на два века вперед, и постепенно образ романтичного <del>мастера</del> Ментора, сверх-благородного отца и рыцаря, словно сошедшего к нам из XII века, чтобы взять на себя все наши грехи, упрощался и мифологизировался. Уже забыты и сам Фенелон, и первозначение имён, а образ персонажа превратился в общее обозначение род занятий — мудрый раздаватель мудрых советов.</p>
<p>Проблема в том, что это всё — полная ерунда, которая воображается через набор устойчивых иллюзий, мол:</p>
<ul>
<li>ментор — это опытный наставник, который уже «…достиг успеха и может им поделиться», он знает путь к успешному успеху, он подскажет куда идти, он научит, он в беде не бросит,</li>
<li>и он даст тебе преимущество в конкуренции за блага всего сего мира,</li>
<li>и с ним не придётся познавать всё на своей шкуре, ведь ментор будет советовать «…вот из этой книги прочитай семь страниц, всё остальное не читай, оно лишнее…» — а это преимущество в конкуренции всех со всеми,</li>
<li>и это не опостылевший учитель, и не репетитор по отдельным предметам, и не назойливый коуч (coach, тренер), и не дорогостоящий консультант (знает рабочий алгоритм решения объявленной проблемы), он всего лишь даёт советы и рекомендации, а советы советовать — не мешки таскать,</li>
<li>и поэтому платить за менторство не нужно. Или нужно, но немного, да и только если он «доведёт до трудоустройства».</li>
</ul>
<p>Кагбэ да, но нет.</p>
<p>Менторов книжного образца не существует. Увы. И даже не каждый отец справляется с такой ролью.</p>
<p>Ментор не может просто «мудро» посоветовать джуну какой-нибудь верный путь к успеху — нет такого пути. Советы есть, пути — нет.</p>
<p>Никто не может посоветовать что-то умное и сразу отойти, чтобы не мешать. Люди не браузеры и не AI, которые можно вызывать при необходимости и отключать за ненадобностью.</p>
<p>Нет никакой ценности в действительно <em>простых</em> советах, потому что без вовлеченности в тугу-печаль воспитанника все эти разговоры теряют всякий факинговый смысл. Хочем примеров?</p>
<p style="padding-left: 40px;">— Я боюсь, что не найду работу.<br />
— Не бойся. Продолжай искать.</p>
<p>— У меня не получается освоить программирование…<br />
— Начни с основ. Сделай что-нибудь, чтобы получилось.</p>
<p>— Я учился на курсах, и я совершенно не понял, что такое тест-дизайн и зачем это всё нужно.<br />
— Прочитай любой учебник про тестирование, который попадется на глаза. Разберись.</p>
<p>Это не совсем просьбы просто что-то посоветовать. Это запросы на разбор проблемы, и в поисках решения на раз-два выясняется, что в тёмной глубине разума ой мама родная какие демоны могут прятаться и какие причины могут выясниться… А играть в психоаналитика принципиально нельзя, харам, табу, гунда!</p>
<p style="padding-left: 40px;">«Не советую, гражданин… мнэ-э… не советую. Съедят».</p>
<p>С другой стороны, <em>сложные</em> советы сами по себе тоже не работают, потому что а) они не существуют сами по себе, б) появляются только после глубокого погружения в чужой контекст и в) не факт, что они будут понятны ученику. Надо вникать в то, что делал новичок с самого начала, чтобы понять, почему он боится, почему не получается, что именно он уже узнавал и не понял, или понял, но не так, как надо.</p>
<p>А если и разобраться, то что делать дальше? Утешать джуна и уверять, что его отношения с родителями в детстве не имеют отношения к его сегодняшним проблемам с тест-дизайном и менджерами проектов? Шаткая плаха психоанализа ждёт вас, товарищ ментор.</p>
<p>Или отстранённо покивать и посоветовать не унывать и что-то прочитать про тест-дизайн… но что именно? <del>Гомера</del> Канера?! Многие уже не читают книги, а предпочитают короткие, минутные видео, но такие видео всего лишь дадут ощущение «а, понятно». Да и если читать книги, то надо проверять, что было прочитано и как оно было понято.</p>
<p style="padding-left: 40px;">«На этой неделе я прочитала всего Канера. Что именно — ну, вот это я пропустила, потому что уже знаю. Это тоже знаю. Это мне не нужно. Это тоже непонятно что. А вот эти три главы прочитала, но там ничего не понятно, зачем вообще такие книги нужны?!»</p>
<p style="padding-left: 40px;">Ой, как вспомню…</p>
<p>По каким-то темам я уже не знаю, какие книги можно рекомендовать. Какие-то вещи в теории тестирования мне проще самому объяснять, потому что это концепции, абстрактные, их нет в нашем быту, и я реально не знаю, какие книги про них рассказывают так, чтобы было понятно. Какие-то концепции уже я сам сформулировал, их просто нет в книгах. А это всё уже <span style="--darkreader-inline-color: var(--darkreader-text-008000, #65eb65);">роль учителя</span>, добро пожаловать за парту, советовать тут нечего, тут учить надо, даже если это всё очень нудно.</p>
<p>Далее. Если составить джуну план действий или milestones, которые ему надо пройти, то этот путь надо отслеживать, отсюда — роль куратора, тьютора, супервизора, научного руководителя, но никак не ментора, который мудро советует нужное и мудро не советует ненужное.</p>
<p>А ещё какие-то аспекты поведения джуна надо корректировать через подсказки, указания и запреты — это роль тренера.</p>
<p style="padding-left: 40px;">Например, кто бы знал, что современные тестировщики боятся заходить в настройки операционной системы…</p>
<p style="padding-left: 40px;">А надо!</p>
<p>Решение каких-то технических проблем на стороне воспитанника возможна только после детального погружения в контекст, а это — роль технического консультанта, и не каждый «ментор» захочет это делать в принципе, даже за деньги. Восторженный джун очень быстро переходит от «<em>Я не знаю, как продвинуться по карьере…</em>» к «<em>Помоги мне автоматизировать получение логов из Kibana, там ещё Elasticsearch надо настроить, ну ты же умеешь…</em>», а ментор смотрит на это всё и пытается понять, в какой момент мы перешли от обсуждения карьеры к настройке твоего рабочего окружения…</p>
<p>И после этого всего есть ещё совершенно неочевидные аспекты в менторстве — ментор не обязательно должен разбираться в твоей теме. Неожиданно, да?!</p>
<p>И ментор в принципе не отвечает за результат стараний ученика. Вообще. И уж тем более не должен давать кому-то какое-либо преимущество. И вообще не факт, что ментор кого-то «доведёт до трудоустройства». Иногда стороны доводят друг друга до нервного срыва и взаимных проклятий.</p>
<p>Ментор — необязательно премудрый старец. Иногда джун джуну лучший ментор, и там вообще нет параметра «…уже достиг успеха и может им поделиться». Один чёрт придётся всё познавать на своей шкуре. Иногда просто объяснить взрослому менеджеру проектов, почему невозможно раз и навсегда автоматизировать тестирование на условном проекте и таким образом уменьшить расходы по этой статье — тоже менторинг, и внезапно — от младшего к старшему. Седовласая борода вообще нигде не показатель.</p>
<p>И что ментор нужен не всегда для продвижения в профессии. Иногда просто нужен кто-то, кто выслушает и поймёт, а не начнёт советы советовать. Ну или выслушает и скажет очевидное, мол, перестань стрелять себе в ногу. Ну ок.</p>
<p>А ещё менторы иногда назначаются насильно, и это иногда очень эффективно, а иногда абсолютно лишний головняк…</p>
<p>А ещё каждому ментору, даже если он уже, ээ, старец, тоже периодически нужен наставник.</p>
<p>А ещё платить за менторство обязательно надо, но не деньгами, а отношением, потому что так устроено социальное взаимодействие.</p>
<p>Далее рассмотрим, чем конкретно ментор отличается от учителя. Это важно понимать, а не просто знать.</p>]]></description>
<link>https://testitquickly.com/2026/10/12/bate-capul-de-perete-asistat-profesional/</link>
<pubDate>Mon, 12 Oct 2026 00:54:37 +0300</pubDate>
</item>
<item>
<title>QA-практики, которые работают даже на проектах без четких требований и ТЗ</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p>Это уже вторая часть цикла про тестирование без требований. Простым и понятным языком объясняем, как проверит то, что не до конца понимаешь. Напомним, в <a href="https://quality-lab.ru/blog/testirovanie-bez-trebovanij-orakuly-karta-produkta-i-risk-orientirovannoe-testirovanie/" data-type="post" data-id="31383">первой статье</a> вы могли узнать, чем заменить ТЗ, как использовать оракулы, зачем составлять карту продукта и как выявлять зоны риска.&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":31418,"width":"228px","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="437" height="424" src="https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-bez-TZ.png" alt="testirovanie-bez-TZ" class="wp-image-31418" style="width:228px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-bez-TZ.png 437w, https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-bez-TZ-300x291.png 300w" sizes="(max-width: 437px) 100vw, 437px" /></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 --></p>
<p>В статье мы делимся практиками, которые помогают справляться с самыми острыми проблемами. Рассказываем, как оперативно фиксировать требования, отслеживать прогресс без громоздкой документации и уберечь команду от лишних переделок. Покажем, как применять <span class='font-weight-bold'>Example Mapping</span> для быстрой фиксации правил, <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: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">Example Mapping: как за 25 минут вытащить скрытые правила и вопросы</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Example Mapping – простая и очень полезная техника: всего 25 минут работы, четыре цвета карточек – и сразу видно, чего не хватает в задаче. Это метод Мэтта Уинна из команды <a href="https://cucumber.io/blog/bdd/example-mapping-introduction/" rel="nofollow">Cucumber</a>. Мы в компании его активно используем: четверть часа на старте здорово экономит время потом.</p>
<p><!-- /wp:paragraph --></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: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> – правило работы функции. Например: «скидка не суммируется с промокодом». Обычно таких правил получается 3–7 штук, и нередко половину из них до этой встречи вообще никто вслух не формулировал.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Зеленая</span> – конкретный пример с цифрами. Например: «корзина 5000 ₽, промокод SALE20, статус „серебро“, итог 4000 ₽». Такой пример сразу становится готовым сценарием для теста.</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:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":31419,"width":"305px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/10/kak-testirovat-esli-net-trebovaniy.png" alt="kak-testirovat-esli-net-trebovaniy" class="wp-image-31419" style="width:305px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/kak-testirovat-esli-net-trebovaniy.png 512w, https://quality-lab.ru/wp-content/uploads/2026/10/kak-testirovat-esli-net-trebovaniy-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/10/kak-testirovat-esli-net-trebovaniy-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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 --></p>
<p>По нашим данным, на типичную задачу выходит 4–6 правил, 8–12 примеров и 2–4 вопроса. И примерно каждый третий из этих вопросов – как раз тот, который иначе всплыл бы уже на демонстрации и обернулся бы серьезной переделкой.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#ece7d9"}}} --></p>
<p class="has-background" style="background-color:#ece7d9"><span class='font-weight-bold'>Из практики: </span>была задача по логистике – пересчитывать стоимость доставки при изменении состава заказа. Казалось, хватит 2 дней. Но на сессии Example Mapping всего за 20 минут выявили 7 непроясненных моментов: заказ уже собран на складе, новая цена ниже предоплаченной, сменился тарифный пояс, клиент – юрлицо с постоплатой. В итоге оценку скорректировали до 9 дней. Это помогло не сорвать сроки: нужное время сразу заложили в план, а не столкнулись с нехваткой времени в конце спринта.</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:preformatted --></p>
<pre class="wp-block-preformatted">Практику проверки на неоднозначность описала Элизабет Хендриксон в <a href="https://archive.org/details/exploreitreducer0000hend" rel="nofollow">книге</a> «Explore It!». В описании задачи часто прячутся непринятые решения – их можно заметить по определенным словам. Мы держим список таких слов на виду и быстро проверяем каждую задачу перед стартом – хватает 30 секунд. И вам советуем.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":31421,"width":"284px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/10/processy-testirovaniya-bez-dokumentacii.png" alt="processy-testirovaniya-bez-dokumentacii" class="wp-image-31421" style="width:284px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/processy-testirovaniya-bez-dokumentacii.png 512w, https://quality-lab.ru/wp-content/uploads/2026/10/processy-testirovaniya-bez-dokumentacii-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/10/processy-testirovaniya-bez-dokumentacii-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:html --></p>
<figure style="max-width:1000px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<table style="width:100%; min-width:700px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Слова-детекторы: что переспросить прежде, чем начинать</caption>
<thead>
<tr>
<th style="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; white-space:nowrap; width:26%;">Формулировка в задаче</th>
<th style="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; white-space:nowrap; width:37%;">Что за ней прячется</th>
<th style="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; white-space:nowrap; width:37%;">Вопрос, который вы задаёте</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">«Корректно обрабатывать»</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Никто не решил, что считать корректным</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Два примера: корректный и некорректный. Что видит пользователь во втором случае?</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">«Быстро», «без задержек»</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Нет числа, а значит, нет критерия приёмки</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Сколько секунд приемлемо, а сколько уже жалоба? При какой нагрузке?</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">«Все пользователи»</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Забыли про роли, права, неавторизованных, ботов</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Администратор тоже? А заблокированный? А по прямой ссылке без входа?</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">«Просто добавить поле»</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Слово «просто» почти всегда маркер невидимых связей</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Куда это поле попадёт дальше: в отчёты, выгрузки, поиск, историю, интеграции?</td>
</tr>
<tr>
<td style="padding:14px; color:#1f2937; vertical-align:top; font-weight:700;">«Пока без этого»</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Отложенное решение, которое забудут</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Что произойдёт, если пользователь всё-таки это сделает? Запрещаем или падаем?</td>
</tr>
</tbody>
</table></div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Список открытый, дополняйте своими. На проекте с госзаказчиком у нас отдельным пунктом идёт «в соответствии с действующим законодательством»: за этой фразой обычно не стоит ни одной прочитанной нормы.</figcaption></figure>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Правило 15 минут!&nbsp;</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#ece7d9"}}} --></p>
<p class="has-background" style="background-color:#ece7d9"><span class='font-weight-bold'>Если не понял требование – не гадай. Дай себе 15 минут, чтобы разобраться самому.</span> Если ответа нет – сразу иди спрашивать. Звучит банально, но правило постоянно нарушают. Тестировщику бывает неловко задавать вопросы, и он строит свою гипотезу. Потом заводит по ней баг, а разработчик закрывает его как by design. В итоге обе стороны теряют по полдня. Неловкость уходит, если правило закреплено официально: у нас оно прямо прописано в договоренностях.</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://quality-lab.ru/blog/test-kejsy-bez-oshibok-struktura-pravila/" data-type="post" data-id="25670">Тест‑кейс</a> плохо справляется с изменениями: он фиксирует конкретные шаги для конкретного поведения системы. Стоит поведению поменяться – и кейс становится бесполезным. В проектах, где продукт обновляется каждую неделю, на поддержку тест‑кейсов уходит больше времени, чем на само тестирование. Знакомая ситуация: есть 180 кейсов, из них реально работают примерно 70, но никто точно не знает, какие именно.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Альтернативу предложил Джонатан Бах еще в 2000 году – это <a href="https://www.satisfice.us/articles/sbtm.pdf" rel="nofollow">Session‑Based Test Management</a>. Здесь основная единица работы – сессия: отрезок времени с четкой целью и отчетом по итогам.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<figure style="max-width:1000px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="background:#ffffff; border:1px solid #e5eaf2; border-radius:16px; padding:24px 28px 28px; box-shadow:0 4px 20px rgba(0,0,0,0.06);">
<div style="font-size:17px; font-weight:600; color:#22302A; margin-bottom:6px;">Анатомия сессии: 90 минут, которые можно предъявить</div>
<div style="font-size:13.5px; color:#53645B; margin-bottom:22px;">Тайм-бокс не про дисциплину, а про то, чтобы работу можно было планировать и оценивать</div>
<p>    <!-- Таймлайн --></p>
<div style="margin-bottom:14px;">
<p>      <!-- Блоки сессии --></p>
<div style="display:flex; align-items:stretch; border-radius:6px; overflow:hidden; font-size:12px; height:80px;">
<div style="flex:0 0 8%; background:#2B4E6F; color:#fff; padding:12px 10px; box-sizing:border-box; display:flex; flex-direction:column; justify-content:center;">
<div style="font-weight:600; margin-bottom:4px;">Чартер</div>
<div style="font-size:11px; color:#D6E3EE;">5 мин</div>
</p></div>
<div style="flex:0 0 18%; background:#E3EAE1; border-top:1px solid #2B4E6F; border-bottom:1px solid #2B4E6F; color:#22302A; padding:12px 12px; box-sizing:border-box; display:flex; flex-direction:column; justify-content:center;">
<div style="font-weight:600; margin-bottom:4px;">Подготовка</div>
<div style="font-size:11px; color:#53645B;">15 мин · данные, доступы</div>
</p></div>
<div style="flex:1; background:#2B4E6F; color:#fff; padding:12px 14px; box-sizing:border-box; display:flex; flex-direction:column; justify-content:center;">
<div style="font-weight:600; margin-bottom:4px;">Исследование по цели</div>
<div style="font-size:11px; color:#D6E3EE;">55 мин · сюда же уходят находки не по теме</div>
</p></div>
<div style="flex:0 0 14%; background:#E3EAE1; border-top:1px solid #2B4E6F; border-bottom:1px solid #2B4E6F; color:#22302A; padding:12px 12px; box-sizing:border-box; display:flex; flex-direction:column; justify-content:center;">
<div style="font-weight:600; margin-bottom:4px;">Оформление</div>
<div style="font-size:11px; color:#53645B;">15 мин · баги</div>
</p></div>
<div style="flex:0 0 8%; background:#22302A; color:#fff; padding:12px 10px; box-sizing:border-box; display:flex; flex-direction:column; justify-content:center;">
<div style="font-weight:600; margin-bottom:4px;">Разбор</div>
<div style="font-size:11px; color:#B9CCC1;">5 мин</div>
</p></div>
</p></div>
<p>      <!-- Шкала времени --></p>
<div style="position:relative; height:24px; margin-top:6px; border-top:1px solid #C6D0C4;">
<div style="position:absolute; left:0; top:5px; font-size:11.5px; color:#53645B;">0</div>
<div style="position:absolute; left:26%; top:5px; font-size:11.5px; color:#53645B;">20 мин</div>
<div style="position:absolute; left:78%; top:5px; font-size:11.5px; color:#53645B;">75 мин</div>
<div style="position:absolute; right:0; top:5px; font-size:11.5px; color:#53645B;">90 мин</div>
</p></div>
</p></div>
<p>    <!-- Три карточки метрик --></p>
<div style="display:flex; gap:14px; flex-wrap:wrap; margin-top:20px;">
<div style="flex:1 1 260px; background:#F3F4EF; border:1px solid #C6D0C4; border-radius:8px; padding:18px 20px;">
<div style="font-size:13px; font-weight:700; color:#2B4E6F; margin-bottom:14px;">Что попадает в отчёт</div>
<div style="font-size:12px; color:#22302A; line-height:1.7;">— что исследовали и чем</div>
<div style="font-size:12px; color:#22302A; line-height:1.7;">— что нашли</div>
<div style="font-size:12px; color:#22302A; line-height:1.7;">— что осталось непроверенным</div>
<div style="font-size:12px; color:#A33327; line-height:1.7;">— какие вопросы открылись</div>
</p></div>
<div style="flex:1 1 260px; background:#F3F4EF; border:1px solid #C6D0C4; border-radius:8px; padding:18px 20px;">
<div style="font-size:13px; font-weight:700; color:#2B4E6F; margin-bottom:14px;">Разбивка времени</div>
<div style="font-size:12px; color:#22302A; line-height:1.6; margin-bottom:8px;">Тест / Баг / Подготовка</div>
<div style="font-size:12px; color:#22302A; line-height:1.6; margin-bottom:10px;">Норма: 60 / 25 / 15</div>
<div style="font-size:11.5px; color:#53645B; line-height:1.55;">Подготовка выше 30% — чините стенды, а не людей</div>
</p></div>
<div style="flex:1 1 260px; background:#F3F4EF; border:1px solid #C6D0C4; border-radius:8px; padding:18px 20px;">
<div style="font-size:13px; font-weight:700; color:#2B4E6F; margin-bottom:14px;">По теме / не по теме</div>
<div style="font-size:12px; color:#22302A; line-height:1.6; margin-bottom:8px;">Доля времени вне цели сессии.</div>
<div style="font-size:12px; color:#22302A; line-height:1.6; margin-bottom:10px;">Стабильно выше 40% — значит, чартеры сформулированы плохо</div>
<div style="font-size:11.5px; color:#53645B; line-height:1.55;">либо продукт горит целиком</div>
</p></div>
</p></div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Метрики T/B/S (test, bug, setup) и on-charter/off-charter — из оригинальной методики SBTM. Это не отчётность ради отчётности: по ним видно, что мешает команде работать.</figcaption></figure>
<p><!-- /wp:html --></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> По сути, это ответ на три вопроса: что исследуем, с помощью чего и что хотим найти. Хороший чартер отличается от слабого тем, что в нем есть гипотеза – предположение, где может быть ошибка.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="max-width:820px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<p>  <!-- Блок с примерами чартеров --></p>
<div style="background:#0d1117; border:1px solid #30363d; border-radius:16px; padding:20px 24px 18px; box-shadow:0 4px 20px rgba(0,0,0,0.3); overflow-x:auto; margin-bottom:12px;">
<pre style="margin:0; padding:0; font-family:'JetBrains Mono','Cascadia Code','Fira Code','Consolas',monospace; font-size:14px; line-height:1.5; color:#e6edf3; white-space:pre-wrap; word-break:normal; background:transparent; border:none; border-radius:0;"><span style="color:#8b949e; font-style:italic;"># Плохие чартеры (так делали мы первые полгода)</span>
Протестировать корзину                    <span style="color:#8b949e; font-style:italic;">← это не цель, это область</span>
Проверить, что всё работает               <span style="color:#8b949e; font-style:italic;">← непроверяемо</span>
Регресс личного кабинета                  <span style="color:#8b949e; font-style:italic;">← на 8 часов? на 3 дня?</span>

<span style="color:#8b949e; font-style:italic;"># Рабочие чартеры</span>
Исследовать <span style="color:#7ee787; font-weight:600;">пересчёт корзины</span> при <span style="color:#7ee787; font-weight:600;">изменении из двух вкладок сразу</span>,
  чтобы найти <span style="color:#7ee787; font-weight:600;">рассинхрон итоговой суммы и состава</span>

Исследовать <span style="color:#7ee787; font-weight:600;">оформление заказа</span> при <span style="color:#7ee787; font-weight:600;">медленном ответе шлюза</span>
  (задержка 3–10 с), чтобы найти <span style="color:#7ee787; font-weight:600;">двойные списания</span></pre>
</p></div>
<p>  <!-- Подпись под блоком --></p>
<div style="font-size:14px; color:#6b7280; text-align:center; margin-bottom:24px; font-style:italic; line-height:1.5;">Чартер без гипотезы превращается в бесцельное хождение по экранам: время потрачено, сказать по итогам нечего.</div>
<p>  <!-- Параграф --></p>
<p style="font-size:15px; line-height:1.7; color:#374151; margin:0;">Берутся чартеры из реестра рисков: каждый риск верхних квадрантов превращается в один-два. Цепочка получается прозрачная и объяснимая заказчику: <strong style="color:#1f2937;">риск → чартер → сессия → отчёт → строка в протоколе приёмки</strong>. При этом кейсы никуда не деваются — здоровая пропорция на проекте без ТЗ примерно такая: 15–25% работы в жёстких проверках критичных потоков, остальное сессии.</p>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Чартеры берут из реестра рисков: каждый значимый риск превращается в один‑два чартера. Цепочка получается понятной и прозрачной для заказчика: от риска – к чартеру, от чартера – к сессии, потом – к отчету и строке в протоколе приемки.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>При этом тест‑кейсы остаются в работе. На проекте без ТЗ разумно держать такую пропорцию: 15–25% усилий – на жесткие проверки <a href="https://quality-lab.ru/blog/kak-prioritizaciya-problem-v-testirovanii-pomogaet-sekonomit-resursy-i-uluchshit-produkt/" data-type="post" data-id="24856">самых критичных потоков</a>, остальное – на исследовательские сессии.</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:html --></p>
<figure style="max-width:1050px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<table style="width:100%; min-width:850px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Иерархия артефактов: что писать в зависимости от скорости изменений</caption>
<thead>
<tr>
<th style="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; white-space:nowrap; width:19%;">Артефакт</th>
<th style="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; white-space:nowrap; width:15%;">Поддержка</th>
<th style="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; width:33%;">Когда оправдан</th>
<th style="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; width:33%;">Когда вреден</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Карта продукта</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; vertical-align:top; white-space:nowrap;"><span style="display:inline-block; background:#dcfce7; color:#166534; font-size:11px; font-weight:600; padding:2px 10px; border-radius:20px; text-transform:uppercase; letter-spacing:0.03em;">низкая</span></td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Всегда. Первое, что делаете на проекте, и последнее, от чего откажетесь</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Не бывает. Разве что вы описали в ней поведение вместо состава</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Реестр рисков</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; vertical-align:top; white-space:nowrap;"><span style="display:inline-block; background:#dcfce7; color:#166534; font-size:11px; font-weight:600; padding:2px 10px; border-radius:20px; text-transform:uppercase; letter-spacing:0.03em;">низкая</span></td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Всегда. Обновляется раз в релиз за час</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Когда разрастается до сорока пунктов и перестаёт читаться</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Чартеры сессий</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; vertical-align:top; white-space:nowrap;"><span style="display:inline-block; background:#dcfce7; color:#166534; font-size:11px; font-weight:600; padding:2px 10px; border-radius:20px; text-transform:uppercase; letter-spacing:0.03em;">низкая</span></td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Всё, что меняется чаще раза в месяц. Основной рабочий инструмент</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Когда нужна воспроизводимость шаг-в-шаг для аудитора</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Тест-кейсы</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; vertical-align:top; white-space:nowrap;"><span style="display:inline-block; background:#fce4ec; color:#9a1f3c; font-size:11px; font-weight:600; padding:2px 10px; border-radius:20px; text-transform:uppercase; letter-spacing:0.03em;">высокая</span></td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Деньги, права доступа, юридически значимые операции, сложные расчёты</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">На всё подряд. Особенно на UI новой фичи в первые два месяца жизни</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Автотесты API</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; vertical-align:top; white-space:nowrap;"><span style="display:inline-block; background:#fef3c7; color:#92400e; font-size:11px; font-weight:600; padding:2px 10px; border-radius:20px; text-transform:uppercase; letter-spacing:0.03em;">средняя</span></td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Контракты между сервисами: меняются раз в пять реже интерфейса</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Пока API проектируется и меняется по три раза в неделю</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Автотесты UI</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; vertical-align:top; white-space:nowrap;"><span style="display:inline-block; background:#fce4ec; color:#9a1f3c; font-size:11px; font-weight:600; padding:2px 10px; border-radius:20px; text-transform:uppercase; letter-spacing:0.03em;">высокая</span></td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Два-три ключевых сквозных сценария, не больше</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Как основная стратегия на меняющемся продукте — самая дорогая ошибка из списка</td>
</tr>
<tr>
<td style="padding:14px; color:#1f2937; vertical-align:top; font-weight:700;">Характеризующие тесты</td>
<td style="padding:14px; vertical-align:top; white-space:nowrap;"><span style="display:inline-block; background:#dcfce7; color:#166534; font-size:11px; font-weight:600; padding:2px 10px; border-radius:20px; text-transform:uppercase; letter-spacing:0.03em;">низкая</span></td>
<td style="padding:14px; color:#374151; vertical-align:top;">Легаси без документации: фиксируем как есть, ловим незаметные изменения</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Когда систему как раз собираются переписывать по-новому</td>
</tr>
</tbody>
</table></div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Если времени в обрез, порядок такой: карта, риски, чартеры. Остальное — когда устоится предметная область.</figcaption></figure>
<p><!-- /wp:html --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Отдельно про легаси: характеризующие тесты</h3>
<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":31422,"width":"318px","height":"auto","sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-bez-dokumentacii.png" alt="testirovanie-bez-dokumentacii" class="wp-image-31422" style="width:318px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-bez-dokumentacii.png 512w, https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-bez-dokumentacii-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/10/testirovanie-bez-dokumentacii-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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://www.labirint.ru/books/231685/" rel="nofollow">книги</a> «Эффективная работа с унаследованным кодом». Смысл в том, чтобы зафиксировать, как система работает в моменте, – так проще будет заметить, если поведение незаметно изменится в будущем.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Берем тысячу обезличенных запросов с продакшена, прогоняем через текущую версию и сохраняем ответы как эталон. Потом с каждой правкой кода снова прогоняем ту же тысячу. Если есть расхождение – значит, либо баг, либо осознанная правка. В любом случае вы узнаете об этом до релиза, а не от клиента. Это подход из семейства <a href="https://approvaltests.com/" rel="nofollow">approval testing</a>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Для интеграций есть похожий вариант – <a href="https://pact.io/" rel="nofollow">контрактное тестирование</a>. Если сервисов много, а описания их взаимодействия нет, контракты собирают из реального трафика – и дальше они работают как техзадание на стыках. Так мы в своей практике восстанавливали правила взаимодействия там, где все описание хранилось в одном чате разработчиков – еще с 2021 года.</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":"#ece7d9"}}} --></p>
<p class="has-background" style="background-color:#ece7d9">Работали с системой расчета комиссий. Представьте восемь лет разработки, три поколения авторов, а документации нет совсем. Задача стояла простая: добавить новый тип комиссии и ничего не сломать. При этом в компании никто не мог даже перечислить существующие типы. Взяли выгрузку за квартал – 240 000 расчетов, – прогнали через текущую версию и сохранили как эталон. При первой же правке всплыло расхождение в 1,8% случаев: оказалось, пересекались старая акция и округление вниз. Ошибка жила в проде четыре года и стоила 3,2 млн рублей недоплаченных комиссий. Нашли ее не люди, а простое сравнение системы с самой собой.</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:html --></p>
<figure style="max-width:1000px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="background:#ffffff; border:1px solid #e5eaf2; border-radius:16px; padding:24px 28px 28px; box-shadow:0 4px 20px rgba(0,0,0,0.06);">
<div style="font-size:17px; font-weight:600; color:#22302A; margin-bottom:22px;">Три контура приёмки: чем раньше поймали, тем дешевле</div>
<p>    <!-- Три карточки контуров --></p>
<div style="display:flex; gap:14px; flex-wrap:wrap; margin-bottom:24px;">
<p>      <!-- Контур 1 --></p>
<div style="flex:1 1 240px; min-width:0; background:#F3F4EF; border:2px solid #2E6B4F; border-radius:8px; overflow:hidden;">
<div style="background:#2E6B4F; color:#fff; padding:12px 16px; font-size:14px; font-weight:700;">Контур 1 · На входе</div>
<div style="padding:16px 18px;">
<div style="font-size:12.5px; font-weight:600; color:#22302A; margin-bottom:4px;">Частота: каждая задача</div>
<div style="font-size:12.5px; color:#53645B; margin-bottom:14px;">Занимает: 20–30 минут</div>
<div style="border-top:1px solid #C6D0C4; padding-top:14px; margin-bottom:14px;">
<div style="font-size:12.5px; color:#22302A; line-height:1.6;">Example Mapping на задачу</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.6;">Прогон по словам-детекторам</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.6;">Три вопроса готовности</div>
</p></div>
<div style="border-top:1px solid #C6D0C4; padding-top:14px;">
<div style="font-size:12.5px; font-weight:600; color:#2E6B4F; margin-bottom:6px;">Что ловим:</div>
<div style="font-size:12px; color:#22302A; line-height:1.6;">непринятые решения, противоречия, забытые роли</div>
<div style="font-size:12px; font-style:italic; color:#53645B; margin-top:10px;">Цена исправления: 1×</div>
</p></div>
</p></div>
</p></div>
<p>      <!-- Контур 2 --></p>
<div style="flex:1 1 240px; min-width:0; background:#F3F4EF; border:2px solid #2B4E6F; border-radius:8px; overflow:hidden;">
<div style="background:#2B4E6F; color:#fff; padding:12px 16px; font-size:14px; font-weight:700;">Контур 2 · По ходу</div>
<div style="padding:16px 18px;">
<div style="font-size:12.5px; font-weight:600; color:#22302A; margin-bottom:4px;">Частота: каждые 2–3 дня</div>
<div style="font-size:12.5px; color:#53645B; margin-bottom:14px;">Занимает: 15 минут</div>
<div style="border-top:1px solid #C6D0C4; padding-top:14px; margin-bottom:14px;">
<div style="font-size:12.5px; color:#22302A; line-height:1.6;">Показ куска на живом стенде</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.6;">Заказчик кликает сам</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.6;">Решения — сразу в журнал</div>
</p></div>
<div style="border-top:1px solid #C6D0C4; padding-top:14px;">
<div style="font-size:12.5px; font-weight:600; color:#2B4E6F; margin-bottom:6px;">Что ловим:</div>
<div style="font-size:12px; color:#22302A; line-height:1.6;">расхождение картинки в голове заказчика и того, что вышло</div>
<div style="font-size:12px; font-style:italic; color:#53645B; margin-top:10px;">Цена исправления: 5–10×</div>
</p></div>
</p></div>
</p></div>
<p>      <!-- Контур 3 --></p>
<div style="flex:1 1 240px; min-width:0; background:#F3F4EF; border:2px solid #A33327; border-radius:8px; overflow:hidden;">
<div style="background:#A33327; color:#fff; padding:12px 16px; font-size:14px; font-weight:700;">Контур 3 · На выходе</div>
<div style="padding:16px 18px;">
<div style="font-size:12.5px; font-weight:600; color:#22302A; margin-bottom:4px;">Частота: релиз</div>
<div style="font-size:12.5px; color:#53645B; margin-bottom:14px;">Занимает: 2–4 часа</div>
<div style="border-top:1px solid #C6D0C4; padding-top:14px; margin-bottom:14px;">
<div style="font-size:12.5px; color:#22302A; line-height:1.6;">Протокол приёмки</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.6;">Закрытие рисков из реестра</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.6;">Явный список непроверенного</div>
</p></div>
<div style="border-top:1px solid #C6D0C4; padding-top:14px;">
<div style="font-size:12.5px; font-weight:600; color:#A33327; margin-bottom:6px;">Что ловим:</div>
<div style="font-size:12px; color:#22302A; line-height:1.6;">системные эффекты, регресс, то, что вылезло на стыках</div>
<div style="font-size:12px; font-style:italic; color:#53645B; margin-top:10px;">Цена исправления: 30–100×</div>
</p></div>
</p></div>
</p></div>
</p></div>
<p>    <!-- Примечания под карточками --></p>
<div style="border-top:1px solid #C6D0C4; padding-top:16px; font-size:13px; color:#53645B; line-height:1.7;">
<div>Если контуры 1 и 2 не работают, весь груз падает на третий — тот, где исправление стоит дороже всего.</div>
<div style="margin-top:6px;">Ощущается это как «тестировщики опять всё завернули перед релизом». Причина не в тестировщиках.</div>
</p></div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Множители стоимости — по нашим замерам последних лет. Порядок величин совпадает с классическими оценками Барри Боэма, хотя точные цифры у каждой команды свои.</figcaption></figure>
<p><!-- /wp:html --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Что проверить до начала работ?</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>На меняющихся проектах полноценный Definition of Ready часто не работает: он либо превращается в формальность, либо тормозит работу. Мы упростили подход и оставили всего три вопроса, на которых нужно ответить до старта. Если ответов нет – не берем задачу в работу.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="max-width:820px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<p>  <!-- Блок с тремя вопросами --></p>
<div style="background:#0d1117; border:1px solid #30363d; border-radius:16px; padding:24px 28px; box-shadow:0 4px 20px rgba(0,0,0,0.3); overflow-x:auto; margin-bottom:12px;">
<pre style="margin:0; padding:0; font-family:'JetBrains Mono','Cascadia Code','Fira Code','Consolas',monospace; font-size:14px; line-height:1.6; color:#e6edf3; white-space:pre-wrap; word-break:normal; background:transparent; border:none; border-radius:0;"><span style="color:#8b949e; font-style:italic;">## Три вопроса готовности задачи</span>

1. <span style="color:#7ee787; font-weight:600;">Зачем.</span> Что изменится для пользователя или бизнеса, когда это заработает?
   <span style="color:#8b949e; font-style:italic;">Одно предложение. Не «сделать форму», а «клиент оплатит без звонка менеджеру».</span>

2. <span style="color:#7ee787; font-weight:600;">Как поймём, что получилось.</span> Один пример с конкретными данными,
   где видно, что задача решена.
   <span style="color:#8b949e; font-style:italic;">Не критерии приёмки. Один пример. С цифрами.</span>

3. <span style="color:#7ee787; font-weight:600;">Что точно не входит.</span> Какие смежные случаи мы сознательно
   не делаем в этой задаче?
   <span style="color:#8b949e; font-style:italic;">Самый недооценённый вопрос: снимает половину споров на приёмке.</span></pre>
</p></div>
<p>  <!-- Подпись под блоком --></p>
<div style="font-size:14px; color:#6b7280; text-align:center; font-style:italic; line-height:1.5;">Работает и в чате. Прилетело «сделайте фильтр по дате» — отвечаете тремя вопросами. В 80% случаев ответы приходят и они полезны. В остальных выясняется, что задачу никто не продумывал — тоже результат.</div>
</div>
<p><!-- /wp:html --></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:html --></p>
<div style="max-width:820px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<p>  <!-- Протокол приёмки --></p>
<div style="background:#0d1117; border:1px solid #30363d; border-radius:16px; padding:24px 28px; box-shadow:0 4px 20px rgba(0,0,0,0.3); overflow-x:auto; margin-bottom:12px;">
<pre style="margin:0; padding:0; font-family:'JetBrains Mono','Cascadia Code','Fira Code','Consolas',monospace; font-size:14px; line-height:1.6; color:#e6edf3; white-space:pre-wrap; word-break:normal; background:transparent; border:none; border-radius:0;"><span style="color:#8b949e; font-style:italic;">ПРОТОКОЛ ПРИЁМКИ · Релиз 2.14 · 12.03</span>

<span style="color:#7ee787; font-weight:600;">1. ЧТО ПРОВЕРЕНО</span>
   Оформление заказа с оплатой картой ... 4 сессии, 6 ч
   Пересчёт корзины ..................... 2 сессии, 3 ч
   Регрессионный чек-лист ............... 62 пункта, пройден

<span style="color:#7ee787; font-weight:600;">2. РИСКИ ИЗ РЕЕСТРА</span>
   Закрыто проверками ... 6 из 10   Передано в мониторинг ... 2
   <span style="color:#8b949e; font-style:italic;">Принято бизнесом без проверки ... 2  (см. п. 4)</span>

<span style="color:#7ee787; font-weight:600;">3. ЧТО НЕ ПРОВЕРЯЛОСЬ</span>  <span style="color:#8b949e; font-style:italic;">← раздел, ради которого всё затевалось</span>
   Мобильные браузеры старше двух лет — нет устройств на стенде
   Импорт файлов свыше 50 МБ — нет тестовых данных нужного объёма
   Больше 200 одновременных пользователей — нет нагрузочного стенда
   Отмена после частичной отгрузки — не успели, риск средний

<span style="color:#7ee787; font-weight:600;">4. ПРИНЯТЫЕ РИСКИ</span>       <span style="color:#8b949e; font-style:italic;">← подписывает бизнес, не QA</span>
   Вёрстка в браузерах старше двух лет (0,4% аудитории)  — принял: П. (продукт)
   Отчёт «Остатки» грузится 40 с на крупных клиентах     — принял: П. (продукт)

<span style="color:#7ee787; font-weight:600;">5. РЕКОМЕНДАЦИЯ</span>
   Выпускать на 10% трафика, флаг new_checkout, наблюдение 24 ч.</pre>
</p></div>
<p>  <!-- Подпись под протоколом --></p>
<div style="font-size:14px; color:#6b7280; text-align:center; font-style:italic; line-height:1.5; margin-bottom:24px;">Пункты 3 и 4 отличают этот документ от отчёта о тестировании. Один раз показав такой протокол заказчику, вы навсегда меняете характер разговора о качестве.</div>
<p>  <!-- Блок "Что это даёт менеджеру" --></p>
<div style="background:#E3EAE1; border-left:6px solid #2B4E6F; border-radius:8px; padding:20px 24px;">
<div style="font-size:13px; font-weight:700; color:#2B4E6F; text-transform:uppercase; letter-spacing:0.06em; margin-bottom:12px;">Что это даёт менеджеру</div>
<p style="font-size:14px; line-height:1.7; color:#22302A; margin:0;">Решение о релизе больше не зависит от эмоций. Не будет фраз вроде «вроде все нормально» – вместо этого есть четкая картина: вот что проверили, вот что проверить не успели, какие риски осознанно приняли и кто это подтвердил. Если потом что‑то сломается, у вас будет документ, который показывает: решение принимали, зная про все слабые места. А тестировщику такая прозрачность помогает защититься от упреков «почему не нашли»: все, что было известно, уже зафиксировано.</p>
</p></div>
</div>
<p><!-- /wp:html --></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>Лечится журналом решений. Идея заимствована у разработчиков, у них это Architecture Decision Records; то же самое, только про продуктовые договоренности. Формат – пять строк, больше никто вести не будет. Наш первый шаблон имел пятнадцать полей, и поэтому прожил всего три недели.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="max-width:820px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<p>  <!-- Карточка записи журнала --></p>
<div style="background:#0d1117; border:1px solid #30363d; border-radius:16px; padding:24px 28px; box-shadow:0 4px 20px rgba(0,0,0,0.3); overflow-x:auto; margin-bottom:12px;">
<pre style="margin:0; padding:0; font-family:'JetBrains Mono','Cascadia Code','Fira Code','Consolas',monospace; font-size:14px; line-height:1.6; color:#e6edf3; white-space:pre-wrap; word-break:normal; background:transparent; border:none; border-radius:0;"><span style="color:#8b949e; font-style:italic;">#47 · 14.02 · Промокод и статус лояльности</span>

<span style="color:#7ee787; font-weight:600;">Вопрос:</span>    Суммируются ли скидка по промокоду и скидка за статус?
<span style="color:#7ee787; font-weight:600;">Решение:</span>   Не суммируются, применяется большая из двух.
<span style="color:#7ee787; font-weight:600;">Принял:</span>    Марина (владелец продукта), созвон 14.02
<span style="color:#7ee787; font-weight:600;">Причина:</span>   Суммарная скидка выше 25% уводит заказ в минус
<span style="color:#7ee787; font-weight:600;">Следствие:</span> Чартер C-12 переписан, обновлены 4 автотеста корзины,
           на баннере акции нужна сноска — задача PROD-882.</pre>
</p></div>
<p>  <!-- Подпись под блоком --></p>
<div style="font-size:14px; color:#6b7280; text-align:center; font-style:italic; line-height:1.5;">Строка «следствие» превращает журнал из архива в рабочий инструмент: сразу видно, что в тестах надо трогать.</div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":31423,"width":"244px","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="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/10/zhurnal-resheniy-v-QA.png" alt="zhurnal-resheniy-v-QA" class="wp-image-31423" style="width:244px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/zhurnal-resheniy-v-QA.png 512w, https://quality-lab.ru/wp-content/uploads/2026/10/zhurnal-resheniy-v-QA-300x300.png 300w, https://qu]]></description>
<link>https://quality-lab.ru/blog/qa-praktiki-kotorye-rabotayut-dazhe-na-proektax-bez-chetkix-trebovanij-i-tz/</link>
<pubDate>Fri, 09 Oct 2026 17:54:44 +0300</pubDate>
</item>
<item>
<title>Выгода и опасности ИИ, мутационное тестирование, имитаторы и хитрый дебаг, новый курс про автоматизацию тестов для REST API при помощи Postman: самые интересные новости тестирования за май-октябрь 2026</title>
<description><![CDATA[<p>Опубликован выпуск рассылки за май-октябрь.</p>
<p>В выпуске собраны ссылки на новые статьи, слайдкасты, отобраны самые интересные публикации&nbsp;<a href="http://www.software-testing.ru/blogs" mce_href="http://www.software-testing.ru/blogs">в ленте блогов</a>.</p>
<p><strong>Содержание рассылки доступно&nbsp;<a href="http://www.software-testing.ru/component/acymailing/archive/view/listid-1-newsletter/mailid-741" mce_href="http://www.software-testing.ru/component/acymailing/archive/view/listid-1-newsletter/mailid-741">по ссылке.</a></strong></p>
<p><a href="http://www.software-testing.ru/component/acymailing/user/subscribe" mce_href="http://www.software-testing.ru/component/acymailing/user/subscribe">Подписаться на рассылку</a></p>]]></description>
<link>https://www.software-testing.ru/news/4567-mail-october</link>
<pubDate>Thu, 08 Oct 2026 12:04:57 +0300</pubDate>
</item>
<item>
<title>Как мы приручили JMX-файл на 50 000 строк: декомпозиция JMeter-тестов для нормального code review</title>
<description><![CDATA[<p>Автор: Макарий Петров</p><p>
Работая в Сбере, я столкнулся с тем, что общепринятым инструментом для функционального тестирования в моем трайбе был JMeter. Нравится ли мне это? Вопрос второстепенный. Приходилось работать с тем, что есть. По мере того как разрастались наши компоненты и их функциональность - разрастались и JMeter-тесты. Если кто не сталкивался - вся логика JMeter-тестов описана в файле с расширением <code>.jmx</code>. По сути это XML-файл, содержащий в себе всю логику тестов: вызовы endpoints, проверки JSON и прочая логика. И если подойти к этому вопросу без знания, то можно столкнуться с такой же проблемой, как у нас: файл разросся до 50 000+ строк и вносить/ревьюить/поддерживать его стало крайне сложно. Я нашёл способ уменьшить размер файла в 10 раз. Давайте же вместе распилим этот монолит)</p>]]></description>
<link>https://www.software-testing.ru/library/testing/performance-testing/4563-jmx</link>
<pubDate>Tue, 06 Oct 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Полностью обновленный курс Автоматизация тестов для REST API при помощи Postman Ольги Назиной</title>
<description><![CDATA[<p>Курс <a href="https://software-testing.ru/edu/3-online/315-rest-api-postman" mce_href="https://software-testing.ru/edu/3-online/315-rest-api-postman">Автоматизация тестов для REST API при помощи Postman</a>&nbsp;полностью перезаписан — обновлены все лекции, скорректированы домашние задания, добавлена новая тема автоматизации с помощью ИИ.<br /><br />Этот курс поможет начать автоматизировать API-тесты, если вы этим ранее не занимались. Он проведет от простого к сложному, чтобы уложить знания в голове. <br /><br />Несмотря на то, что ИИ поможет вам непосредственно в написании кода тестов, базовые знания «как писать такие автотесты» всё равно необходимы, они помогут:<br /><ul><li>правильно сформулировать задачу для автоматизации;</li><li>проверить, что именно ИИ написал (а он может сделать неправильно, но, чтобы это понять, нужна база, которую дает курс)</li></ul>Подробнее об обновлениях можно прочитать <a href="https://okiseleva.blogspot.com/2026/10/postman.html" mce_href="https://okiseleva.blogspot.com/2026/10/postman.html">в блоге Ольги Назиной</a>.<br mce_bogus="1"></p>]]></description>
<link>https://www.software-testing.ru/news/4565-postman</link>
<pubDate>Mon, 05 Oct 2026 15:48:20 +0300</pubDate>
</item>
<item>
<title>Синдромы больших языковых моделей</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/large-language-model.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/large-language-model.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Майкл Болтон (Michael Bolton)<br /><strong><a href="https://developsense.com/large-language-model-syndromes" mce_href="https://developsense.com/large-language-model-syndromes" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод: </strong>Ольга Алифанова</p>
<p>Мы с Джеймсом Бахом разработали предварительный набор эвристик-ориентиров для «синдромов» нежелательного поведения больших языковых моделей — устойчивых паттернов проблем, которые мы наблюдали и за которыми теперь можно системно следить.</p>
<p>Это не взаимоисключающие категории; они могут пересекаться или взаимодействовать друг с другом.</p>
<p><strong><em>Примечание</em></strong><em>: наши названия для этих категорий могут показаться антропоморфными. Мы на самом деле не считаем корректным приписывать человеческие свойства машинам, которые генерируют вывод стохастически. Но если поклонники ИИ утверждают, что их большие языковые модели ведут себя «прямо как люди!», наш ответ в том, что это поведение часто похоже на поведение крайне дисфункциональных, некомпетентных и ненадёжных людей.</em></p>]]></description>
<link>https://www.software-testing.ru/library/testing/general-testing/4510-large-language-model-syndromes</link>
<pubDate>Sun, 04 Oct 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>О менторах, о дружбанах, о древнегреках</title>
<description><![CDATA[<p>Жизнь продолжается. Мы умираем от невозможности принять всю ту бубуйню, що тут и там коїться, а новые тестировщики постоянно откуда-то рождаются и ходят по кругу с удивительно одинаковым вопросом:</p>
<h2>Где найти ментора?</h2>
<p>Ответов сразу несколько:</p>
<p>1) <em>(правильный)</em> Подходишь к живому тестировщику, устанавливаешь с ним социальную связь и спрашиваешь о работе — делаю то и это, должно получаться так, а не получается. Можешь помочь, подсказать, объяснить? Повторять в цикле с разными живыми тестировщиками.</p>
<p>2) <em>(социально-одобряемый)</em> Идёшь в Moldova QA Community, выпаливаешь самого адекватного, устанавливаешь с ним социальную связь и спрашиваешь о работе (см. выше).</p>
<p>3) <em>(псевдо-адекватный)</em> Идёшь в любое коммьюнити тестировщиков и спрашиваешь, где тут бесплатно раздают бесплатных менторов.</p>
<p>Коммьюнити с менторами у нас аж два:</p>
<ul>
<li><a href="https://t.me/+PyhNHuMlwcE3ZjQy">Moldova QA Community</a></li>
</ul>
<p>На первый взгляд это тихо-мирно существующий tg-канал, преисполненный патриархальной тишины всех провинциальных городов. Но внутри — движуха, беготня, надежды, вылазки на природу и подкоммьюнити, в котором периодически рассматриваются заявки на менторство для тестировщиков. Участие в нём добровольное, с кем посчитаю интересным поговорить — с тем и свяжусь, дальше посмотрим. Ну или не я, а кто-то ещё, чего вы ко мне привязались-то?!</p>
<ul>
<li><a href="https://www.facebook.com/TechWomenMoldova">TechWomen Moldova</a></li>
</ul>
<p>Глобальное коммьюнити про IT в Молдове. Это отдельная экосистема, в которой раз в год организовывают масштабную программу менторинга по разным направлениям, в том числе и для QA. Тоже абсолютно добровольное участие для всех сторон, но уже с вайбом большого проекта с семью директорами с восемью печатями — есть центральное управление, условия участия, сбор фидбэка с оценками, торжественно-парадная ритуальная церемония открытия и закрытия программы. В этом году я к этой программе подконнектился по линии QA на русском языке (на родном мне про тестирование говорить сложновато).</p>
<div id="attachment_37082" style="width: 675px" class="wp-caption aligncenter"><a href="https://testitquickly.com/wp-content/uploads/2026/10/TechWomenMoldova2026.jpg"><img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-37082" class="size-large wp-image-37082" src="https://testitquickly.com/wp-content/uploads/2026/10/TechWomenMoldova2026-684x1024.jpg" alt="Торжественно-парадная фото-пикча меня на фоне меня же с церемонии открытия программы менторинга 2026-го в TechWomenMoldova" width="665" height="996" srcset="https://testitquickly.com/wp-content/uploads/2026/10/TechWomenMoldova2026-684x1024.jpg 684w, https://testitquickly.com/wp-content/uploads/2026/10/TechWomenMoldova2026-200x300.jpg 200w, https://testitquickly.com/wp-content/uploads/2026/10/TechWomenMoldova2026-768x1151.jpg 768w, https://testitquickly.com/wp-content/uploads/2026/10/TechWomenMoldova2026-1025x1536.jpg 1025w, https://testitquickly.com/wp-content/uploads/2026/10/TechWomenMoldova2026-660x989.jpg 660w, https://testitquickly.com/wp-content/uploads/2026/10/TechWomenMoldova2026.jpg 1367w" sizes="(max-width: 665px) 100vw, 665px" /></a><p id="caption-attachment-37082" class="wp-caption-text">Торжественно-парадная фото-пикча автора на фоне автора же, подвисшего на карусельках на Ботанике, с церемонии открытия программы менторинга 2026-го в TechWomenMoldova</p></div>
<p>Программа “2026” уже завершилась, но всё ещё есть о чём подумать, например о том, что менторы будут существовать даже в нашем будущем, которое мне представляется как сплошной сериал Star Trek в бандитско-неустроенной вселенной Star Wars, где отважные старшип-капитаны и их грамотные намбер-уаны на протяжении всех серий преисполнены дипломатии и сочувствия ко всем живым <del>тестировщикам</del> существам. Короче, всем смотреть. Вон как красиво там раскрывается тема менторинга джунов (<em><a href="https://www.youtube.com/watch?v=zWTben_Rs3Y">Shut up Wesley!</a> ©</em>)!</p>
<p>Пока все ушли смотреть бесконечный сериал про бесконечное звёздное небо внутри нас и леденящую душу действительность вокруг нас, я начну неспешно, многосерийно говорить о том, что такое «ментор» и откуда это всё взялось.</p>
<p><strong>Важный дисклэймер</strong> в эти дурацкие времена: весь текст написан вручную с применением типографики, которую я разумею как правильную (в KDE она включается на раз-два и очень удобно используется), с длинными тире и французскими кавычками-ёлочками. Текста много, потому что я его писал не в один присест — в прекрасном десктопном вики-редакторе Zim (см. скриншот <a href="https://testitquickly.com/wp-content/uploads/2026/10/zim-original-text.png">оригинала</a>), по своему усмотрению усмиряя пухнущие и расползающиеся абзацы. А из-за того, что в наборе таки были орфо или даже стилевые ошибки, мне приходится по мере их выявления там и сям обновлять уже опубликованный текст. Понять и пrостить.</p>
<h2>Кто такой «ментор»</h2>
<p>Начнём ооочень издалека, чтобы прояснить лор* и бэкграунд** нашей темы.</p>
<p style="padding-left: 40px;">* Лор (от англ. lore) — история, устройство и внутренние правила вымышленного, как правило, игрового мира. Он объясняет персонажей и предисторию событий, в которые игрок начнёт погружаться, иногда поверхностно, иногда очень детально, от происхождения сторон до скрытых связей и событий, которые могут быть неочевидными, но важными.</p>
<p style="padding-left: 40px;">** Бэкграунд — background же!</p>
<p>Может показаться, что на страницах всемирной истории греки больше всего преуспели в насаждении своей национальной культуры окружающим их народам, в постоянной войне «все против всех» и в наименовании друг друга экзотичными именами. На самом деле эти вымершие парни прочно сидят в современной культуре всей Европы, и хорошо бы понимать их первоисточник.</p>
<h3>Про названия</h3>
<p>Не все знают, что называть греков греками некорректно. Они изначально не были единым народом, это был народный сборник племён и народов, разбросанный по островам, и все называли себя кто во что горазд — данайцы (иногда данаи), аригвяне, ионийцы, дорийцы, эолийцы, грайки, локры, ахейцы…</p>
<p>Некоторое время греки жили даже на территории современного Севастополя в городе с изысканным названием Херсонес Таврический (не путать с более современным украинским Херсоном), но местные их называли то херсонесцами, то херценосцами, и греки ушли оттуда ещё во времена поздней античности в IV–V веках нашей эры.</p>
<p>В русской литературе древнегреков издревле привыкли называть ахейцами. Например:</p>
<p style="padding-left: 40px;">…Куда плывете вы? Когда бы не Елена,<br />
Что Троя вам одна, ахейские мужи?</p>
<p>Или</p>
<p style="padding-left: 40px;">Смотрите —<br />
Лечу, словно в сказке,<br />
[…]<br />
И в край незапамятный тот,<br />
Где снова ахейские старцы<br />
Ладьи снаряжают в поход.</p>
<p style="padding-left: 40px;">Чужое и глупое горе<br />
Велит им на Трою грести.<br />
А мне — за Эгейское море,<br />
А мне еще дальше расти!</p>
<p>А ещё в древности в принципе не было единого греческого национального государства. Было слово Хелла́с (Ἑλλάς) — обозначение греческого мира вообще, которое со временем превратилось в Элла́с. Местные называли себя, соответственно, э́ллины (ударение смещено на «э» по правилам их языка) с уточнениями, мол, здравствуйте, я эллин-ахеец, кофе будете? А я эллин-данаец, здравствуйте-калимерствуйте, кофе мы ещё не изобрели, поэтому налейте мне вина! А, точно, и овечьей брынзы возьмите… Овечьей, из овечьего молока, иногда с добавлением козьего, то есть, фета? Да, фета… А виноград будет? А по наглой морде? А священная ксени́я? Ах, да…</p>
<p style="padding-left: 40px;">Не морщимся, чуть позже этот псевдодиалог станет чуть более, чем полностью понятным.</p>
<p>Позже они переназвали свою страну Элла́да согласно уточнённым нормам своего осовремененного языка. Слова «грек» и «Греция» они и сегодня не признают и употребляют только в общении с глупыми иностранцами, деньгиприносящими.</p>
<h3>«Илиада»</h3>
<p>Можно подумать, что это искаженное «Эллада», но нет.</p>
<p>Много веков назад на побережье Эгейского моря на полуострове Троада (сегодня он называется Бига и принадлежит Турции) некий Ил, сын некоего Троса, основал новый город. Город он назвал имени самого себя, конечно же — И́лион (в оригинале Ἴλιον, звучит ближе к Ийон), а местность назвал по имени своего незабываемого папы Троса — Тро́я.</p>
<p>Столицу полуострова Троада древние греки называли то как полагается, Илион, то упрощённо Троя, потому что на Троаде же, и в те времена города иногда были одновременно и государствами, и когда один говорил «Троя», миллионы понимали, что имеется ввиду город-государство Илион с полуострова Троада.</p>
<p style="padding-left: 40px;">Например, мы сегодня подразумеваем, что спартанцы жили в государстве с названием Спарта. На самом деле они жили в местности Лакония, на территории которой забубенили своё государство Лакедемон, и на территории этого государства они понастроили городов, главным из которых был город-государство Спарта. То есть, все спартанцы — лакедемоняне, но далеко не все лакедемоняне, жители Лаконии — спартанцы, так-то.</p>
<p style="padding-left: 40px;">Ну и да, термин «лаконичность» — манера говорит немногословно — происходит от манеры древних жителей Лаконии говорить кратко и по делу.</p>
<p>И как-то случилась в этом тройском царстве-NOT-государстве занятная история. Летним <a href="https://www.youtube.com/watch?v=_uEnXsU6jq4">тёплым вечерком</a> XII-го века до н. э. некий Парис, сын Приама, тогдашнего царя Трои, припёрся в гости к Менелаю, царю Спарты. Да-да-да, та самая THIS IS SPARTAAAA!</p>
<p>Менелаич принял царевича Трои радушно, по-человечески, или как говорили греки, «cu un paharel de jin și mămăliguță proaspătă», но тут юный мистер Пэрис Приамович увидел менелаеву жену с редким именем Елена… Увидел да не развидел, потому что там было на что посмотреть, в наше время она считалась бы победительницей конкурса «мисс <del>tech</del> Вселенная», всем встать, тётя-бомбуэ! Ну и захотел он Елене, эээ, подарить всего себя.</p>
<p>Елена, конечно, пошла в отказ, мол, женатая же я, не надо мне таких подарочков, но богиня Афродита мимо пробегала и насильно влюбила Елену в Париса. Елена разумом всё понимает, но внутренней Афродите не перечит и решительно прихватив заметную часть сокровища мужа (воровство в большом масштабе, да) а также двух молчаливых рабынь, чтобы сундуки тащили, сваливает с Парисом в Трою. Дома остались разгром, её девятилетняя дочь Гермиона и сын Никострат (с неопределенным количество лет; возможно, он даже ещё и не родился к тому моменту). Ну не таскать же детей за море в компании «нового папы»…</p>
<p>Менелай за утренним <del>кофе</del> виноградном зелье узнаёт об этом круизе, офигевает, и как истинный жерарбатлеровский спартанец хочет кое-что кое-кому кое-как отрубить. Дважды. И деньги верните, волки позорные! Но волки позорные уже резво плывут в Трою к батьке Приаму, который начинает грызть ногти на ногах, думая о последствиях, о которых не подумал его шкет и озорник Парис.</p>
<p>Менелай таки сгонял в Трою с досудебным заявлением, но там ему показали МПХ и на дверь. Не стерпел Менелай, не стерпел, кинул клич среди вооруженной братвы и как всё заверте…</p>
<p>Древние греки, которых мы не должны называть греками, на раз-два собираются очень <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3_%D0%BA%D0%BE%D1%80%D0%B0%D0%B1%D0%BB%D0%B5%D0%B9">большой армадой</a>, прут толпой в Трою, устраивают там осаду и десять лет ежедневно, как на работу, ходят к ее воротам, мол, открывайте! А троянцы им в ответ — неееееет… Туда-сюда по локации шастают олимпийские боги, которые в те времена постоянно тусили среди землян и местами творили чудеса, чаще — мерзости.</p>
<p>Надо понимать, что древние греки воспринимали мироздание не так, как современные <del>древние</del> греки. В их мире постоянно присутствуют множественные древнегреческие боги, которые так-то жили на неприступной горе Олимп или в бесконечных морских пучинах, но постоянно являлись в мир и сильно влияли на всё, что в мире происходило.</p>
<p>Боги эти были не только бессмертными и мудрыми, но и очень стервозными мудаками, потому что были они беспредельно всемогущи и развращены бесконечной властью. Они могли принять облик любого, буквально любого древнего грека и действовать от его имени. Или могли одарить человека чем-то вроде мудрости или богатства. Или превратить в лягушку.</p>
<p style="padding-left: 40px;">Например, один славный древнегрек Актео́н увидел, как плещется в проточной воде <a href="https://ru.wikipedia.org/wiki/%D0%90%D1%80%D1%82%D0%B5%D0%BC%D0%B8%D0%B4%D0%B0">Артемида</a>, вечно юная богиня Луны, охоты и женского целомудрия, по совместительству покровительница всего живого на Земле, дающая счастье в браке и помощь при родах, а также сестра Аполлона, который был олицетворением Солнца. Артемида обозлилась на глазастого Актеона и нет, не выцарапала ему глаза, а превратила его в оленя. И кто же знал, что у Актеона есть аж <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%B1%D0%B0%D0%BA%D0%B8_%D0%90%D0%BA%D1%82%D0%B5%D0%BE%D0%BD%D0%B0">92 собаки</a>, которые не унюхали своего хозяина за «оленьими» глазами, обгавкали его разными обидными древнегреческими словами и разорвали его на 92 клочка. Не становитесь оленями, мужики!</p>
<p style="padding-left: 40px;">А ещё боги могли кого угодно просто взять и оплодотворить, отчего бедные греки то и дело рожали полубогов, которые наследовали от своих разнузданных предков только часть божественных возможностей (ну, типа как герои комиксов Marvel), но и от этого им тоже знатно срывало башню и они начинали жить да озорничать в меру своих ополовиненных боговских возможностей.</p>
<p>Наконец, отсидевшие десять лет под стенами Илиона греки протрезвели, поговорили с богами, трезво оценили тактическо-стратегическую обстановку, прекратили неэффективную драчку у неприступных ворот и сделали эффектный ход в Трою деревянным конём. На боку коня, чтобы троянцы не заподозрили троянского коня, было написано: «<em>Этот дар приносят Афине Воительнице уходящие данайцы*</em>», а то, что внутри спрятались хитрые греческие воины — не написали. Троянцы написанное на заборе прочитали, прочитанному нотариально поверили, затащили эту деревянную ерунду в город всё разверте…</p>
<p style="padding-left: 40px;">* Помним, что данайцы — одно из греческих племён, которых, как мы знаем, нельзя называть греками. Но древние римляне называли всех греков обобщающе «данайцы», отсюда и стихотворное «<a href="https://ru.wikipedia.org/wiki/%D0%91%D0%BE%D0%B9%D1%82%D0%B5%D1%81%D1%8C_%D0%B4%D0%B0%D0%BD%D0%B0%D0%B9%D1%86%D0%B5%D0%B2,_%D0%B4%D0%B0%D1%80%D1%8B_%D0%BF%D1%80%D0%B8%D0%BD%D0%BE%D1%81%D1%8F%D1%89%D0%B8%D1%85">Timeo Danaos</a> et dona ferentes».</p>
<p>Так вот, коня затащили в Трою, в коне сидели хитрые древние греки (Менелай, Одиссей, Диомед и др), которые ночью выползли из коня с мечами наголо ну и end of story, всем секир-башка, усталые, но довольные греки вернулись домой с богатой добычей, а усталые и недовольные жители Трои медленно умирали на развалинах империи от злости на свою же глупость. Руины Трои хорошенько поросли травой забвения и были обнаружены только в конце 1860-х годов настырным археологом Генрихом Шлиманом (тот ещё шлемазл!).</p>
<p>А ведь всё могло бы быть иначе. Греческие ахейцы могли бы и не рваться в Трою, мол, Менелаич, ну сбежала твоя жинка — та найди себе новую, ты же царь Спарты, ёпта. Да и нужна тебе новая жена? Было бы у нас столько рабынь, сколько у тебя, мы, может, и не женились бы…</p>
<p>Или могли бы поехать, но лососнуть крепкого троянского тунца и вернуться домой ни с чем. End of story, пренебречь, все танцуем задорный танец здорового рукомашества и дрыгоножества</p>
<p><iframe title="Zorba The Greek Dance - The Greek Orchestra Emmetron Music   HD" width="665" height="374" src="https://www.youtube.com/embed/kG12C1oX5Eo?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>
<p>Или сами тройцы могли бы прикинуть кое-чего к носу, собрать армию и приплыть из своего Иллинойса проведать самих древнегреков сразу с Парисом и мечами наголо… Кагбэ, ой.</p>
<p>Со временем все герои всей истории последовательно умерли: кто-то от старости, кто-то случайно, того же Ахиллеса застрелили (стрелами), Парис был выпилен <em>очень</em> ядовитой древнегреческой стрелой в ходе рутинных военных действий при осаде города-государства, а Елена Прекрасная — кхм…</p>
<p style="padding-left: 40px;">А Елена Прекрасная после смерти Париса быстро переоформила документы и стала женой другого царевича, парисового брата Деифоба. А когда Троя пала, Менелай внутрь города зашёл, этого Деифоба нашёл и зарезал, после чего мрачно поехал домой с «любимой» женой. В пути их помотало так круто, что домой они доплыли только через восемь лет, после чего Менелай чинно пожил да и помер, раздав свою душу многочисленным олимпийским богам.</p>
<p style="padding-left: 40px;">Тут же всё ещё прекрасная, но уже вдова Елена была выпнута из дворца и вообще из Спарты своим же сыном Никостратом «за неподобающее поведение лица, облечённого высшей административной властью» (ах вы хочете беспоследственно воровать мужнины драгоценности и ездить по заграничным троянским курортам!?; так что ехайте вы, мамаша, куды завгодно).</p>
<p style="padding-left: 40px;">Ну и бедная вдова послала сообщение на ближайший остров Родос к своей подруге-королевне Поликсо, мол, давай я приеду, посидим-поболтаем, как две равные царствующие вдовушки, я о Трое расскажу, фотки фресок покажу.</p>
<p style="padding-left: 40px;">SMS на весь экран: «<em>Приезжай )))))!!!11!!!11!…</em>»</p>
<p style="padding-left: 40px;">Елена приехала, но не учла, что подруга-Поликсо стала вдовой потому, что муж ейный (Тлеполем) был убит под стенами той самой Трои, и безутешная вдова НЕ забыла, из-за кого вся эта илионско-троянская история началась. Пока прекрасная гостья принимала душ после долгой дороги, хозяйка Родоса велела своим служанкам достать «нашу прекрасную гостью» из ванной и as is, с голой Жэ, повесить на любом дереве. Было исполнено.</p>
<p style="padding-left: 40px;">Странно, что не утопили, ведь логистически это было намного проще сделать. Но не нам судить о милых женских капризах в деле исламизации эпических персонажей всемирной истории.</p>
<p>Война закончилась, все переключились на другие войны (в те времена мирных лет было крайне мало) и позабыли про всю эту Трою, но 2825 лет назад, уже в VIII-м веке до нашей эры, через 400 лет после всей этой истории, в Элладе возник слепой поэт Гомер, который сделал по данной теме исторический реферат в стихах — без рифм, зато особым устаревшим дактило-хореическим размером, который называют гекзаметром. И назвал он эту эпическую историю «Илиада» — по первозданному названию упомянутого города-государства.</p>
<p>По факту оказалось, что Гомер создал первую в истории мировой литературы и культуры трагедию, так-то. Да ещё на документальном материале. До него многие так делали, да не очень удачно. После него многие пытались повторить его подвиг, но увы, не осилили, и вся эта культура трагических возвышенных песнопений, гм, канула в Лету.</p>
<p>А мы, мировая культура (или надо говорить мы, мировые культуристы?) получили из всей этой гомеровской истории меметично-известные имена героев: <em>Ахиллес</em> (благородный дон, поражённый в пятку), <em>Одиссей</em> (благородный дон, который долго не хотел возвращаться домой, а когда вернулся — убил всех гостей в своём дворце), <em>Аякс</em> (их, как закарпатских деревень, сразу двое — Великий и Малый), <em>Гекто-о-о-о-ор, Лаокоон</em> (под видом <a href="https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BE%D0%BA%D0%BE%D0%BE%D0%BD_%D0%B8_%D0%B5%D0%B3%D0%BE_%D1%81%D1%8B%D0%BD%D0%BE%D0%B2%D1%8C%D1%8F">статуи голого мужика</a> с сыновьями и змеёй; походу, его запечатлели в процессе яростного развода) и прорицательница <em>Кассандра</em> (к слову, сестра Париса), которая проницательно предвидела, что данайский конь — это бэмц, но не предвидела, что ей грозит за это прорицание. Памятники ей не ставили, но один нерукотворный сам Высоцкий ей своими руками <a href="https://www.youtube.com/watch?v=2yoNofFYkk4">сотворил</a>.</p>
<p>Ок, бро, это прохладная история, а причём здесь ментор? Пока что ни при чём, разве что есть любопытное совпадение — In Real Life в IV веке до н. э. одного из правителей той самой Трои звали Ментор! То есть, Ментор — это просто имя человеческое, вроде Владислав или Ярослав или Славослав… Во как!</p>
<h3>«Одиссея»</h3>
<p>Гомера все так хвалили за «Илиаду», что он забыл остановиться и выкатил в прод вторую стиховорную поэму на ту же тему — «Одиссе́я».</p>
<p>Помним, что среди участников троянского сражения и сидельцев внутри троянского коня был такой товарищ Одиссей — тоже очень благородный дон, итакиец, царь острова-государства <a href="https://ru.wikipedia.org/wiki/%D0%98%D1%82%D0%B0%D0%BA%D0%B0">Итака</a> (всё ещё открыт для посещения).</p>
<p style="padding-left: 40px;">В поздней латинской интерпретации Одиссея упёрто называют Улисс (Ulysses).</p>
<p>Как-то Одиссей припёрся к Алкиною, царю феаков, мореплавателей со сказочно быстроходными кораблями. Мужики быстро соорудили большой стол, за которым Одиссей громко рассказывал о своих приключениях после возвращения с троянской войны. А Гомер словно рядом сидел и всё слепо записал…</p>
<p>А дело было так. После одоления/поражения Трои все разъехались по домам. Но, например, Одиссей подзадержался в пути аж на десять лет — там то одно, то другое… Одиссея все эти десять лет на Итаке ждут его верная жена Пенело́па, верный сын Теле́мах, верный пёс А́ргус и неверные соседи, которые хотят зохавать себе всю Итаку и жену и собаку, раз уж хозяина нет дома. Они толпой тусят в доме Одиссея, их всех бесплатно кормят жители Итаки, и двенадцать рабынь Одиссея уже стали их любовницами, кагбэ, успех пришёл к пацанам.</p>
<p>Но тут на сцену выскакивает взрослеющий сын Одиссея Теле́мах.</p>
<p style="padding-left: 40px;">В оригинале говорят Тэле́макхос, там «xэ» надо произносить манерно, как в «LaTeX». И ударение, как видим, на «е». Но я чаще слышал ударение на «а». Ну, мы Кема Кейнера называем Сэмом Канером и ничо, живы все.</p>
<p style="padding-left: 40px;">Как-то получилось, что чем ближе к нам, тем чаще Тэле́маха начали называть Телема́х, и ничего с этим уже не поделать.</p>
<p>Телемах очень рад, что его не назвали сдуру Телевизором, но не рад, что своего героического папку он не видел аж со своего младенчества, а уже пошел двадцатый год (десять лет он провёл на войне, и уже десять лет как должен был вернуться, но он хз где, ой-вэй). Телефонов нет, новостей нет, дом оккупирован беспардонными гостями, и пацан решает поездить по районам и поспрашивать новостей про батю, мало ли.</p>
<p>В те времена дети не боялись шариться до поздней ночи по округе, потому что каждый древнегреческий пацан знал названия минимум 300 звезд на небе и носил с собой острый ножик, из-за чего считалось, что юный древнегрек в принципе не может заблудиться. Но выходить за пределы своего района было опасно — у всех есть ножи, и всем нужны рабы… Мы же помним, что в Древней Греции не только придумали демократию, но и постоянно поддерживали рабовладельческий строй.</p>
<p style="padding-left: 40px;">Собственно, Одиссей тоже был рабовладельцем и ничо, и норм.</p>
<p>А в этом строю будь ты хоть Телемах, хоть сам Максимус Ундецимус Меридианус Прайм, командующий северными армиями, генерал испанских легионов, верный слуга истинного Императора, отец убитого сына, муж убитой жены, сосед убитого соседа, нетленный автор постов и комментариев, но если тебя ВНЕЗАПНО стукают по башке каменюкой, связывают и на ближайшем рынке продают в рабство, то увы тебе и всем твоим титулам… А ещё в их мире не было паспортов, полиции и конституционных прав (потому что и самой конституации не было). А ещё в их мире постоянно шастают олимпийские боги, отчего ЛЮБОЙ человек на твоём на жизненном пути мог оказаться богом…</p>
<p>В современности это всё воспринимается иначе. Сегодня нам сложно представить ситуацию, когда ты вышел за хлебом, а оказался в плену злых толстомордых товарищей в военной униформе без опознавательных знаков (что немыслимо для вояк, кои очень любят носить на себе надписи и эмблемы), которые грубо пихают тебя в автобус, держат в подземелье в качестве раба и требуют вместо них поехать на войну и поумирать там во славу чего-то непонятного… Мы были бы в ахействе от таких раскладов, а древним ахейцам такое как раз было нормой.</p>
<p>Некоторые наши современники, пересмотревшись фильмографии режиссёра Нолана, уже знают о том, что в Древней Греции существовал ранее упомянутый ксени́я (ξενία) — закон/обычай гостеприимства, который придумал Зевс:</p>
<ul>
<li>хозяин обязан принять путника, накормить и предоставить ему ночлег;</li>
<li>гостя нельзя оскорблять или причинять ему вред;</li>
<li>гость обязан уважать хозяина и не злоупотреблять его гостеприимством;</li>
<li>между сторонами устанавливались долговременные взаимные обязательства.</li>
</ul>
<p>В случае проделок Париса с Елены нарушение ксении особенно вопиюще: Парис и Елена не просто грубо обошлись с Менелаем, а нарушили священный порядок гостеприимства, который установил сам Зевс. Так-то.</p>
<p style="padding-left: 40px;">И да, от этого обычая происходят женское имя Ксе́ния (др.-греч. ξενία «гостеприимство»). Сегодня не каждая Ксю знает, что носит имя, которое придумал Зевс, разве что ударение сместилось…</p>
<p>И кажется нашим современникам в прохладных кинозалах, что в те прекрасно-пасторальные времена эта законодательная ксения пронизывала всю тогдашнюю доисторическую цивилизаци — незнакомого путника прими, накорми, кров дай, вина дай, бабу дай (рабыни же!), и только на третий день уже спрашивай его имя, откуда пришел и куда идёт, ибо в каждом страннике может скрываться бог! Некоторые наши современники даже истово веруют в то, что это, мол, была не просто вежливость, это была <em>инфраструктура</em> мира без гостиниц, посольств и банковских карточек; а сам Нолан называет этот принцип «клеем, который держал всё общество». А ещё эту мудрую практику мироустройства использовали древние римляне, древние евреи, древние шумеры, древние молдаване и прочие древние древляне.</p>
<p>Ну да, ну да… Священное гостеприимство от людей, у которых есть рабы, и которым всегда нужны новые рабы.</p>
<p style="padding-left: 40px;">И лёг спать усталый условный Максимус Ундецимус Меридианус Прайм, командующий северными армиями, генерал испанских легионов, ублаженный ласковыми рабынями и хмельными винами, и проснулся связанным и с комком (чужих) носков во рту по пути к ближайшей агоре на продажу… Ну и что? Ну и всё. Надо было успеть первым зарезать гостеприимных хозяев. End of story.</p>
<p>В общем, даже несмотря на все эти ваши ксении, шастать по дорогам общего пользования в те времена боялись и дети, и взрослые. Сопроводить юного царевича в этом ненужном, но важном путешествии не побоялся некий Ментор, пожилой друг и советник Одиссея, которому Одиссей когда-то буквально нотариально поручил присматривать за подрастающим Телемахом во время своего слегка, гм, затянувшегося отсутствия.</p>
<p style="padding-left: 40px;">Не на усмотрение своей жены оставлять ребенка, да? Вам рассказать, какое отношение к женщинам доминировало среди постоянно машущих мечами рабовладельцев?</p>
<p>&nbsp;</p>
<div id="attachment_37083" style="width: 426px" class="wp-caption aligncenter"><a href="https://testitquickly.com/wp-content/uploads/2026/10/Telemachus_and_Mentor.jpg"><img decoding="async" aria-describedby="caption-attachment-37083" class="size-full wp-image-37083" src="https://testitquickly.com/wp-content/uploads/2026/10/Telemachus_and_Mentor.jpg" alt="" width="416" height="500" srcset="https://testitquickly.com/wp-content/uploads/2026/10/Telemachus_and_Mentor.jpg 416w, https://testitquickly.com/wp-content/uploads/2026/10/Telemachus_and_Mentor-250x300.jpg 250w" sizes="(max-width: 416px) 100vw, 416px" /></a><p id="caption-attachment-37083" class="wp-caption-text">Телемахус и Ментор тыкают друг друга палкой по пальцам ног и мужественно терпят все невзгоды</p></div>
<p>Ааааааа, скажем мы, так вот почему ментор называется ментором! Он сопровождает юного Телемаха в путешествии и даёт ему мудрые советы…</p>
<p style="text-align: center;"><span style="color: #ff0000;" data-darkreader-inline-color="">Нет.</span></p>
<p style="text-align: left;">Смотрим дальше.</p>
<p>В какой-то момент во время этого путешествия облик Ментора незаметно принимает <a href="https://ru.wikipedia.org/wiki/%D0%90%D1%84%D0%B8%D0%BD%D0%B0">Афина</a> — богиня мудрости, знаний, искусств и ремёсел, наук и мастерства, ума, сноровки, изобретательности, военной стратегии и тактики, которая заводит с ничего не подозревающим Телемахом прелюбопытные разговоры, в ходе которых мы понимаем, что пацан был вообще не дурак, мог сперва подумать/поразмыслить, и только после действовать.</p>
<p>Прямая цитата:</p>
<p style="padding-left: 40px;">«Но, – отвечал рассудительный<br />
сын Одиссеев, —<br />
Как подойти мне?<br />
Какое скажу я приветствие, Ментор?<br />
Мало ещё в разговорах разумных<br />
с людьми я искусен;<br />
Также не знаю, прилично ли младшим<br />
расспрашивать старших?»</p>
<p style="padding-left: 40px;">Дочь светлоокая Зевса Афина ему отвечала:<br />
«Многое сам, Телемах, ты своим<br />
угадаешь рассудком;<br />
Многое демон откроет<br />
тебе благосклонный…»</p>
<p>Ааааааа, снова скажем мы, так вот почему ментор называется ментором! Это сама богиня мудрости сопровождает юного Телемаха в путешествии и даёт ему мудрые советы…</p>
<p>Это очень логичный вывод, но снова</p>
<p style="text-align: center;"><span style="color: #ff0000;" data-darkreader-inline-color="">НЕТ!</span></p>
<p style="text-align: left;">Смотрим ещё дальше.</p>
<p>Ментор в этой истории Гомера мудростью не блистал. Афина блистала, а Ментор — ну, просто взрослый, знатный человек, друг Одиссея и доверенное лицо, которому Одиссей поручает присматривать за домом (не справился) и Телемахом (почти справился). Никак не учитель, наставник или там, просветленный мудрец, просто сопровождал, ксению показывал. Да и не было ему нужды заниматься менторированием, для этого использовались другие люди и понятия — например, были люди с названием παιδαγωγός (paidagōgós). Как правило, педагогами называли рабов, которые должны были довести юного господина до школы и обратно, чтобы не прогуливал, ну и заодно посоветовать что-нибудь здравое, если будет необходимость, например, как приложить подорожник, если ушибся или что нельзя сосать сосульки. Ну или можно, но чтобы никто не видел.</p>
<p>А ещё у эллинов было слово διδάσκαλος (didáskalos) — буквально «Учитель», но надо учесть, что к нам это слово пришло из уже поздних библейских текстов, в которых так называли, например, самого Джызус Крайста. То есть, это не профессия, а призвание человека, который олицетворяет какую-то доктрину и «ведёт за собой» слушателей своих, аки пастырь овец.</p>
<p style="padding-left: 40px;">В Румынии это древнее слово превратилось в <span class="def"><i>dascăl</i></span> и поныне обозначает сразу два явления: и устаревшее «учитель» и устойчивое «дьяк», который в церкви тянет «мнооооогая лееееета». Зачастую эти два понятия используются вместе и обозначают одного человека, потому что в церковно-приходских школах детей грамоте учили те же духовные (или придуховненные) лица, которые читали вслух религиозную пропаганду.</p>
<p>Поэтому факт — менторов, которых мы сегодня подразумеваем, в «Одиссее» не было. Было просто имя «Ментор».</p>
<p style="padding-left: 40px;">А как, например, называла самого Ментора его мама? У любого ребенка есть уменьшительно-ласкательное имя, вероятно, Мент? И если бы Гомер назвал Ментора Ментом, то youtube &gt; «Как найти мента по Java»…</p>
<p style="padding-left: 40px;">Тут вдвойне любопытно — у Гомера таки упоминается мент! Даже два! Первый гомеровский Мент (греч. Μέντης, Méntēs) упоминается в «Илиаде» ― царь каких-то киконов. Второй <a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%BD%D1%82_(%D1%86%D0%B0%D1%80%D1%8C_%D1%82%D0%B0%D1%84%D0%B8%D0%B9%D1%86%D0%B5%D0%B2)">Мент</a> упоминается в «Одиссее» — царь мифического народа тафийцев.</p>
<p style="padding-left: 40px;">Имя второго почему-то приобрело в древнегреческом народе уничижительное значение и стало обозначать зловещего посланника… Вероятно, бил подчиненных резиновыми дубинками по почкам.</p>
<p>В «Одиссее» Афина вольготно буйствует, и по ходу дела принимает как облик Ментора, так и облик Мента. Ух… Смена масок в древнегреческом театре была нормой.</p>
<p>Ещё скажем пару слов про образ Телемаха. Его образ — это такой себе эпик про взросление. Изначально это незначительный персонаж, рос без отца, в школу не ходил, в доме бардак, в голове кавардак, характер ненордический, не женат. Однако после упомянутого путешествия он вернулся домой слегка позврослевшим. И когда его отец таки является и говорит «Я твой father, Люк!», Телемах на пару с папой начинает недрогнувшей рукой методично убивать тех самых гостей, которые жрали, разлагались и домогались занять вакантное место царя Итаки. То есть, Телемах ДО путешествия — просто юноша. Телемах ПОСЛЕ путешествия — это взрослый тип с мачете. Machete kills.</p>
<p>А когда всё развертелось и устаканилось, Телемах вывел во двор тех самых двенадцать рабынь, которых принудили ублажать бывших гостей, неудавшихся пенелопских женихов, и всех их повесил. Он ведь тоже был рабовладельцем, и мог делать со своим имуществом буквально всё, что захочет.</p>
<h2>«Приключения Телемака»</h2>
<p>Итак, у нас уже несколько дядей с именем ментор:</p>
<ul>
<li>один из IRL правителей той самой Трои в IV веке до н. э.</li>
<li>персонаж Ментор из Одиссеи</li>
</ul>
<p>и ни один из них не олицетворяет связку «ментор — наставник». Противоречие…</p>
<p>Не все знают о том, что прохладные былины Гомера были топом во время их появления, но затем медленно исчезли из общественного поля зрения. Причин тому множество — чтобы их читать, надо было, соппсно, уметь читать… а это умели не все. Древний Рим, конечно, перенял много из эллинской культуры, но и там надо было сперва уметь читать, и желательно на эпическом древнегреческом. А гомеровский язык — это не совсем древнегреческий язык. Он не рассказывал, а пел поэтические песни, поэтому он использовал искусственный поэтический язык, в котором есть множество ОООООчень древних форм, которые дико необходимы для эпического стихосложения, но так же дико устарели и стали непонятными. Как выразился один из исследователей, «<em>Эпическое повествование поэмы напоминает сон — событийный, красочный, жуткий, эротический, захватывающий и трогательный одновременно. Ни одна другая книга не подарит читателю такого сна</em>». Язык — оружие, це однозначно.</p>
<p style="padding-left: 40px;">Например, эпичный героизм какого-нибудь героя выражался через эпичные эпитеты — шлемоблещущий.</p>
<p>Записывать эти песни было особо некому, до нас дошли тексты, набранные алфавитом, который в принципе не существовал во времена былинные. Поэтому читать эти тексты со временем было всё сложноее и всё более некому. Да и нафига тебе древние поэмы, когда на дворе начинается распад Римской империи, вандализация и джызускрайстизация оставшегося населения, кругом чума, варвары и прочие непотребства…</p>
<p>А переводить все эти гекзаметры на певучую латынь — та ещё задача. И когда развалились древние римляне, читать это всё даже на латыни стало интересно немногим. Ну, серьезно, предположим, что на дворе условно 1699-й год, просвещенный 17-й век перетекает в 18-й, в Европе всё ещё пытаются оклематься от последствий безумной религиозной тридцатилетней войны и вообще не очень здравая обстановка. Идёт какой-нибудь молодой человек в библиотеку и просит что-нибудь интересного… Какова вероятность, что ему предложат почитать гомеровские тексты, которым уже 2500 лет!?</p>
<p>Но случилось непредсказуемое. В этом самом 1699-м году во Франции некий Франсуа Фенелон подхватывает древние тексты и выпускает приквел — якобы расширенные «Приключения Телемака» (Les Aventures de Télémaque).</p>
<p style="padding-left: 40px;">Имя уже известного нам Телемаха на французский манер однозначно произносится как Телема́к, и можно предположить, что с тех времён исчезает Тэле́мах и появляется Телема́х, он же Телема́к.</p>
<p>Бить по рукам Фенелону некому, он берёт уже изрядно подзабытых за две тысячи лет древнегреческих персонажей и клепает по данному сюжету собственную историю путешествия юного древнегрека по мифическо-исторической Древнегреции, и в книге Фенелона Ментор становится уже не просто туда-сюда ходящим персонажем, а тем самым образцом «мудрого наставника», который направляет и обучает молодого человека.</p>
<p>У Фенелона история начинается сразу с того, что Телемак и Ментор почему-то выброшены бурей на остров бессмертной богини Калипсо — там, где ранее уже провёл много лет Одиссей. Богиня предлагает кораблекрушельным гостям переодеться в сухое, после чего она расскажет им про Одиссея… ну и всё такое. Телемак восхищается предложенным одеянием — тонкая ткань, одно снега белизны, другое багряного цвета с богатым золотым шитьем… И тут начинаются первые же слова Ментора, сказанные строгим голосом:</p>
<p style="padding-left: 40px;">– Такие ли мысли, Телемак, должны занимать сердце сына Улиссова? Поддержать славу родителя, победить судьбу, тебя преследующую – вот что должно быть предметом твоих мыслей! Юноша, любящий, как женщина, драгоценное убранство, недостоин мудрости и славы. Слава есть достояние сердца, которое умеет страдать, отвергая забавы. Страшись, чтобы она не ввергнула тебя в новые бедствия. Страшись обворожительных ее прелестей более, нежели камней под водой. Кораблекрушение, самая смерть не столь опасны, как удовольствия, подмывающие в нас добродетель. Не верь хитрым вымыслам. Юность высокомерна, возлагает всю надежду на свою крепость, слабая трость мечтает быть всемогущей и, никогда не пребывая на страже у сердца, легкомысленно отдает его всякому. Не внимай сладким и льстивым словам коварной Калипсо. Они будут вкрадываться в тебя, как змея под цветами. Трепещи тайного яда, не верь себе и ничего не начинай без совета твоего верного друга.</p>
<p>Мог бы просто врезать палкой по спине. И тэ дэ, и дальше много всякого, чего у Гомера не было в принципе. Отсебятина, короче.</p>
<p>Но эта отсебятина Фенелона внезапно становится сверховерпопулярной, и уже начиная с 18-го века нашей эры имя Ментор во всех европейских странах стало нарицательным для наставника — абстрактного пожилого, умудрённого человека, который передаёт молодёжи свой опыт.</p>
<p style="padding-left: 40px;">А ведь Гомер мог бы назвать упомянутого персонажа иначе, например, Ав]]></description>
<link>https://testitquickly.com/2026/10/03/cauta-ti-mentorul-singurel/</link>
<pubDate>Sat, 03 Oct 2026 01:03:25 +0300</pubDate>
</item>
<item>
<title>Тестирование без требований: оракулы, карта продукта и риск-ориентированный подход</title>
<description><![CDATA[<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Что такое ТЗ в QA?</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: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:paragraph --></p>
<p>Мы публикуем очередной цикл экспертных статей. Теперь речь пойдёт о методологии <a href="https://quality-lab.ru/blog/kogda-my-podklyuchaemsya-v-finale-proekta-spasenie-ili-kontrolnyj-vystrel/" data-type="post" data-id="27704">приёмки</a> для проектов без ТЗ, где требования меняются быстрее, чем вы успеваете дописать тест-кейс. Всего будет 3 части и это первая. В ней мы разбираемся, почему отсутствие ТЗ – это не одна проблема, а целых пять, и почему для решения каждой нужен свой подход.&nbsp;</p>
<p><!-- /wp:paragraph --></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>: не требовать документ, а собирать оракулы (закон, договор, поведение прода, здравый смысл) и строить карту продукта, которая не устаревает. В конце ответим на вопрос, почему про покрытие спрашивать бессмысленно и как его заменить реестром рисков, который понимает бизнес и команда. Статья полезна тестировщикам, QA-лидам и продакт-менеджерам, которые работают на проектах, где требования не приколочены гвоздями.&nbsp;</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":31384,"width":"288px","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="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/10/Testirovanie-bez-trebovanij.png" alt="Testirovanie-bez-trebovanij" class="wp-image-31384" style="width:288px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/Testirovanie-bez-trebovanij.png 512w, https://quality-lab.ru/wp-content/uploads/2026/10/Testirovanie-bez-trebovanij-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/10/Testirovanie-bez-trebovanij-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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">Утро понедельника. Открываешь трекер – «Протестировать личный кабинет, релиз в пятницу». Идёшь за подробностями: чат на 400 сообщений, два макета в Фигме, оба подписаны «финал», а разница между ними – половина экранов. И условный Коля в помощь, который вроде как точно в курсе и передаст контексты, но не факт.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Если у вас так не бывает – вы работаете по ГОСТ 34.602, где требования заморожены. Искренне поздравляем, дальше можно не читать.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Остальных сразу предупреждаем. Статья не о том, как заставить бизнес писать техзадание. Мы пробовали – это работает только там, где за документ платят отдельно. В остальных случаях бизнес по-своему прав: пока продукт ищет форму, подробное ТЗ устаревает быстрее, чем проходит согласование. Речь о том, как выстроить приёмку, которая не разваливается от изменений.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Практики, о которых пойдёт речь, придуманы не нами – на первоисточники мы дадим ссылки. Но имейте ввиду, что они создавались для среды, где в команде есть Product Owner с полномочиями, аналитик и культура письменных договорённостей. У нас чаще иначе: PM, который сам себе аналитик и заказчик, передающий знания голосовыми сообщениями, ну и релиз в пятницу. Поэтому адаптируем под наши реалии.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Почему нет ТЗ: 5 разных причин и что с этим делать</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Первая ошибка, которую многие допускают годами, – реагировать на отсутствие ТЗ одинаково. Хватать чек-лист, идти смотреть продукт, писать вопросы. Иногда срабатывает, но чаще нет. На самом деле, отсутствие ТЗ указывает сразу на 5 проблем на проекте. Самое важное, вовремя понять, с чем имеете дело и построить адекватный план.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<figure style="max-width:1100px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<table style="width:100%; min-width:900px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Дифференциальная диагностика: почему у вас нет требований</caption>
<thead>
<tr>
<th style="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; white-space:nowrap; width:17%;">Диагноз</th>
<th style="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; white-space:nowrap; width:24%;">Как выглядит снаружи</th>
<th style="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; white-space:nowrap; width:29%;">Что работает</th>
<th style="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; white-space:nowrap; width:30%;">Что делает хуже</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Продукт в поиске</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Гипотезы меняются каждые две недели. «Давайте попробуем, а там посмотрим»</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Короткие циклы приёмки, артефакты со сроком жизни в один спринт</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Требовать спецификацию до старта: затормозите поиск и получите документ, который врёт через месяц</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Знание в головах</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Есть 2–3 человека, которые «всё знают». Ответ получить можно, если поймать носителя</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Извлечение знаний: Example Mapping, сессии с записью, журнал решений</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Ждать, пока носители сами напишут. Не напишут: у них в голове всё структурировано, им не больно</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Знание рассыпано</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Документов сорок в четырёх системах, часть противоречит друг другу, актуальной не знает никто</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Карта продукта, ранжирование источников по достоверности, пометки «это протухло»</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Читать всё подряд: утонете и всё равно соберёте неверную картину</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Документ врёт</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">ТЗ толстое и красивое, писалось под тендер. Реальность разошлась с ним процентов на семьдесят</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Сверка с продом на выборке, фиксация дельты, дальше тестирование по факту</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Заводить баги на каждое расхождение: утоните в спорах и потеряете доверие команды</td>
</tr>
<tr>
<td style="padding:14px; color:#1f2937; vertical-align:top; font-weight:700;">Знание утеряно</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Легаси. Авторы уволились в 2019-м. Есть код, логи и живые пользователи, больше ничего</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Характеризующие тесты, анализ логов и БД, поведение прода как эталон</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Спрашивать «а как должно быть?». Источник истины один — то, как оно работает сейчас</td>
</tr>
</tbody>
</table></div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Первое, что я делаю на новом проекте, — ставлю диагноз. Полдня работы, экономия в неделях. Часто диагнозов два-три сразу, на разных подсистемах.</figcaption></figure>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Диагноз ставится быстро. Соберите PM, разработчика и того, кто ближе всех к заказчику, и задайте четыре вопроса.&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 --></ol>
<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>Дальше действуйте по ситуации. Если продукт в поиске – нужны лёгкие артефакты и короткая обратная связь. Если знание утеряно – наоборот, тяжёлая автоматизация поведения: оно как раз стабильное, просто неизвестное. Поймите, одинаковый подход к разным случаям съест бюджет впустую.</p>
<p><!-- /wp:paragraph --></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 {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"id":31386,"width":"310px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/10/Vyyavlenie-trebovanij.png" alt="Vyyavlenie-trebovanij" class="wp-image-31386" style="width:310px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/Vyyavlenie-trebovanij.png 512w, https://quality-lab.ru/wp-content/uploads/2026/10/Vyyavlenie-trebovanij-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/10/Vyyavlenie-trebovanij-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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>Механизм, который позволяет распознать проблему, в теории тестирования называется <span class='font-weight-bold'>оракулом</span>. В нынешнем виде термин оформили Джеймс Бах и Майкл Болтон в рамках подхода <a href="https://www.satisfice.com/">Rapid Software Testing</a>. Суть простая: спецификация – лишь один оракул из десятка, причём не самый надёжный, ведь документ тоже пишет человек. Отсутствие ТЗ означает потерю одного оракула, остальные остаются на месте. Задача тест-инженера без документации – собрать и явно назвать доступные оракулы. Болтон свёл их в мнемонику <a href="https://developsense.com/blog/2012/07/few-hiccupps">FEW HICCUPPS</a>, ниже – наш перевод под российские реалии.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<figure style="max-width:1100px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<table style="width:100%; min-width:850px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Оракулы: чем заменить отсутствующее ТЗ</caption>
<thead>
<tr>
<th style="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; white-space:nowrap; width:19%;">Оракул</th>
<th style="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; white-space:nowrap; width:38%;">Вопрос, который вы задаёте продукту</th>
<th style="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; white-space:nowrap; width:43%;">Где брать на практике</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Прошлое системы</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Раньше эта функция работала иначе. Изменение осознанное или случайное?</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Прод, предыдущий релиз, скриншоты саппорта, записи демо. Самый мощный оракул на легаси</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Внутренняя согласованность</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Почему в одном разделе даты в формате ДД.ММ.ГГГГ, а в соседнем — ISO?</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Сам продукт. Ищется бесплатно, чинится дёшево, заказчиком ценится высоко</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Сравнимые продукты</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Как эту задачу решают те, у кого миллионы пользователей?</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Конкуренты, госуслуги, банковские приложения — для вопроса «мы точно осознанно сделали иначе?»</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Заявленное вовне</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">На лендинге написано «выгрузка в 1С в один клик». Оно так?</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Маркетинг, презентации продажникам, КП, договор. Юридически самое сильное «ТЗ» из имеющихся</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Ожидания пользователя</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Человек нажал «Назад» и потерял заполненную форму. Он этого ждал?</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Обращения в поддержку, отзывы в сторах, записи сессий. Тикеты за квартал — золотая жила</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Назначение</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Зачем эта функция бизнесу? Она эту задачу решает?</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Одно предложение заказчика: «мы это делаем, чтобы ___». Не формулируется — проблема крупнее тестирования</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Стандарты и закон</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Мы обязаны это делать по 152-ФЗ / 54-ФЗ / правилам платёжной системы?</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Регуляторка, ГОСТы, требования НСПК. Единственная категория, где «мы так решили» не аргумент</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Модель данных</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">В базе поле NOT NULL, а форма отправляет пустое. Кто прав?</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Схема БД, миграции, OpenAPI. Технический слепок замысла честнее словесных описаний</td>
</tr>
<tr>
<td style="padding:14px; color:#1f2937; vertical-align:top; font-weight:700;">Здравый смысл</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Мне пришлось перечитать это сообщение об ошибке трижды. Так и было задумано?</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Ваша собственная голова. Самый спорный оракул и одновременно тот, за который вам платят</td>
</tr>
</tbody>
</table></div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Адаптация мнемоники FEW HICCUPPS (M. Bolton). Оракулы не равнозначны: «стандарты и закон» бьёт всё остальное, «здравый смысл» проигрывает любому — но именно он чаще всех первым замечает проблему.</figcaption></figure>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#ece7d9"}}} --></p>
<p class="has-background" style="background-color:#ece7d9"><span class='font-weight-bold'>Из практики</span>. Личный кабинет страховой. Техзадания не было, только переписка за три месяца. Мы выписали оракулы за два дня и в итоге нашли в коммерческом предложении обещание, данное клиенту: <span class='font-weight-bold'>расчёт полиса за 30 секунд</span>. Разработка об этом ничего не знала, а расчёт шёл синхронным запросом к внешнему сервису и в пике занимал до четырёх минут. Проблему нашли до релиза просто потому, что догадались посмотреть коммерческое предложение, а не только трекер.</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>Оракулы говорят, по чему сверять – осталось понять, что сверять.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Карта продукта описывает не поведение системы, а перечень того, что в системе есть. Поэтому от изменения требований она не устаревает, только от изменения состава. Структуру карты можно взять из Heuristic Test Strategy Model Джеймса Баха, там она называется <a href="https://www.satisfice.com/">SFDIPOT</a>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<style>
  .sfdipot-box {
    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);
  }
  .sfdipot-box .sfdipot-title {
    font-size: 17px;
    font-weight: 600;
    color: #22302A;
    margin-bottom: 6px;
  }
  .sfdipot-box .sfdipot-sub {
    font-size: 13.5px;
    color: #53645B;
    margin-bottom: 22px;
  }
  .sfdipot-box .sfdipot-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 12px;
    margin-bottom: 24px;
  }
  .sfdipot-box .sfdipot-card {
    background: #E3EAE1;
    border: 1.5px solid #2B4E6F;
    border-radius: 8px;
    padding: 14px 14px 16px;
  }
  .sfdipot-box .sfdipot-card-title {
    font-size: 14.5px;
    font-weight: 700;
    color: #2B4E6F;
    margin-bottom: 8px;
  }
  .sfdipot-box .sfdipot-card-text {
    font-size: 12.5px;
    color: #22302A;
    line-height: 1.5;
  }
  .sfdipot-box .sfdipot-divider {
    border-top: 1px solid #C6D0C4;
    margin: 0 0 18px;
  }
  .sfdipot-box .sfdipot-list-title {
    font-size: 13.5px;
    font-weight: 600;
    color: #22302A;
    margin-bottom: 14px;
  }
  .sfdipot-box .sfdipot-list {
    display: flex;
    flex-direction: column;
    gap: 10px;
    font-size: 12.5px;
    color: #22302A;
    line-height: 1.5;
  }
  .sfdipot-box .sfdipot-item {
    display: flex;
    gap: 10px;
    align-items: flex-start;
  }
  .sfdipot-box .sfdipot-dot {
    display: inline-block;
    width: 6px;
    height: 6px;
    background: #A33327;
    margin-top: 7px;
    flex-shrink: 0;
  }
  .sfdipot-box .sfdipot-caption {
    font-size: 14px;
    color: #6b7280;
    text-align: center;
    margin-top: 14px;
    font-style: italic;
    line-height: 1.5;
  }</p>
<p>  /* Планшет */
  @media (max-width: 900px) {
    .sfdipot-box .sfdipot-grid {
      grid-template-columns: repeat(2, 1fr);
    }
  }
  /* Мобильный */
  @media (max-width: 560px) {
    .sfdipot-box {
      padding: 18px 16px 20px;
    }
    .sfdipot-box .sfdipot-grid {
      grid-template-columns: 1fr;
      gap: 10px;
    }
    .sfdipot-box .sfdipot-title {
      font-size: 15px;
    }
    .sfdipot-box .sfdipot-sub {
      font-size: 12.5px;
    }
    .sfdipot-box .sfdipot-card-title {
      font-size: 13.5px;
    }
    .sfdipot-box .sfdipot-card-text,
    .sfdipot-box .sfdipot-list {
      font-size: 12px;
    }
  }
</style>
<div class="sfdipot-box">
<div class="sfdipot-title">Семь срезов, по которым раскладывается любая система</div>
<div class="sfdipot-sub">Под каждым срезом — вопрос, который вскрывает пропущенную область тестирования</div>
<div class="sfdipot-grid">
<div class="sfdipot-card">
<div class="sfdipot-card-title">Структура</div>
<div class="sfdipot-card-text">Из каких кусков физически собран продукт?</div>
</p></div>
<div class="sfdipot-card">
<div class="sfdipot-card-title">Функции</div>
<div class="sfdipot-card-text">Что он умеет делать — включая скрытое?</div>
</p></div>
<div class="sfdipot-card">
<div class="sfdipot-card-title">Данные</div>
<div class="sfdipot-card-text">Чем он оперирует и что накопил за годы?</div>
</p></div>
<div class="sfdipot-card">
<div class="sfdipot-card-title">Интерфейсы</div>
<div class="sfdipot-card-text">Через что с ним общаются люди и машины?</div>
</p></div>
<div class="sfdipot-card">
<div class="sfdipot-card-title">Платформа</div>
<div class="sfdipot-card-text">От чего чужого он зависит и не управляет?</div>
</p></div>
<div class="sfdipot-card">
<div class="sfdipot-card-title">Сценарии</div>
<div class="sfdipot-card-text">Как им реально пользуются, а не как задумано?</div>
</p></div>
<div class="sfdipot-card">
<div class="sfdipot-card-title">Время</div>
<div class="sfdipot-card-text">Что ломается от дат?</div>
</p></div>
</p></div>
<div class="sfdipot-divider"></div>
<div class="sfdipot-list-title">Что обычно забывают, когда работают по ТЗ:</div>
<div class="sfdipot-list">
<div class="sfdipot-item"><span class="sfdipot-dot"></span><span>Фоновые задачи и крон — их нет в макетах, но именно они портят отчётность</span></div>
<div class="sfdipot-item"><span class="sfdipot-dot"></span><span>Данные, накопленные за годы: у пользователя 4000 заказов, а список грузит все</span></div>
<div class="sfdipot-item"><span class="sfdipot-dot"></span><span>Административные интерфейсы: их «как-нибудь потом», а через них меняют тарифы</span></div>
<div class="sfdipot-item"><span class="sfdipot-dot"></span><span>Переходы через полночь, конец месяца, 29 февраля, смена тарифного периода</span></div>
<div class="sfdipot-item"><span class="sfdipot-dot"></span><span>Внешние зависимости в состоянии «медленно отвечает», а не «упало»</span></div>
</p></div>
<div class="sfdipot-caption">Модель SFDIPOT из Heuristic Test Strategy Model (J. Bach). Красным — области, которые выпадают из ТЗ систематически: техзадание пишут про то, что видно на макете.</div>
</div>
<p><!-- /wp:html --></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 {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Схема базы и миграции.</span> Здесь за 90 минут выясняется, что типов пользователей три, а рассказывали про два.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Роутинг и точки входа. </span>Займёт час. Все URL и эндпоинты, включая забытые. Плюс OpenAPI, если живой.</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:paragraph {"style":{"color":{"background":"#faedf7"}}} --></p>
<p class="has-background" style="background-color:#faedf7"><span class='font-weight-bold'>Осторожно! </span>Никогда не начинайте с разговоров. Человек описывает не систему, а свою модель системы: ту часть, с которой работал, в том виде, в каком запомнил. Придёте с картой и конкретикой – получите уточнения и опровержения. Придёте с пустым блокнотом – получите пересказ счастливого пути и уйдёте в уверенности, что всё поняли.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Держите карту в вики в виде дерева на 1-2 страницы, чтобы она работала как общий актив: разработчик сможет проверить, не забыл ли админку, PM возьмёт для оценки объёма, новичок за час поймёт устройство продукта. Договоритесь о правиле: карта обновляется в том же PR, где меняется состав системы. Новый эндпоинт – строчка. Это единственный известный нам способ не дать документу устареть.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Как перестать думать про покрытие и начать говорить о рисках?</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":31387,"width":"282px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/10/Reestr-riskov-proekta.png" alt="Reestr-riskov-proekta" class="wp-image-31387" style="width:282px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/10/Reestr-riskov-proekta.png 512w, https://quality-lab.ru/wp-content/uploads/2026/10/Reestr-riskov-proekta-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/10/Reestr-riskov-proekta-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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/testing-requirements/" data-type="post" data-id="6599">покрытия требований</a>? На проекте без ТЗ честный ответ – знаменателя не существует. Но так отвечать нельзя, после этого разговор о качестве просто заканчивается.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Выход есть, и он лучше:</span> говорить не о покрытии, а о <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'><a href="https://www.ministryoftesting.com/">RiskStorming</a></span>. Собираете всю команду на час, обязательно с разработчиками – они знают, где тонко.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Каждое действие не больше 15 минут.</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>Обращайте внимание на перекосы: девять рисков на платежах, а на импорте прайсов ни одного? Это не потому что там безопасно, а потому что про импорт никто не подумал.</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:html --></p>
<figure style="max-width:1000px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="background:#ffffff; border:1px solid #e5eaf2; border-radius:16px; padding:24px 28px 28px; box-shadow:0 4px 20px rgba(0,0,0,0.06);">
<div style="font-size:17px; font-weight:600; color:#22302A; margin-bottom:22px;">Карта рисков релиза: что мы делаем с каждым квадрантом</div>
<p>    <!-- Карточка 1: СТРАХУЕМ --></p>
<div style="background:#F3E7C8; border-left:6px solid #8A6A17; border-radius:8px; padding:16px 20px; margin-bottom:12px;">
<div style="font-size:11px; font-weight:600; color:#53645B; text-transform:uppercase; letter-spacing:0.04em; margin-bottom:6px;">Высокий ущерб · Низкая вероятность</div>
<div style="font-size:13px; font-weight:700; color:#8A6A17; margin-bottom:8px;">СТРАХУЕМ</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Проверяем точечно, закрываем фича-флагом, готовим план отката</div>
<div style="font-size:11.5px; color:#53645B; font-style:italic; margin-top:8px; line-height:1.45;">«Двойное списание при повторной отправке формы»</div>
</p></div>
<p>    <!-- Карточка 2: ГЛУБОКО ТЕСТИРУЕМ --></p>
<div style="background:#F2DAD6; border-left:6px solid #A33327; border-radius:8px; padding:16px 20px; margin-bottom:12px;">
<div style="font-size:11px; font-weight:600; color:#53645B; text-transform:uppercase; letter-spacing:0.04em; margin-bottom:6px;">Высокий ущерб · Высокая вероятность</div>
<div style="font-size:13px; font-weight:700; color:#A33327; margin-bottom:8px;">ГЛУБОКО ТЕСТИРУЕМ</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Сессии + автотесты + мониторинг. Сюда уходит до 60% всего времени</div>
<div style="font-size:11.5px; color:#53645B; font-style:italic; margin-top:8px; line-height:1.45;">«Расчёт скидки по новым правилам лояльности»</div>
</p></div>
<p>    <!-- Карточка 3: ПРИНИМАЕМ --></p>
<div style="background:#EDF0EA; border-left:6px solid #53645B; border-radius:8px; padding:16px 20px; margin-bottom:12px;">
<div style="font-size:11px; font-weight:600; color:#53645B; text-transform:uppercase; letter-spacing:0.04em; margin-bottom:6px;">Низкий ущерб · Низкая вероятность</div>
<div style="font-size:13px; font-weight:700; color:#53645B; margin-bottom:8px;">ПРИНИМАЕМ</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Записываем в протокол и не трогаем. Это тоже решение, и оно осознанное</div>
<div style="font-size:11.5px; color:#53645B; font-style:italic; margin-top:8px; line-height:1.45;">«Съехала вёрстка футера в старом Safari»</div>
</p></div>
<p>    <!-- Карточка 4: ЛОВИМ В ПРОДЕ --></p>
<div style="background:#F3E7C8; border-left:6px solid #8A6A17; border-radius:8px; padding:16px 20px; margin-bottom:22px;">
<div style="font-size:11px; font-weight:600; color:#53645B; text-transform:uppercase; letter-spacing:0.04em; margin-bottom:6px;">Низкий ущерб · Высокая вероятность</div>
<div style="font-size:13px; font-weight:700; color:#8A6A17; margin-bottom:8px;">ЛОВИМ В ПРОДЕ</div>
<div style="font-size:12.5px; color:#22302A; line-height:1.5;">Алерт + быстрый откат дешевле, чем ловить на стенде</div>
<div style="font-size:11.5px; color:#53645B; font-style:italic; margin-top:8px; line-height:1.45;">«Тормозит выгрузка отчёта у крупных клиентов»</div>
</p></div>
<p>    <!-- Правило десяти строк --></p>
<div style="background:#E3EAE1; border:1.5px solid #2B4E6F; border-radius:8px; padding:20px 24px;">
<div style="font-size:15px; font-weight:700; color:#2B4E6F; margin-bottom:14px;">Правило десяти строк</div>
<ul style="margin:0; padding-left:22px; font-size:12.5px; color:#22302A; line-height:1.7;">
<li style="margin-bottom:8px;">На каждый релиз — не больше десяти рисков.</li>
<li style="margin-bottom:8px;">Каждый риск формулируется письменно, в одном месте, с указанием владельца.</li>
<li style="margin-bottom:8px;">Одиннадцатый риск означает, что вы не приоритизировали, а перечислили всё подряд.</li>
<li style="margin-bottom:8px;">Список из сорока рисков не читает никто, включая того, кто его составил.</li>
<li style="margin-bottom:0;">Проверено на себе: наш первый реестр был на 63 пункта.</li>
</ul></div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Отличие от обычной оценки рисков — правый нижний квадрант. Не всё нужно ловить до релиза: иногда алерт и откат за пять минут дешевле недели тестирования.</figcaption></figure>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Потом эти риски нужно перенести в таблицу – она станет основой протокола приёмки. Колонок пять: риск, оценка, что делаем, владелец, статус. Строк тоже около пяти, не сорок – иначе реестр не будет читать никто, включая того, кто его составил. Самая важная строка та, где в статусе стоит «принят»: в этот момент ответственность за решение переходит от тестировщика к бизнесу, причём письменно. Запись вида «вёрстка съезжает в браузерах старше двух лет, доля таких пользователей 0,4%, принимаем» – это полноценная строка реестра, и она закрывает вопрос навсегда.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#ece7d9"}}} --></p>
<p class="has-background" style="background-color:#ece7d9"><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 {"style":{"color":{"background":"#ddf3ed"}}} --></p>
<p class="has-background" style="background-color:#ddf3ed">Если на вашем проекте нет ТЗ, а вопрос про покрытие каждый раз заканчивается неловкой тишиной – запишитесь на бесплатную консультацию. За 30 минут разберём конкретно ваш случай: посмотрим, что болит, и подскажем, как собрать рабочий набор – оракулы, карту продукта, реестр рисков. Поделимся своими <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:paragraph --></p>
<p>Помните, отсутствие ТЗ – это показатель пяти проблем, и каждая решается своим инструментом. Оракулы дают, с чем сравнивать. Карта продукта – что проверять. Реестр рисков заменяет бессмысленный разговор о покрытии тестами. В итоге вы приходите к заказчику не с жалобой на отсутствие требований, а с протоколом: вот критерии приёмки, вот риски, вот что приняли и т.д. Это позиция эксперта и профессионала.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Во второй части будет больше практики. Вы узнаете, как проводить Example Mapping, какие артефакты заводить, как выстроить три контура приёмки и вести журнал решений. Расскажем, на какие метрики смотреть без ТЗ и какие инструменты использовать. Следите за обновлениями!</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/testirovanie-bez-trebovanij-orakuly-karta-produkta-i-risk-orientirovannoe-testirovanie/</link>
<pubDate>Fri, 02 Oct 2026 18:57:00 +0300</pubDate>
</item>
<item>
<title>Курс автоматизации в Postman полностью обновлен!</title>
<description><![CDATA[<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2jahyphenhyphenAz5_H4FZNJc-UPlvTc_mHH8xeRq4dGJEfUTOpMt5bEhmH5wOqQu98MZQ2BIiCfpepqgIX5MEIloM5NNS2LdCLkl-MoPZyqapalVbgQeFU7Nw6PJD8TVJndthA9zbJ8jtj-Ew0_IpR1fzXtO4hsF61oSVhdNulUFYZ3tlsYBGQ08xxiUgWNZo6Cg/s2000/%D0%9F%D1%80%D0%B5%D0%B2%D1%8C%D1%8E%20%D0%B1%D0%B5%D0%B7%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1125" data-original-width="2000" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2jahyphenhyphenAz5_H4FZNJc-UPlvTc_mHH8xeRq4dGJEfUTOpMt5bEhmH5wOqQu98MZQ2BIiCfpepqgIX5MEIloM5NNS2LdCLkl-MoPZyqapalVbgQeFU7Nw6PJD8TVJndthA9zbJ8jtj-Ew0_IpR1fzXtO4hsF61oSVhdNulUFYZ3tlsYBGQ08xxiUgWNZo6Cg/s320/%D0%9F%D1%80%D0%B5%D0%B2%D1%8C%D1%8E%20%D0%B1%D0%B5%D0%B7%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0.png" width="320" /></a></div><br /><p>Когда-то я хотела сделать мини-курс «автоматизируем в Postman», а потом начала делать уроки и-и-и-и... Вышло 14 тем! ????</p><p>Так что <a href="https://testbase.ru/learn/rest-auto-in-postman" target="_blank">курс</a> получился совсем не мини, а даже наоборот. Но этим он и хорош, там разжеваны все основы языка программирования. Мне рассказывал знакомый PM, что после моего курса его сотруднику было проще влиться в автоматизацию.&nbsp;</p><p>Ведь можно научить писать автотесты и за 1-2 урока, но мы подробно разбирали каждую тему, и циклы, и мат. функции, и многое другое. В общем, отличный курс для старта в автоматизации!</p><p>И да, сейчас есть ИИ, я в курсе. Но код за ИИ нужно ревьюить, то есть надо научиться делать руками, чтобы потом отдавать это роботу.&nbsp;Так что курс актуален до сих пор (и тему про ИИ я туда тоже добавила!)</p><p>Но курс был записан давно, и меня периодически тыкали носом в то, что "лекция записана несколько лет назад!". Да, но при этом код продолжал работать. Языки программирования обновляются, а вот функции в постмане остаются.&nbsp;</p><p>Однако «время пришло». Когда я чуток подосвободилась, я решила перезаписать курс и снять эти претензии. Что в итоге получилось?</p><span><a name='more'></a></span><div style="text-align: left;"><b><br /></b></div><h3 style="text-align: left;"><b>Что обновлено</b></h3><div style="text-align: left;"><b><br /></b></div><div style="text-align: left;"><b><br /></b></div><div style="text-align: left;"><b>Видеолекции</b></div><p>Лекции я перезаписала вообще все. Причем некоторые по несколько раз — ведь я переделывала курс больше года ???? Да, это было не так радужно и быстро, как в моих мечтах... Тем более что год назад родилась Катюшка и вот у нас уже двое маленьких погодок на руках...</p><p>В общем, процесс затянулся. А в феврале этого года Postman подложил мне свинью, переделав свой сайт. И вот уже первые лекции снова неактуальны!</p><p>Так что я снова переписала лекции, но уже выборочно — где-то целиком, где-то кусочками. Там, где изменился интерфейс постмана, там, где изменилась его документация...</p><p>Также около года назад я добавила в курс тему про ИИ, в том числе Postbot-a, ИИ от постмана. И вот он за этот год поумнел! И стал спрашивать разрешение на правки, как делают это другие AI-агенты. А год назад я просила исправить один автотест, а он вырезал еще десяток, причем молча.</p><p>Так что и это переписала, показала новое AI. Плюс добавила кусок про Cursor, куда же без него.</p><p>Потом постман сделал функцию загрузки файлов платной — и снова пришлось обновлять лекции.</p><p>В общем, перезаписано все, что-то даже пару раз =))</p><p><br /></p><p><b>Дополнительные материалы</b></p><p>За этот год я написала пачку новых дополнительных материалов, которые добавила в курс. Но все они опубликованы на Хабре или у меня в блоге, так что вы могли их видеть.</p><p>Почистила неактуальные ссылки, добавила новые. В общем, немного причесала доп материалы.</p><p><br /></p><p><b>Домашние задания</b></p><p>Пересмотрела и домашние задания. Я не стала их полностью менять, выкинув все, что уже было. Но посмотрела свежим взглядом:</p><p></p><ul style="text-align: left;"><li>что-то убрала совсем</li><li>что-то сделала необязательным</li><li>что-то немного упростила / изменила</li></ul><div><br /></div><p></p><p><br /></p><h3><b>Вопросы и ответы</b></h3><div><i>1. Я недавно прошел курс, а он теперь новый, могу я увидеть свежие лекции?</i></div><div><br /></div><div>Да, можете! И они есть прямо у вас в СДО. После апреля я дописала пару последних тем, но они чисто обновлены, сам текст лекции не изменился.</div><div><br /></div><div>А потом обновляла записанные в том году лекции — ссылки у них не изменились, так что, открыв сейчас лекцию 1 вы увидете обновленную лекцию. А, может, вы и так на нее попали во время прохождения курса :)</div><div><br /></div><div><br /></div><div><i>2. А если я уже проходил курс, мне есть смысл его повторить?</i></div><div><i><br /></i></div><div>Нет, если вы прошли курс и получили сертификат, то ничего нового не увидите, кроме пары исправленных мест в лекциях. Да, домашние задания я немного поменяла, но не так кардинально, чтобы был интерес.</div><div><br /></div><div>А вот если вы брали курс и забросили его на первых уроках, то можно прийти сейчас на обновленный поток! Только обязательно напишите менеджерам на почту, так как уже проходившим курс будет 50% скидка (если не было возврата).&nbsp;</div>]]></description>
<link>http://okiseleva.blogspot.com/2026/10/postman.html</link>
<pubDate>Thu, 01 Oct 2026 20:01:08 +0300</pubDate>
</item>
<item>
<title>Осторожно, пираты! (бумажные книги на озоне)</title>
<description><![CDATA[<p>Написала мне вчера на почту читательница Ольга. Она купила книгу «SQL. Курс молодого бойца» на Озоне, но что-то пошло не так:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfcDTIC9yg8c8aQ8abg4zBCDUFtkrr0C-BNiY-aNoLR9dFpxhFbE9rYJJhi6PNeAnzfZb6_g66q_KXeXhdWbULusKuTx1-HcSVp9V2omGL9syvJ9m37rvTKcgchmlQW4kNkdORs-bayY_r8uufFBImc3B9JDPg5m6ODc2FIaYzXvul1Oo5cnECii9m0Kw/s909/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="909" data-original-width="471" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfcDTIC9yg8c8aQ8abg4zBCDUFtkrr0C-BNiY-aNoLR9dFpxhFbE9rYJJhi6PNeAnzfZb6_g66q_KXeXhdWbULusKuTx1-HcSVp9V2omGL9syvJ9m37rvTKcgchmlQW4kNkdORs-bayY_r8uufFBImc3B9JDPg5m6ODc2FIaYzXvul1Oo5cnECii9m0Kw/s320/image.png" width="166" /></a></div><p></p><p></p><blockquote><i>Артикул на Озон —&nbsp;&nbsp;<a href="https://www.google.com/url?q=https://www.ozon.ru/product/populyarnyy-samouchitel-po-sql-ot-nazinoy-olgi-nazina-olga-5380148987/" target="_blank">5380148987</a></i></blockquote><a href="https://www.google.com/url?q=https://www.ozon.ru/product/populyarnyy-samouchitel-po-sql-ot-nazinoy-olgi-nazina-olga-5380148987/" target="_blank"></a><p></p><blockquote><p><i>Мне очень кажется что это не ваша книг,&nbsp; а копия. Плохая копия (Буквы плывут, картинки тоже и снизу каждой страницы присутствует какая-то ссылка.&nbsp;</i></p><p><i>Ваши книги у меня уже есть и мне есть с чем сравнить типографскую печать и какую-то «неофициальную» печать.&nbsp;</i></p></blockquote><span><a name='more'></a></span><p>&nbsp;</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi97hFP24MBEa40uXaorl-QYuhLZ_Sdn1-9gl_23sdZzEmEqDTWdKMzFKf2NWV7L8SuabzR408BPmyUIgMeaMVSFbs84DuWxl-zFz01aia8DqPXikRyYoNuCTw2YMiOroGK-0bGBuutqMIOxZdWwT8gIcvaRnoJeEP2S7IhlqmGlowexGLLr31ef5VwUCo/s1020/20260930_203626.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1020" data-original-width="471" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi97hFP24MBEa40uXaorl-QYuhLZ_Sdn1-9gl_23sdZzEmEqDTWdKMzFKf2NWV7L8SuabzR408BPmyUIgMeaMVSFbs84DuWxl-zFz01aia8DqPXikRyYoNuCTw2YMiOroGK-0bGBuutqMIOxZdWwT8gIcvaRnoJeEP2S7IhlqmGlowexGLLr31ef5VwUCo/s320/20260930_203626.jpg" width="148" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoTBZM-b_APtN5BdbhdjSnUpZYaNesgIGkMeVWEQbetdv5rK7B9DQt-QgSUjVDyBHWGKen89xg15U5Dv2dv8IFPxOFVZS3iqQhyphenhyphenlgGHS-6hG1oXCEw2HS1Kuy0Kf1t0VSQWXqfoRyukVf4Lq06KP-VzxjzvMMtS4_FtGhLJkkQHR5FpjpAru8eAWI3Jp0/s1020/20260930_203424.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1020" data-original-width="471" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoTBZM-b_APtN5BdbhdjSnUpZYaNesgIGkMeVWEQbetdv5rK7B9DQt-QgSUjVDyBHWGKen89xg15U5Dv2dv8IFPxOFVZS3iqQhyphenhyphenlgGHS-6hG1oXCEw2HS1Kuy0Kf1t0VSQWXqfoRyukVf4Lq06KP-VzxjzvMMtS4_FtGhLJkkQHR5FpjpAru8eAWI3Jp0/s320/20260930_203424.jpg" width="148" /></a></div><br /><p>Показала издателю, он подтвердил — да, это ПИРАТЫ.</p><p>На это намекает название продавца, явно китайского:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNuY_J0tsoFsiZzbkITfQtcICG25nTKNT9wobpn6KpYof224B_Frj7CLDJTTU7nlm6TnPTvWEUCAbFqjczWPQEJTAm92Qomm5bdRqc9LEdAff-DTRUUmpoe5m90uSrXEvBcodjo_VWxuHG6y_M-Dz4oHN8618F8Oc9u0dcjslcEN7rHUpZzPISud4uAlw/s609/%D0%BF%D0%B8%D1%80%D0%B0%D1%82%D1%8B%20(1).png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="295" data-original-width="609" height="155" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNuY_J0tsoFsiZzbkITfQtcICG25nTKNT9wobpn6KpYof224B_Frj7CLDJTTU7nlm6TnPTvWEUCAbFqjczWPQEJTAm92Qomm5bdRqc9LEdAff-DTRUUmpoe5m90uSrXEvBcodjo_VWxuHG6y_M-Dz4oHN8618F8Oc9u0dcjslcEN7rHUpZzPISud4uAlw/s320/%D0%BF%D0%B8%D1%80%D0%B0%D1%82%D1%8B%20(1).png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div><br /></div>И если некоторые виды товаров китайские отличного качества, подделка бумажных книг к ним не относится. Да и экономия сомнительная, 1400 у китайца и 1800 оригинал. Я бы еще поняла за 400 р такое купить...<div><br /></div><div><div>Чтобы быть уверенным в продавце, лучше брать напрямую у издательства БХФ, они на Озоне — Торговый дом ИКС, <a href="https://www.ozon.ru/product/sql-kurs-molodogo-boytsa-nazina-olga-3457119011/?at=1i-n1_504jUHTa3U0URA457xPji-qAHA&amp;sh=pGmJ8YJb3Q" target="_blank">вот книга про SQL</a>.</div><div><br /></div><div>Тогда, если будет плохая печать, можно писать издателю напрямую и они заменят книгу. С браком работают.&nbsp;</div><div><br /></div><div><div>На что обращать внимание на озоне:</div><div><ul><li>По названию продавца — не китаец (русские названия могут быть партнерами издательства)</li><li>По названию книги — у издательства название четкое, «SQL. Курс молодого бойца», у подделки вместо названия описание книги «Популярный самоучитель по SQL от Назиной Ольги»</li></ul></div></div><div>Цветные книги продавали на Озоне «Линукс-центр», они напрямую у меня брали. Сейчас их там не вижу, тогда оригинал будет только <a href="https://www.avito.ru/brands/i375197875/all/knigi_i_zhurnaly?gdlkerfdnwq=101&amp;page_from=from_item_card&amp;iid=3825610319&amp;sellerId=75a72e6af651a9c5ff805c3ebfcbe3da" target="_blank">у меня на Авито</a>.</div><div><br /></div></div><div>Как-то так. Остерегайтесь подделок, иначе это будут деньги "вникуда" ????</div>]]></description>
<link>http://okiseleva.blogspot.com/2026/10/blog-post.html</link>
<pubDate>Thu, 01 Oct 2026 19:24:24 +0300</pubDate>
</item>
<item>
<title>Автогенерация тестов в IDE: как RAG + LLM превращают ручные сценарии в код</title>
<description><![CDATA[<p><img src="https://software-testing.ru/images/stories/library/11hs/rag.png" mce_src="https://software-testing.ru/images/stories/library/11hs/rag.png" width="400" mce_style="float: left;" style="float: left;" />Автор: Александр Поляков, Управление развития платформенных сервисов кибербезопасности, Департамент „Сервисы“ и безопасности</p><p>
Меня зовут Александр, я из Сбера, лидер по автоматизации в Департаменте Сервисы и Безопасности. В тестировании я около 13 лет, и последние лет 10 занимаюсь автоматизацией и её развитием в своём подразделении.</p><p><br /></p><p>В этой статье расскажу, как с помощью IDE, LLM и RAG‑подхода можно автоматизировать одну из самых рутинных задач автоматизаторов — разработку новых автотестов по ручным сценариям, и при этом сохранять стиль и архитектуру проекта.</p><h2>Где мы сейчас: ИИ уже в разработке, но почти не в автотестах</h2><p>По данным <a href="https://survey.stackoverflow.co/2025" mce_href="https://survey.stackoverflow.co/2025" target="_blank">недавнего опроса StackOverflow</a>, 84% разработчиков постоянно используют ИИ‑ассистенты в своей работе. Для них это такой же привычный инструмент, как IDE или Git.</p><p>Как обычно работает подобный ИИ‑помощник в IDE:</p><ul><li><p>анализирует открытые файлы;</p></li><li><p>дополнительно смотрит на соседние файлы в проекте;</p></li><li><p>учитывает локальный контекст: какие вопросы вы задавали и какой код меняли.</p></li></ul><p>А вот автотестировщики часто оказываются как будто «на обочине» этой ИИ‑революции.</p>]]></description>
<link>https://www.software-testing.ru/library/testing/testing-automation/4562-rag-llm</link>
<pubDate>Tue, 29 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/generating-random-test-data.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/generating-random-test-data.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Майкл Болтон (Michael Bolton)<br /><strong><a href="https://developsense.com/blog/2025/07/experiment-generating-random-test-data" mce_href="https://developsense.com/blog/2025/07/experiment-generating-random-test-data" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><p>Как можно использовать GPT в тестировании? Некоторые предлагают использовать его для генерации тестовых данных. Случайные тестовые данные могут помочь предвзятости меньше влиять на тестирование.</p>
<p>Можно предположить, что заставить бота генерировать случайные данные по простому промпту — это легко. Поэтому я провёл небольшой разовый эксперимент «<a href="https://developsense.com/blog/2024/05/the-first-hurdle-heuristic" mce_href="https://developsense.com/blog/2024/05/the-first-hurdle-heuristic">первого барьера</a>» 24 июля 2025 года, используя Google Gemini 2.5. Здесь отмечу случаи, соответствующие пунктам из нашего списка <a href="https://developsense.com/large-language-model-syndromes" mce_href="https://developsense.com/large-language-model-syndromes">синдромов больших языковых моделей</a> — шаблонов неправильного поведения, которые мы с Джеймсом Бахом наблюдали у LLM.</p>
<p>Сторонники ИИ часто делают чрезмерно громкие заявления о том, что GPT может делать что-то «как человек» — и нередко намекают, что GPT лучше людей, потому что быстрее и имеет мгновенный доступ к информации в интернете. Чтобы это было правдой, нужно на разумных основаниях ожидать, что GPT выполнит задачу так, как было запрошено, и учтёт возможные недопонимания по ходу дела. Это ожидание не оправдывается.</p>]]></description>
<link>https://www.software-testing.ru/library/testing/test-analysis/4540-experiment-generating-random-test-data</link>
<pubDate>Sun, 27 Sep 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Синтетические данные для тестирования: практика, типичные ошибки и экономика внедрения</title>
<description><![CDATA[<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>Наш ведущий эксперт Олег подготовил цикл из трёх материалов о том, как построить конвейер синтетических данных для тестирования, чистых с юридической точки зрения и, при этом, годных для качественных проверок. В <a href="https://quality-lab.ru/blog/sinteticheskie-dannye-dlya-testirovaniya-metodologiya-masshtab-i-kontrol-privatnosti/" data-type="post" data-id="31279">первой части</a> речь шла о регуляторных границах, во <a href="https://quality-lab.ru/blog/7-shagov-k-konvejeru-sinteticheskix-dannyx-dlya-testirovaniya/" data-type="post" data-id="31308">второй части</a> &#8212; пошаговая инструкция по запуску конвейера синтетических данных в промышленных масштабах.</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":31355,"width":"312px","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="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/09/testovyj-kontur-1.png" alt="testovyj-kontur-1" class="wp-image-31355" style="width:312px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/testovyj-kontur-1.png 512w, https://quality-lab.ru/wp-content/uploads/2026/09/testovyj-kontur-1-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/testovyj-kontur-1-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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">В заключительной статье Олег разберёт российскую специфику: ИНН, СНИЛС, ФИАС, паспортные данные и часовые пояса. Расскажет о трёх реальных кейсах – с конкретными цифрами до и после. Покажет инструменты, применимые в российских реалиях, посчитает экономику внедрения и даст план, по которому команда сможет получить первый рабочий домен за 90 дней.</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>Это та часть, с которой нельзя работать по шаблону. Международные инструменты в российских реалиях могут выдавать номер социального страхования вместо СНИЛС и адрес в формате улица, город, штат. Даже локаль <em>ru_RU</em> в популярных библиотеках выдаёт правдоподобные строки, которые не проходят валидацию.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Следствие простое и обидное: сгенерируете ИНН как двенадцать случайных цифр – на входном валидаторе отвалится примерно 90% записей. Вы будете тестировать не систему, а свой генератор. И узнаете об этом дня через три.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<figure style="max-width:1100px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">    </p>
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<p></p>
<table style="width:100%; min-width:950px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Правила, которые придётся написать самим</caption>
<thead>
<tr>
<th style="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; white-space:nowrap; width:15%;">Атрибут</th>
<th style="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; white-space:nowrap; width:33%;">Как ломается по умолчанию</th>
<th style="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; white-space:nowrap; width:34%;">Как делать</th>
<th style="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; white-space:nowrap; width:18%;">Источник справочника</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">ИНН</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Случайные цифры не проходят проверку контрольного разряда</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Генерировать первые 9 (или 10) цифр, считать контрольные по весовым коэффициентам. Для юрлица — следить, чтобы первые две цифры соответствовали региону из адреса</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Алгоритм ФНС, коды регионов</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">СНИЛС</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">То же самое плюс забывают про правило «остаток 100 или 101 даёт 00»</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Веса 9…1 по девяти цифрам, остаток от деления на 101, особый случай для 100 и 101</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Алгоритм СФР</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">КПП, ОГРН, БИК</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Генерируются независимо от ИНН — и получается юрлицо из Владивостока с московским КПП</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Генерировать связкой: регион &#8212; ИНН &#8212; КПП &#8212; БИК обслуживающего банка. Связность важнее правдоподобия отдельных полей</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Справочник БИК, коды регионов</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Номер карты</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Алгоритм Луна соблюли, а БИН взяли реальный действующий — и получили номер, который может существовать</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Луна плюс БИН из тестовых диапазонов платёжных систем. Никогда не используйте боевые БИН своего банка</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Тестовые диапазоны платёжных систем</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Номер телефона</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Все записи вида +7 999 000-00-00, либо реальные существующие номера — и рассылка из тестового контура уходит живым людям</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">В России нет зарезервированного диапазона по аналогии с американскими 555. Берите неназначенные диапазоны из реестра нумерации и держите отдельный чёрный список</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Реестр российской системы и плана нумерации (открытые данные Минцифры), выгрузки ЦНИИС</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Адрес</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Готовые локали склеивают случайный город со случайной улицей и случайным индексом. Валидатор адреса такое отбрасывает</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Идти сверху вниз по иерархии ФИАС/ГАР: регион &#8212; город &#8212; улица &#8212; существующий дом &#8212; индекс этого дома</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">ФИАС / ГАР</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Паспорт</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Серия не соответствует региону выдачи, дата выдачи раньше даты рождения, возраст не бьётся с обязательной заменой в 20 и 45 лет</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Серия = код региона + год выпуска бланка; проверять правило замены документа по возрасту</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Коды регионов</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">ФИО</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Транслит или короткие латинские строки. Ломается сортировка, ширина колонок, поиск</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Кириллица, обязательно «ё», двойные фамилии, отчества на -оглы и -кызы, склонения в тех местах, где система их показывает</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">частотные словари имён</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Даты и время</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Всё в UTC либо всё в московском времени</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Одиннадцать часовых поясов в одной таблице. Отдельно — исторические данные до 2014 года, где был переход на летнее время</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">tzdata</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Календарь нагрузки</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Равномерное распределение дат по году</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Производственный календарь: провалы 1–8 января и 9 мая, пики перед праздниками, всплеск в дни зарплат (обычно 5-е и 20-е числа)</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">производственный календарь</td>
</tr>
<tr>
<td style="padding:14px; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Суммы и НДС</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Нормальное распределение сумм и одна ставка НДС</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Логнормаль плюс «магнит» на круглые суммы (1000, 5000). Ставки 20 / 10 / 0 в правильных пропорциях по видам товаров, банковское округление</td>
<td style="padding:14px; color:#6b7280; vertical-align:top;">—</td>
</tr>
</tbody>
</table>
<p>    </div>
<p>  </div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Правила, которые придётся написать самим. Хорошая новость: это пишется один раз и переиспользуется на всех проектах. У меня эта библиотека живёт уже пятый год и обросла тестами толще, чем сам генератор.</figcaption></figure>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Отдельно про кириллицу – здесь я как-то потерял два дня</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#ece7d9"}}} --></p>
<p class="has-background" style="background-color:#ece7d9">В разных колляциях буква ё встаёт то после е, то в конце алфавита, и результат сортировки по полю ФИО на синтетике отличается от прода. Если автотесты сравнивают выдачу списка построчно, вы получите красные тесты на ровном месте и потратите день на выяснение, почему база сортирует не так, как ожидал разработчик. <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>Три истории для понимания. Компании и цифры изменены из-за NDA, но ситуации повторяются от проекта к проекту.</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":"#faedf7"}}} --></p>
<p class="has-background" style="background-color:#faedf7"><span class='font-weight-bold'><em>Стенд был зелёный, но прод лёг через 40 минут после релиза</em></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>Нагрузочный контур на 1,2 млрд транзакций. Данные сгенерировали честно, но равномерно: мерчантов раскидали поровну по 40 тыс. значений, даты распределили ровно по трём годам. Тесты показывали p99 в 180 мс, релиз выпустили. Через 40 минут после выкатки p99 на проде достиг 4,2 секунды, и дежурная смена откатывала всё вручную.</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>Два распределения оказались сломанными, и казалось, что это мелочи. А ещё была скошенность. В проде 0,4% мерчантов давали 61% трафика. На равномерных данных планировщик оценивал селективность как одну сорокатысячную и выбирал индексный доступ. В проде для горячих мерчантов эта оценка врала в сотни раз, и план запроса разваливался в чтение половины таблицы.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Профиль партиций. </span>Данные равномерно распределены по трём годам, а в проде 70% объёма приходится на последние 90 дней. Горячая партиция на стенде была в 12 раз меньше реальной и целиком помещалась в память.</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>Обучили копула-модель на срезе в 30 млн строк – заняло 40 минут, без GPU. Вытащили распределение мерчантов: закон Ципфа с показателем около 1,1, профиль по часам суток, долю возвратов, распределение сумм. Размножили до 1,3 млрд строк на восьми воркерах, добавили 900 записей из каталога патологий и, что оказалось важным, перемешали данные перед загрузкой.</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>
<div style="max-width:960px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">    </p>
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<p></p>
<table style="width:100%; min-width:640px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Сравнение стендов «до» и «после»</caption>
<thead>
<tr>
<th style="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; white-space:nowrap;">Показатель</th>
<th style="background:#f8faff; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.06em; color:#6b7280; padding:12px 14px; text-align:right; border-bottom:2px solid #e5eaf2; white-space:nowrap;">Прод</th>
<th style="background:#f8faff; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.06em; color:#6b7280; padding:12px 14px; text-align:right; border-bottom:2px solid #e5eaf2; white-space:nowrap;">Стенд «до»</th>
<th style="background:#f8faff; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.06em; color:#6b7280; padding:12px 14px; text-align:right; border-bottom:2px solid #e5eaf2; white-space:nowrap;">Стенд «после»</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">p99 на проблемном запросе</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">4 200 мс</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#dc2626; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">180 мс</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">3 800 мс</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Джини по мерчантам</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">0,81</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#dc2626; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">0,02</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">0,79</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Доля объёма в последних 90 днях</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">70%</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#dc2626; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">8%</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">69%</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Размер таблицы на диске</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">4,1 ТБ</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#dc2626; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">1,6 ТБ</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">4,0 ТБ</td>
</tr>
<tr>
<td style="padding:14px; color:#374151; vertical-align:top;">Совпадение планов на топ-50 запросов</td>
<td style="padding:14px; color:#6b7280; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">—</td>
<td style="padding:14px; color:#dc2626; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">54%</td>
<td style="padding:14px; color:#16a34a; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">94%</td>
</tr>
</tbody>
</table>
<p>    </div>
<p>  </div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Дальше всё пошло легче: стенд стал ошибаться в ту же сторону, что и прод. Нашли три проблемных запроса, два переписали, к одному добавили индекс – p99 упал до 240 мс. Генерация 1,3 млрд строк заняла около четырёх часов.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#ece7d9"}}} --></p>
<p class="has-background" style="background-color:#ece7d9"><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 {"style":{"color":{"background":"#faedf7"}}} --></p>
<p class="has-background" style="background-color:#faedf7"><span class='font-weight-bold'><em>Модель запомнила семь наших маячков – значит, запомнила и пациентов</em></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>40 млн текстовых протоколов приёма. Данные нужны для тестирования поиска и извлечения сущностей: без реальных текстов поиск не проверить, а реальные тексты – это специальная категория персональных данных, и за их утечку штрафуют на 10–15 млн.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Взяли локальную русскоязычную модель на 7 млрд параметров, дообучили на срезе из 2 млн протоколов, сгенерировали 12 млн новых. Метрики похожести – отличные, различимость 0,54. Врачи читали и говорили: выглядит как настоящее.</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>Перед обучением мы спрятали в срез 500 маячков – вымышленных пациентов с редкой фамилией, редким диагнозом и точной датой рождения. После генерации простой поиск нашёл семь маячков почти дословно, а один – с полной датой и фамилией в одном предложении. Значит, модель буквально воспроизводит обучающие записи. И если она вытащила наши маячки, то вытащила и реальных пациентов – просто мы их не узнаём.</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":31357,"width":"286px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/09/testovye-dannye-it.png" alt="testovye-dannye-it" class="wp-image-31357" style="width:286px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/testovye-dannye-it.png 512w, https://quality-lab.ru/wp-content/uploads/2026/09/testovye-dannye-it-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/testovye-dannye-it-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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">Вылезло и второе: 0,6% сгенерированных протоколов содержат настоящие названия отделений и фамилии врачей. Их не считали персональными данными – зря. Фамилия врача + отделение + дата – это почти паспорт человека.</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>Убрали дубликаты из обучающего среза через MinHash с порогом 0,8 – выкинули 11% записей, в основном шаблонные протоколы. Сократили обучение с 8 эпох до 2: похожесть почти не просела, а запоминание упало резко. Подняли температуру до 0,9, ограничили top-p до 0,92. Добавили пост-фильтр: если запись совпадает с обучающей на 8-грамму длиннее 60 символов – выбрасываем. Теряли около 0,4%, терпимо. Включили фамилии врачей и названия отделений в список замещаемых сущностей.</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>Маячки перестали появляться на трёх прогонах подряд. Качество поиска на синтетике осталось в пределах 4% от реальных данных – для регрессии годится. Проверка на маячки теперь живёт в CI и занимает восемь минут.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#ece7d9"}}} --></p>
<p class="has-background" style="background-color:#ece7d9"><span class='font-weight-bold'>Вывод:</span> без активной проверки на запоминание вы не узнаете, что модель плывёт. Метрики похожести этого не показывают – наоборот, чем сильнее модель запомнила, тем красивее у неё метрики.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Кейс третий: крупный ритейл, 11 систем</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#faedf7"}}} --></p>
<p class="has-background" style="background-color:#faedf7"><span class='font-weight-bold'><em>60% сквозных тестов падали не из-за багов</em></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>11 систем: сайт, приложение, CRM, склад, доставка, лояльность, биллинг, поддержка, аналитика и две партнёрские интеграции. Каждая маскировала данные по-своему, со своим ключом. В итоге 8827 клиент в CRM не имел ничего общего с клиентом 8827 в биллинге. Простой сценарий – оформил заказ, оплатил, вернул часть, получил бонусы – разваливался на втором шаге. Команда сквозного тестирования тратила около 60% времени на разбор падений, вызванных не багами, а рассогласованием данных.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Отдельным удовольствием была подготовка окружения: заявка в ИБ, согласование, работа DBA, маскирование, выгрузка – 9 рабочих дней в среднем при двухнедельных спринтах.</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>Ввели единый сервис идентичности: псевдоним считается детерминированно через HMAC-SHA256 от натурального ключа сущности с общей солью, соль лежит в защищённом хранилище. Один реальный клиент во всех 11 системах превращается в одного и того же синтетического – без обмена данными и без общей таблицы соответствий.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Второе решение не менее важное: генерировать не поля, а личность целиком. ФИО, телефон, адрес, документы, дата рождения, пол – один согласованный объект, который потом раскладывается по системам. Раньше каждая система генерировала своё, и получался клиент по имени Мария Петрович с мужским обращением в письмах.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Третье: срез вместо полной копии. Обошли граф из 340 таблиц и 1 100 внешних ключей, взяли связный подграф на 2,5% клиентов – 50 ГБ вместо 6 ТБ.</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>
<div style="max-width:820px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">    </p>
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<table style="width:100%; min-width:520px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Что изменилось после перехода на синтетику</caption>
<thead>
<tr>
<th style="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;">Показатель</th>
<th style="background:#f8faff; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.06em; color:#6b7280; padding:12px 14px; text-align:right; border-bottom:2px solid #e5eaf2; white-space:nowrap;">Было</th>
<th style="background:#f8faff; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.06em; color:#6b7280; padding:12px 14px; text-align:right; border-bottom:2px solid #e5eaf2; white-space:nowrap;">Стало</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Падения сквозных тестов из-за данных</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#dc2626; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">60%</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">4%</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Подготовка окружения</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#dc2626; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">9 рабочих дней</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">40 минут по кнопке</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Объём тестового контура</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">6 ТБ × 14 команд</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">50 ГБ × 14 команд</td>
</tr>
<tr>
<td style="padding:14px; color:#374151; vertical-align:top;">Систем с реальными ПДн в тестовом контуре</td>
<td style="padding:14px; color:#dc2626; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">11</td>
<td style="padding:14px; color:#16a34a; vertical-align:top; text-align:right; font-weight:600; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:13px; white-space:nowrap;">0</td>
</tr>
</tbody>
</table>
<p>    </div>
<p>  </div>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#ece7d9"}}} --></p>
<p class="has-background" style="background-color:#ece7d9"><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: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> Прямое нарушение приказа № 140 – совместное хранение запрещено. А это ровно то, что делает CREATE TABLE clients_masked AS SELECT &#8230; в той же базе.</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'>Забыли про NULL.</span> В проде 12% пустых, в синтетике ноль. Ни одного падения на пустом значении не поймали – все сразу пришлось ловить уже на проде.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Не зафиксировали seed.</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> Через год сорок терабайт «на всякий случай», и никто не помнит, где среди них выгрузка двухлетней давности с настоящими ПДн. Ставьте TTL сразу, потом не соберётесь.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Сделали данные чище прода.</span> В боевой базе грязь, битые кодировки, «Ошибка» в поле «Город» и клиенты, зарегистрированные в 1970 году. Грязь надо воспроизводить намеренно и в правильной доле.</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:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":31356,"width":"302px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="512" height="512" src="https://quality-lab.ru/wp-content/uploads/2026/09/testovyj-kontur-v-rossii.png" alt="testovyj-kontur-v-rossii" class="wp-image-31356" style="width:302px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/testovyj-kontur-v-rossii.png 512w, https://quality-lab.ru/wp-content/uploads/2026/09/testovyj-kontur-v-rossii-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/testovyj-kontur-v-rossii-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></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">Ландшафт собран по слоям, а не по вендорам: вендоры меняются, слои – нет. Часть зарубежных платформ недоступна, а часть неприменима просто потому, что это SaaS – данные для обучения из периметра не выпускают. Открытые библиотеки при этом ставятся локально и работают у всех одинаково.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:html --></p>
<figure style="max-width:1100px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">    </p>
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<p></p>
<table style="width:100%; min-width:950px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Стек инструментов по слоям</caption>
<thead>
<tr>
<th style="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; width:16%;">Слой</th>
<th style="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; width:29%;">Международная практика</th>
<th style="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; width:29%;">Что применимо в РФ</th>
<th style="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; width:26%;">Комментарий</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Поиск чувствительных данных и профилирование</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Microsoft Presidio, ydata-profiling, Great Expectations, Soda</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Всё перечисленное ставится локально; из коммерческих — «Гарда Data Masking» с ML-поиском ПДн, решения InfoWatch</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Начните с открытых, коробочное берите, когда схема больше пары тысяч таблиц</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Табличный синтез</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">SDV (GaussianCopula, CTGAN, TVAE, CopulaGAN), synthpop, Gretel, MOSTLY AI, Tonic, Syntho, Hazy, K2view</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">SDV и synthpop — локально, без ограничений. Из отечественного развивается сервис SyntData у Сбера</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">SaaS-платформы отпадают сами: данные для обучения наружу не выпустишь</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Последовательности и временные ряды</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">PAR из SDV, TimeGAN, DoppelGANger</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">То же самое, всё открытое</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Марковская цепь плюс распределение интервалов часто не хуже и в разы дешевле</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Текст</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Крупные LLM через API + Presidio для деидентификации</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Только self-hosted модели с хорошим русским. Для NER — Natasha, Slovnet, DeepPavlov</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Отправлять реальные ПДн во внешний API нельзя. Обучать на них — только локально</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Правила и фикстуры</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Faker, Mockaroo, Datafaker, dsdgen из TPC-DS</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Faker с локалью <code style="background:#f0f2f5; padding:2px 6px; border-radius:4px; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px;">ru_RU</code>, Mimesis — плюс обязательная своя надстройка под контрольные суммы и справочники</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Это тот слой, который вы всё равно допишете сами. Заложите на него две-три недели</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Маскирование и подмена</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Delphix, Informatica TDM, IBM Optim</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">«Гарда Data Masking», решения на <code style="background:#f0f2f5; padding:2px 6px; border-radius:4px; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px;">pgcrypto</code> и FF1</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Помните: обратимое маскирование не выводит данные из-под 152-ФЗ</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Масштабирование до терабайт</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Spark, Trino, dbt</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Spark, ClickHouse (<code style="background:#f0f2f5; padding:2px 6px; border-radius:4px; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px;">numbers_mt</code>, <code style="background:#f0f2f5; padding:2px 6px; border-radius:4px; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px;">generateRandom</code>, словари), Greenplum и его российские сборки, YTsaurus</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">ClickHouse на генерации плоских таблиц вне конкуренции по скорости</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Оценка качества и приватности</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">SDMetrics, Anonymeter, TAPAS</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Всё открытое, работает. Как рамка для отчётности — ПНСТ 1066-2026</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">Отчёт по ПНСТ — то, что теперь спрашивают на комитете вместо рассуждений</td>
</tr>
<tr>
<td style="padding:14px; color:#1f2937; vertical-align:top; font-weight:700;">Оркестрация и доставка</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Airflow, Dagster, Tonic Ephemeral</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Airflow, NiFi, собственный сервис выдачи окружений</td>
<td style="padding:14px; color:#6b7280; vertical-align:top;">Цель — «данные по кнопке за минуты», а не «заявка в ИБ на девять дней»</td>
</tr>
</tbody>
</table>
<p>    </div>
<p>  </div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Никакой инструмент не закрывает всю цепочку. Реалистичный стек — это пять-шесть открытых библиотек, одна коммерческая система маскирования и примерно три тысячи строк своего кода под российскую специфику и каталог патологий.</figcaption></figure>
<p><!-- /wp:html --></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:html --></p>
<figure style="max-width:1050px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">    </p>
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<p></p>
<table style="width:100%; min-width:800px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Из чего складывается экономический эффект</caption>
<thead>
<tr>
<th style="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; width:26%;">Статья</th>
<th style="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; width:39%;">Как считать</th>
<th style="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; width:35%;">Пример: 14 команд, 24 спринта в год</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">1. Простой в ожидании данных</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Дней ожидания × число команд × спринтов × стоимость дня команды</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">2 дня × 14 × 24 × 180 тыс. ₽ ≈ <b style="color:#1f2937;">121 млн ₽ в год</b></td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">2. Дефекты, пропущенные из-за нерепрезентативных данных</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Доля инцидентов прода, помеченных «на тесте не воспроизводилось» × средняя стоимость инцидента</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">18 инцидентов × 1,4 млн ₽ ≈ <b style="color:#1f2937;">25 млн ₽ в год</b></td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">3. Хранение и сопровождение копий</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Терабайты × число контуров × стоимость хранения и администрирования</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">6 ТБ × 14 × стоимость СХД и работ ≈ <b style="color:#1f2937;">8–12 млн ₽ в год</b></td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">4. Хвостовой риск утечки</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Вероятность × размер штрафа плюс репутационные потери. По 420-ФЗ для повторного нарушения — 1–3% годовой выручки, минимум 25 млн</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Считается отдельно, но именно эта строчка снимает вопросы у правления</td>
</tr>
<tr>
<td style="padding:14px; color:#1f2]]></description>
<link>https://quality-lab.ru/blog/sinteticheskie-dannye-dlya-testirovaniya-praktika-tipichnye-oshibki-i-ekonomika-vnedreniya/</link>
<pubDate>Fri, 25 Sep 2026 18:04:10 +0300</pubDate>
</item>
<item>
<title>А я тебе говорю, оно работает! (ИИ косячит)</title>
<description><![CDATA[<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg80umhHm5E50iajl3Mk4QXtQmv3wzcu6O9ZAJeDdUHQDx817cCys_JNN1GeMzuv-v6nfk3Hahoqx6pzc6HwG1HE7NgvdzdGjkC-gALUFFFy2VINw1GpY_QXDPpZ-Y9d-hRWOsX6wG132DiotmW9C7GXVcJ64WQLsdiw4fCPSwnTVyOTFiOalagCNDFUrg/s1376/1790187711e44e.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1376" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg80umhHm5E50iajl3Mk4QXtQmv3wzcu6O9ZAJeDdUHQDx817cCys_JNN1GeMzuv-v6nfk3Hahoqx6pzc6HwG1HE7NgvdzdGjkC-gALUFFFy2VINw1GpY_QXDPpZ-Y9d-hRWOsX6wG132DiotmW9C7GXVcJ64WQLsdiw4fCPSwnTVyOTFiOalagCNDFUrg/s320/1790187711e44e.png" width="320" /></a></div><p></p><p>Продолжаю рассказывать про косяки ИИ. Нужно всегда помнить, что за ним глаз да глаз нужен!</p><p>Есть у меня задача, я ее проверила уже вручную — все работает. Осталось автотесты написать. Это можно и ИИ делегировать, особенно если "списать" неоткуда.</p><p></p><ul style="text-align: left;"><li>Создала папку с автотестом,&nbsp;</li><li>накидала куда примерный запрос-ответ (SOAP-метод),&nbsp;</li><li>добавила description.md, описав тест</li><li>отдала это Курсору — на, поправь тест</li></ul><div>Обычно он нормально тесты правит, посмотрит на падение, почитает описание теста и все сделает. Но тут я смотрю — в код полез! И пишет такой:</div><span><a name='more'></a></span><div><br /></div><div><blockquote>А вот в методе save в ответе не считывается вот этот блок, я исправил такой-то Java-класс, и теперь тест зеленый!</blockquote></div><div><br /></div><div>Стоп-стоп-стоп! Я же проверяла вручную, оно работало. Но, может, в тесте меня угораздило попасть в какой-то другой класс эквивалентности?&nbsp;</div><div><br /></div><div>Уточнила у Курсора:</div><div><br /></div><div>— Но у меня вручную все работаело. Как воспроизвести вручную?</div><div>— Ты, наверное, не в ответ от save смотрела, а потом другой метод дергала. Смотри, делай раз, делай два... (выдал инструкцию)</div><div><br /></div><div>Ок, пойдем проверять. Сервер приложения я поднимаю локально, но он тяжелый, не взлетает, когда открыто IDE + Cursor. Так что ИИ закрыла, сервер подняла, у меня как раз была сборка до этих изменений. Сижу, проверяю. Хм, все работает...</div><div><br /></div><div>Погасила сервер, пошла дальше общаться с ИИ:</div><div><br /></div><div>— Вручную работает!</div><div>— Ты, наверное, не тот метод смотришь (ля-ля-ля тот же текст, что говорил в прошлый раз)</div><div>— Нет, я смотрю именно текущий save!</div><div>— Да ты гонишь! (он другими словами это говорит, но смысл именно такой)</div><div><br /></div><div>Попрепиралась, пошла через командную строку тест запустить, проверить. И тут вижу, Курсор написал на мое последнее сообщение:</div><div><br /></div><div>— А, да, откатил правку кода, а тест остался зеленым.</div><div><br /></div><div>????????</div><div><br /></div><div>А сначала то как напугал! Я то уж думала "ща, пара тестиков и задачу закрываю", а тут баг! Это ж надо к разработчику идти, чтобы он проревьюил код ИИ, внес эти правки, потом думать, какие тесты еще написать...&nbsp;</div><div><br /></div><div>Ну а чтобы не идти с "ой, мне тут ИИ насоветовал", решила перепроверить. И не зря!</div><div><br /></div><div>Мораль сей басни такова — ИИ как типичный разработчик, нет ему веры ???? Всегда проверяйте, что он там насочинял в коде =)</div><div><br /></div><p></p>]]></description>
<link>http://okiseleva.blogspot.com/2026/09/blog-post.html</link>
<pubDate>Wed, 23 Sep 2026 21:58:49 +0300</pubDate>
</item>
<item>
<title>7 шагов к конвейеру синтетических данных для тестирования</title>
<description><![CDATA[<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:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p>Наш ведущий эксперт Олег написал цикл из трёх статей, где пошагово показывает, как построить конвейер для обезличенных данных в промышленных объёмах и убедиться, что всё работает корректно. В <a href="https://quality-lab.ru/blog/sinteticheskie-dannye-dlya-testirovaniya-metodologiya-masshtab-i-kontrol-privatnosti/" data-type="post" data-id="31279">первой части</a> разобрались, где заканчивается маскирование и начинается синтез, и почему граница между ними не техническая, а правовая.</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":31312,"width":"355px","height":"auto","sizeSlug":"full","linkDestination":"none"} --></p>
<figure class="wp-block-image size-full is-resized"><img fetchpriority="high" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/09/sinteticheskie-dannye-vmesto-boevyh.png" alt="sinteticheskie-dannye-vmesto-boevyh" class="wp-image-31312" style="width:355px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/sinteticheskie-dannye-vmesto-boevyh.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/sinteticheskie-dannye-vmesto-boevyh-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/sinteticheskie-dannye-vmesto-boevyh-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/09/sinteticheskie-dannye-vmesto-boevyh-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">Теперь переходим к практике: от минимизации хаоса в тестовых данных до автоматизации за 7 шагов. Порядок действий здесь важен: пропустите первый – развалится третий и т.д. Это проверенный на практике план, поэтому лучше придерживаться указанной методологии.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Шаг 1. Инвентаризация и профилирование: этап, который вечно хотят пропустить</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Кажется, понять, что лежит в базе, проще простого. Но если посмотреть на реальные данные, а не на названия колонок, картина оказывается другой. На каждом проекте я повторяю одно и то же: классифицировать поля нужно по содержимому, а не по именам. В колонке <em>field_17</em> в старой таблице легко может оказаться что-то вроде паспортных данных, тогда как колонка с красивым именем <em>passport</em> пуста с 2019 года. Автоматический классификатор, который смотрит на заголовки, найдет <em>passport</em> и пропустит <em>field_17</em>, а отвечать за утечку придется именно за <em>field_17</em>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Для каждого поля нужно выяснить: какой там тип данных, сколько пустых значений – и отдельно пустых строк. Это не одно и то же, и разница между ними ломает код чаще, чем кажется. Ещё считаем количество уникальных значений и полезно собрать топ-20 из них, чтобы посмотреть их суммарную долю – так сразу видны перекосы в распределении. Вместо средней длины строки нагляднее строить гистограмму распределения длин.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Что почти всегда всплывает и портит планы?</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":31311,"width":"300px","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/09/testovye-dannye-dlya-testirovaniya.png" alt="testovye-dannye-dlya-testirovaniya" class="wp-image-31311" style="width:300px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/testovye-dannye-dlya-testirovaniya.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/testovye-dannye-dlya-testirovaniya-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/testovye-dannye-dlya-testirovaniya-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/09/testovye-dannye-dlya-testirovaniya-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:paragraph --></p>
<p><span class='font-weight-bold'>Инструменты:</span> <span class='font-weight-bold'>ydata-profiling</span> для быстрого старта, <span class='font-weight-bold'>Great Expectations</span> или <span class='font-weight-bold'>Soda</span> для повторяемых проверок, обычный <span class='font-weight-bold'>SQL на ClickHouse</span> для больших таблиц – он быстрее любой библиотеки. Для поиска персональных данных из коробки – <span class='font-weight-bold'>«Гарда Data Masking»</span> с машинным обучением: на старых схемах с полями f_01…f_88 это экономит недели.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph {"style":{"color":{"background":"#f7f1dd"}}} --></p>
<p class="has-background" style="background-color:#f7f1dd"><em><span class='font-weight-bold'>Метрика готовности к следующему шагу</span> – доля полей с подтверждённой классификацией. Если меньше 95%, дальше идти бессмысленно: вы просто перенесёте неизвестность на следующий этап и найдёте её в проде. Да, скучно. Да, две-три недели. Обойти нельзя – я пробовал трижды.</em></p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Шаг 2. Зачем нужен контракт на данные и что в нём должно быть?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Дальше то, что вас защитит от того, чтобы проект не превратился в бесконечную переписку. Нужен документ – контракт на данные, который отвечает на вопрос: какой датасет мы считаем правильным. Пишет его потребитель, а не тот, кто генерирует. Это принципиально: если контракт пишет генератор, он напишет то, что умеет. Формат – YAML в репозитории рядом с кодом, чтобы версионировался и проходил ревью. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="max-width:820px; margin:30px auto; font-family:'JetBrains Mono','Cascadia Code','Fira Code','Consolas',monospace; background:#0d1117; border:1px solid #30363d; border-radius:16px; padding:20px 24px 18px; box-shadow:0 4px 20px rgba(0,0,0,0.3); overflow-x:auto;">
<pre style="margin:0; padding:0; font-family:'JetBrains Mono','Cascadia Code','Fira Code','Consolas',monospace; font-size:14px; line-height:1.5; color:#e6edf3; white-space:pre-wrap; word-break:normal; background:transparent; border:none; border-radius:0;"><span style="color:#8b949e; font-style:italic;"># contracts/acquiring_load.yaml</span>
<span style="color:#ff7b72; font-weight:600;">dataset</span>: acquiring_load_4tb
<span style="color:#ff7b72; font-weight:600;">purpose</span>: performance          <span style="color:#8b949e; font-style:italic;"># одна из четырёх задач, не «универсальный»</span>
<span style="color:#ff7b72; font-weight:600;">owner</span>: perf-team
<span style="color:#ff7b72; font-weight:600;">source_profile</span>: profiles/acquiring@2026-07-14.json

<span style="color:#ff7b72; font-weight:600;">volume</span>:
  rows: 1_300_000_000
  size_tb: 4.1
  tolerance: 0.03

<span style="color:#ff7b72; font-weight:600;">must_preserve</span>:
  cardinality:
    merchant_id: { value: 41_000, tol: 0.05 }
    card_token:  { value: 78_000_000, tol: 0.05 }
  skew:
    merchant_id: { gini: 0.81, tol: 0.03 }
  partitions:
    last_90d_share: { value: 0.70, tol: 0.02 }
  nulls:
    mcc: { value: 0.031, tol: 0.005 }
  string_length:
    merchant_name: { mean: 34.2, p95: 61, tol: 0.10 }

<span style="color:#ff7b72; font-weight:600;">must_not_contain</span>: [ real_pan, real_msisdn, real_fio, real_contract_no, real_inn ]

<span style="color:#ff7b72; font-weight:600;">edge_cases</span>:                  <span style="color:#8b949e; font-style:italic;"># ссылки на каталог патологий, см. шаг 6</span>
  include: [ EC-014, EC-021, EC-088, EC-102, EC-137 ]
  min_occurrences: 200

<span style="color:#ff7b72; font-weight:600;">privacy_gates</span>:
  exact_row_match: 0
  dcr_p5: <span style="color:#a5d6ff;">"&gt;= holdout"</span>
  mia_auc: <span style="color:#a5d6ff;">"&lt;= 0.55"</span>

<span style="color:#ff7b72; font-weight:600;">reproducibility</span>:
  seed: 20260901
  generator_version: <span style="color:#a5d6ff;">"2.3.1"</span>

<span style="color:#ff7b72; font-weight:600;">lifecycle</span>:
  ttl_days: 14
  storage_class: restricted-test
  </pre>
</div>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Выглядит как бюрократия, а работает как страховка: через полгода на вопрос, почему у вас сорок одна тысяча мерчантов, а не двенадцать, ответит конкретный файл, а не уволившийся коллега по памяти. Три поля, которые все норовят выкинуть и потом жалеют: <em>seed, ttl_days</em> и <em>min_occurrences</em>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Шаг 3. Как подобрать генератор для каждого типа данных?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Главное не то, какой генератор выбрать. Правильный вопрос: какой из генераторов подходит <span class='font-weight-bold'>каждой группе полей</span>. В типичной корпоративной базе примерно 80% данных спокойно генерируются правилами, ещё 15% требуют статистики, и только оставшиеся 5% – те, ради которых и нужна нейросеть.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<figure style="max-width:1100px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<table style="width:100%; min-width:900px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Разбивка по группам полей</caption>
<thead>
<tr>
<th style="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; white-space:nowrap; width:21%;">Что генерируем</th>
<th style="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; white-space:nowrap; width:24%;">Чем</th>
<th style="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; white-space:nowrap; width:33%;">Почему именно так</th>
<th style="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; white-space:nowrap; width:22%;">Инструменты</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Первичные и внешние ключи, токены</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Детерминированные функции: HMAC-SHA256, формат-сохраняющее шифрование FF1</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Нужна воспроизводимость и согласованность между системами. Нейросеть здесь не нужна и опасна: она может «запомнить» реальный идентификатор</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;"><code style="background:#f0f2f5; padding:2px 6px; border-radius:4px; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px;">pgcrypto</code>, библиотеки FF1, собственный сервис идентичности</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Форматные атрибуты РФ: ИНН, СНИЛС, БИК, номер карты</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Правила с корректными контрольными разрядами</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Валидаторы на входе отбракуют всё остальное, и вы будете тестировать не систему, а свой генератор</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Собственные функции, <code style="background:#f0f2f5; padding:2px 6px; border-radius:4px; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px;">Faker(ru_RU)</code>, <code style="background:#f0f2f5; padding:2px 6px; border-radius:4px; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px;">Mimesis</code> — с обязательной доработкой</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Числовые и категориальные поля с зависимостями</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Гауссовы копулы, CTGAN, TVAE</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Ловят совместное распределение и корреляции. Копула часто не хуже GAN и в десятки раз быстрее — начинайте с неё</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">SDV (<code style="background:#f0f2f5; padding:2px 6px; border-radius:4px; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px;">GaussianCopula</code>, <code style="background:#f0f2f5; padding:2px 6px; border-radius:4px; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px;">CTGAN</code>, <code style="background:#f0f2f5; padding:2px 6px; border-radius:4px; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px;">TVAE</code>), <code style="background:#f0f2f5; padding:2px 6px; border-radius:4px; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px;">synthpop</code> в R</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Цепочки событий: транзакции, сессии, статусы заявок</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">PAR из SDV, DoppelGANger, либо марковская цепь + распределение интервалов</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Порядок и интервалы важнее значений. В восьми случаях из десяти марковской модели достаточно, а стоит она в пятьдесят раз дешевле</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">SDV <code style="background:#f0f2f5; padding:2px 6px; border-radius:4px; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px;">PARSynthesizer</code>, свои реализации на NumPy</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Свободный текст: обращения, комментарии, протоколы</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Локальная LLM с жёсткими ограничителями и пост-фильтрами</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Единственное место, где без нейросети правда никак. И единственное, где реален риск дословного запоминания</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Self-hosted модели с русским языком; для деидентификации — NER: Natasha, DeepPavlov, Presidio</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Ссылочная структура между таблицами</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Обход графа FK сверху вниз, генерация родителей раньше детей</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Многотабличные синтезаторы формально не гарантируют целостность — это известная проблема, проверяйте руками</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">SDV <code style="background:#f0f2f5; padding:2px 6px; border-radius:4px; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px;">HMASynthesizer</code> + собственные проверки, K2view и подобные — в коммерческом сегменте</td>
</tr>
<tr>
<td style="padding:14px; color:#1f2937; vertical-align:top; font-weight:700;">Справочники: ОКВЭД, регионы, валюты, МСС</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Копируем как есть</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Это не персональные данные. Синтезировать их — вредительство: сломаете join и потратите неделю на отладку</td>
<td style="padding:14px; color:#6b7280; vertical-align:top;">—</td>
</tr>
</tbody>
</table></div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Разбивка по группам полей. Самая частая ошибка на этом шаге — пытаться прогнать через нейросеть всю таблицу целиком, включая ключи и справочники. Получается дорого, медленно и с битой целостностью.</figcaption></figure>
<p><!-- /wp:html --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Шаг 4. Чем кормить генератор, чтобы синтетика была похожа на реальные данные?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Правило одно: модель учится там же, где живут исходные данные.</span> Тот же контур, тот же уровень защиты, те же журналы доступа. Наружу выходит только готовая модель – и только после проверки на утечку. Дальше 4 вещи, о которых редко пишут, хотя именно они всё решают.</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>Для табличной модели хватает 1-5 млн строк. Больше – модель дольше учится и легче запоминает конкретные записи. Казалось бы, чем больше данных, тем лучше, но здесь всё наоборот.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Дедупликация обязательна. </span>Дубликаты и почти-дубликаты – главная причина, по которой модель запоминает данные вместо того, чтобы их обобщать. Используем MinHash или SimHash, порог схожести 0,8, всё лишнее убираем. На одном проекте только это снизило долю протекающих записей в 10 раз.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Канарейки – дешёвый и очень полезный приём.</span> Перед обучением вшиваем в выборку 300–1000 искусственных записей с редкими сочетаниями: необычная фамилия, редкий диагноз, точная дата. После генерации ищем их в результате. Нашли хоть одну – модель течёт. Не нашли – гарантии нет, но зато есть дешёвый сигнал, который можно запускать в CI каждый день.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Дифференциальная приватность. </span>Честно: для внутреннего контура обычно избыточна. При ε ≤ 1 хвосты распределения вымываются, а именно ради хвостов всё и затевалось. Ещё один неприятный эффект: на синтетике с дифференциальной приватностью статистические тесты массово выдают ложноположительные результаты – аналитик принимает добавленный шум за значимый эффект. Если данные уходят за периметр, дифференциальная приватность нужна. Если остаются внутри – почти наверняка обойдётесь без неё.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Шаг 5. Терабайты синтетики:&nbsp; двухконтурная схема, без которой ничего не получится</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Смотрите, в чём суть. <span class='font-weight-bold'>Нейросеть даёт структуру, а не объём. </span>Если попытаться прогнать миллиард строк напрямую через CTGAN, выйдет как возить щебень на велосипеде: вроде технически можно, но смысла нет. Вот цифры для примера.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Глубокая табличная модель на нормальной видеокарте делает десятки тысяч строк в секунду. Значит, миллиард – это несколько дней непрерывной работы, и всё это время видеокарта занята. А копула или обычный сэмплер на Spark и ClickHouse выдают миллионы строк в секунду с одной машины, и масштабируются они линейно. Разница – три-четыре порядка. Поэтому нужно два контура: первый, медленный, учит модель; второй, быстрый, размножает результат по требованию.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<figure style="max-width:940px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<p>  <!-- Контур А --></p>
<div style="background:#E9EBF5; border:1px solid #C3C8E0; border-radius:12px; padding:18px 20px 20px; margin-bottom:0;">
<div style="font-size:13.5px; font-weight:700; color:#2F3A73; margin-bottom:16px;">КОНТУР А — медленный. Раз в квартал или при дрейфе данных. Внутри защищённого периметра</div>
<div style="display:flex; gap:14px; flex-wrap:wrap; align-items:stretch;">
<div style="flex:1 1 130px; background:#fff; border:1.5px solid #2F3A73; border-radius:8px; padding:12px 10px; text-align:center;">
<div style="font-weight:600; color:#151F2B; font-size:13px; margin-bottom:6px;">Срез прода</div>
<div style="color:#5C6874; font-size:11.5px; line-height:1.5;">1–5 млн строк<br />после дедупликации</div>
</p></div>
<div style="flex:1 1 130px; background:#fff; border:1.5px solid #2F3A73; border-radius:8px; padding:12px 10px; text-align:center;">
<div style="font-weight:600; color:#151F2B; font-size:13px; margin-bottom:6px;">Профилирование</div>
<div style="color:#5C6874; font-size:11.5px; line-height:1.5;">кардинальность,<br />skew, NULL, длины</div>
</p></div>
<div style="flex:1 1 130px; background:#fff; border:1.5px solid #2F3A73; border-radius:8px; padding:12px 10px; text-align:center;">
<div style="font-weight:600; color:#151F2B; font-size:13px; margin-bottom:6px;">Обучение</div>
<div style="color:#5C6874; font-size:11.5px; line-height:1.5;">копула / CTGAN /<br />TVAE / LLM</div>
</p></div>
<div style="flex:1 1 130px; background:#fff; border:1.5px solid #2F3A73; border-radius:8px; padding:12px 10px; text-align:center;">
<div style="font-weight:600; color:#151F2B; font-size:13px; margin-bottom:6px;">Эталонный корпус</div>
<div style="color:#5C6874; font-size:11.5px; line-height:1.5;">5–20 млн строк<br />полная валидация</div>
</p></div>
<div style="flex:1.5 1 200px; background:#2F3A73; border-radius:8px; padding:14px 12px; text-align:center; color:#fff;">
<div style="font-weight:700; font-size:13.5px; margin-bottom:8px;">СЛЕПОК</div>
<div style="color:#D3D7EA; font-size:11.5px; line-height:1.5;">параметры распределений,<br />условные таблицы, словари,<br />хеш + версия</div>
</p></div>
</p></div>
<div style="font-size:11.5px; color:#5C6874; margin-top:14px;">Наружу выходит только слепок — и только после прохождения ворот приватности</div>
</p></div>
<p>  <!-- Стрелка вниз между контурами --></p>
<div style="text-align:center; color:#5C6874; font-size:20px; line-height:1; padding:6px 0;">↓</div>
<p>  <!-- Контур Б --></p>
<div style="background:#E4F0EE; border:1px solid #B9D6D1; border-radius:12px; padding:18px 20px 20px;">
<div style="font-size:13.5px; font-weight:700; color:#0E6B62; margin-bottom:16px;">КОНТУР Б — быстрый. По кнопке, минуты. Обычный тестовый контур, никаких ПДн</div>
<div style="display:flex; gap:14px; flex-wrap:wrap; align-items:stretch;">
<div style="flex:1 1 140px; background:#fff; border:1.5px solid #0E6B62; border-radius:8px; padding:14px 10px; text-align:center;">
<div style="font-weight:600; color:#151F2B; font-size:13px; margin-bottom:6px;">Слепок + seed</div>
<div style="color:#5C6874; font-size:11.5px; line-height:1.5;">+ контракт на данные</div>
</p></div>
<div style="flex:1 1 140px; display:flex; flex-direction:column; gap:6px;">
<div style="background:#fff; border:1.5px solid #0E6B62; border-radius:8px; padding:8px 10px; text-align:center; color:#151F2B; font-size:12px;">Правила и ключи</div>
<div style="background:#fff; border:1.5px solid #0E6B62; border-radius:8px; padding:8px 10px; text-align:center; color:#151F2B; font-size:12px;">Каталог патологий</div>
<div style="background:#fff; border:1.5px solid #0E6B62; border-radius:8px; padding:8px 10px; text-align:center; color:#151F2B; font-size:12px;">Справочники as is</div>
</p></div>
<div style="flex:1.3 1 170px; background:#0E6B62; border-radius:8px; padding:16px 12px; text-align:center; color:#fff;">
<div style="font-weight:700; font-size:13.5px; margin-bottom:8px;">РАЗМНОЖИТЕЛЬ</div>
<div style="color:#CFE5E1; font-size:11.5px; line-height:1.5;">Spark / ClickHouse,<br />N воркеров по диапазонам</div>
</p></div>
<div style="flex:1 1 130px; display:flex; flex-direction:column; gap:6px;">
<div style="background:#fff; border:1.5px solid #0E6B62; border-radius:8px; padding:8px 10px; text-align:center; color:#151F2B; font-size:12px;">Перемешивание</div>
<div style="background:#fff; border:1.5px solid #0E6B62; border-radius:8px; padding:8px 10px; text-align:center; color:#151F2B; font-size:12px;">Загрузка в СУБД</div>
<div style="background:#fff; border:1.5px solid #0E6B62; border-radius:8px; padding:8px 10px; text-align:center; color:#151F2B; font-size:12px;">Ворота качества</div>
</p></div>
<div style="flex:1 1 110px; background:#fff; border:2px solid #0E6B62; border-radius:8px; padding:16px 10px; text-align:center;">
<div style="font-weight:700; color:#0E6B62; font-size:15px; margin-bottom:8px;">4,1 ТБ</div>
<div style="color:#5C6874; font-size:11.5px; line-height:1.5;">за 4 часа<br />на 8 воркерах</div>
</p></div>
</p></div>
</p></div>
</figure>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Теперь о самом размножителе. Тут главное – предсказуемость. Если заданы три параметра: слепок модели, seed и диапазон номеров строк, результат будет один и тот же всегда. За счёт этого каждый воркер генерирует свой кусок сам, без общего состояния и координации, в результате сходится побайтово.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="max-width:880px; margin:30px auto; font-family:'JetBrains Mono','Cascadia Code','Fira Code','Consolas',monospace; background:#0d1117; border:1px solid #30363d; border-radius:16px; padding:20px 24px 18px; box-shadow:0 4px 20px rgba(0,0,0,0.3); overflow-x:auto;">
<pre style="margin:0; padding:0; font-family:'JetBrains Mono','Cascadia Code','Fira Code','Consolas',monospace; font-size:14px; line-height:1.5; color:#e6edf3; white-space:pre-wrap; word-break:normal; background:transparent; border:none; border-radius:0;"><span style="color:#8b949e; font-style:italic;">-- ClickHouse: скелет размножителя. Zipf по мерчантам через словарь весов,</span>
<span style="color:#8b949e; font-style:italic;">-- детерминированный PRNG от (seed, номер строки)</span>
<span style="color:#ff7b72; font-weight:600;">INSERT INTO</span> tx_synth
<span style="color:#ff7b72; font-weight:600;">SELECT</span>
    cityHash64(:seed, n)                                  <span style="color:#ff7b72; font-weight:600;">AS</span> rid,
    dictGet(<span style="color:#a5d6ff;">'merchant_zipf'</span>, <span style="color:#a5d6ff;">'merchant_id'</span>,
            toUInt64(zipf_bucket(rid)))                   <span style="color:#ff7b72; font-weight:600;">AS</span> merchant_id,
    dictGet(<span style="color:#a5d6ff;">'card_pool'</span>, <span style="color:#a5d6ff;">'token'</span>,
            toUInt64(rid % 78000000))                     <span style="color:#ff7b72; font-weight:600;">AS</span> card_token,
    <span style="color:#8b949e; font-style:italic;">-- 70% объёма — в последние 90 дней, как в проде</span>
    now() - toIntervalSecond(
        <span style="color:#ff7b72; font-weight:600;">if</span>(rid % 100 &lt; 70, rid % 7776000, 7776000 + rid % 86400000)) <span style="color:#ff7b72; font-weight:600;">AS</span> ts,
    <span style="color:#8b949e; font-style:italic;">-- логнормаль по суммам + магнит на круглые значения</span>
    round_magnet(exp(4.1 + 0.92 * randNormal(rid)))       <span style="color:#ff7b72; font-weight:600;">AS</span> amount,
    <span style="color:#ff7b72; font-weight:600;">if</span>(rid % 1000 &lt; 31, <span style="color:#ff7b72; font-weight:600;">NULL</span>, dictGet(<span style="color:#a5d6ff;">'mcc'</span>, <span style="color:#a5d6ff;">'code'</span>, rid % 400)) <span style="color:#ff7b72; font-weight:600;">AS</span> mcc
<span style="color:#ff7b72; font-weight:600;">FROM</span> numbers_mt(:row_from, :row_count)</pre>
</div>
<p><!-- /wp:html --></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>Две скучные метрики, но обе работают. В проде <em>merchant_name</em> в среднем 34 символа, а генератор выдаёт 12 – таблица становится меньше в два с половиной раза. В проде 3,1% пустых значений в MCC, а у вас ноль – не словите ни одного падения на пустом поле и заодно получите другой размер строки в колоночном хранилище.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Сколько вообще нужно терабайт. </span>Спорно, но я настаиваю: большинству команд терабайты не нужны. Они нужны только нагрузочникам и тем, кто отлаживает планы запросов на больших таблицах. Остальным хватает <span class='font-weight-bold'>правильного среза</span>: 2–3% от прода с сохранением ссылочной целостности покрывают примерно 95% функциональных сценариев, генерируются за минуты и влезают на ноутбук. Когда каждая команда просит полную копию, это не потребность в данных, а недоверие к срезу. Лечится контрактом из шага 2, а не терабайтами.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></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:paragraph --></p>
<p>Генеративная модель по своей природе сглаживает редкие случаи. Это не дефект реализации, а её работа: она учитывает плотность распределения, а нестандартные события по определению имеют низкую плотность. GAN вдобавок склонен схлопывать моды, VAE – размывать. Аналитику, которому нужны среднее и корреляции, это не мешает, а вот для тестировщика – это катастрофа, потому что баги живут именно в хвостах.</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">Ни один известный мне генератор сам не придумает клиента с 412 картами, платёж на одну копейку, ФИО длиной 78 символов и транзакцию ровно в момент перевода часов. А в проде всё это есть, и на каждом из этих случаев кто-то однажды упал. <em><span class='font-weight-bold'>Отсюда гибрид: тело распределения даёт нейросеть, хвосты – отдельный каталог.</span></em></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":31315,"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/09/sinteticheskie-dannye-1.png" alt="sinteticheskie-dannye-1" class="wp-image-31315" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/sinteticheskie-dannye-1.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/sinteticheskie-dannye-1-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/sinteticheskie-dannye-1-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/09/sinteticheskie-dannye-1-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></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: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> для каждого CHECK, NOT NULL и лимита длины нужны значения на границе и за ней. </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:html --></p>
<figure style="max-width:1100px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<table style="width:100%; min-width:850px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Фрагмент каталога патологий</caption>
<thead>
<tr>
<th style="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; white-space:nowrap; width:11%;">ID</th>
<th style="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; white-space:nowrap; width:15%;">Класс</th>
<th style="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; white-space:nowrap; width:44%;">Патология</th>
<th style="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; white-space:nowrap; width:30%;">Что ловит</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px; white-space:nowrap;">EC-014</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">ФИО</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Фамилия из одной буквы; фамилия 78 символов; двойная через дефис; отчество «оглы»/«кызы»; «ё» и «е» в одной записи; висячий пробел в конце</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Обрезка полей, сортировки, поиск, ширина в отчётах и печатных формах</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px; white-space:nowrap;">EC-021</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Даты и время</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">29 февраля; 31-е в 30-дневном месяце; дата рождения 1900 и завтрашняя; переход на летнее время в исторических данных до 2014; Камчатка (+12) и Калининград (+2) в одной таблице</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Расчёт возраста, дедлайнов, SLA, ночные джобы, оконные функции</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px; white-space:nowrap;">EC-034</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Суммы</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">0,01; максимально допустимая; отрицательная; четыре знака после запятой; ровно на пороге лимита; банковское округление половин</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Переполнения, округления, лимиты, сверки на копейку</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px; white-space:nowrap;">EC-088</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Кардинальность</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Клиент с нулём продуктов; клиент с 412 картами; мерчант с одной транзакцией за три года; мерчант с 30% всего трафика</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Пагинация, N+1, таймауты, планы запросов, деление на ноль в агрегатах</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px; white-space:nowrap;">EC-102</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Текст и кодировки</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Пустая строка против NULL; строка из одних пробелов; эмодзи; кавычки-ёлочки; неразрывный пробел; CRLF внутри поля; апостроф в «О’Коннор»</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Парсинг, экспорт в CSV, интеграции, экранирование, ширина в UI</td>
</tr>
<tr>
<td style="padding:14px; color:#1f2937; vertical-align:top; font-weight:700; font-family:'JetBrains Mono','Cascadia Code','Consolas',monospace; font-size:12.5px; white-space:nowrap;">EC-137</td>
<td style="padding:14px; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Дубли и грязь</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Полные дубли строк; два клиента с одинаковым ИНН; запись со всеми NULL кроме ключа; «висячая» ссылка на удалённый справочник</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Дедупликация, идемпотентность, отчёты, целостность витрин</td>
</tr>
</tbody>
</table></div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Фрагмент каталога патологий. У зрелой команды таких записей 200–400. Это, а вовсе не обученная модель, — главный актив всего проекта: модель вы переучите за неделю, а каталог из реальных инцидентов за три года не купите ни за какие деньги.</figcaption></figure>
<p><!-- /wp:html --></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 {"style":{"color":{"background":"#ebf6f0"}}} --></p>
<p class="has-background" style="background-color:#ebf6f0">Мой ориентир такой: <span class='font-weight-bold'>на каталог уходит 0,3–1% строк датасета, но каждый класс патологий должен встретиться минимум 200 раз</span>. Если сделать патологий 5%, они перестанут быть хвостом и испортят нагрузочный профиль. А если каждого класса по три штуки на миллиард строк – тест превращается в лотерею: сегодня запрос их зацепил, завтра нет, и полдня уходит на то, чтобы разобраться, почему сборка мигает.</p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Шаг 7. Что мешает синтетике сломать прод и зачем нужны три независимых проверки?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Датасет, не прошедший валидацию, не публикуется. Точка. Ворота стоят в CI, у каждых – жёсткий порог из контракта.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html /--></p>
<p><!-- wp:html /--></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Приём, который экономит месяцы</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#ebf6f0"}}} --></p>
<p class="has-background" style="background-color:#ebf6f0">Лучший тест пригодности данных – не статистика, а сравнение планов запросов. Возьмите топ-50 запросов из <em>pg_stat_statements</em> или <em>query_log</em>, прогоните EXPLAIN (ANALYZE, BUFFERS) на проде и на синтетике, сравните типы узлов и отношение оценочной кардинальности к фактической. <span class='font-weight-bold'>Планы совпали – данные годные, дальше можно не мерить. Не совпали – значит, сломали ровно одно распределение, и по расхождению оценок видно, какое.</span> Я нахожу этим способом за час то, что статистическими метриками искал бы неделю.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Ловушка DCR, в которую попадают почти все</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#faedf7"}}} --></p>
<p class="has-background" style="background-color:#faedf7">Расстояние до ближайшей реальной записи часто показывают как доказательство приватности: мол, ни одна синтетическая строка не совпадает с настоящей. Но само по себе это ни о чём не говорит. Сравнивать надо так: отложите часть реальных данных, которую модель вообще не видела, и посчитайте DCR для неё и для синтетики. <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> Без него размножитель превращается в рулетку: сегодня данные одни, завтра другие, воспроизвести не получается, воркеры мешают друг другу. Поэтому сначала контракт, потом всё остальное. Не наоборот.</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":31313,"width":"318px","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/ci-cd-testovye-dannye.png" alt="ci-cd-testovye-dannye" class="wp-image-31313" style="width:318px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/ci-cd-testovye-dannye.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/ci-cd-testovye-dannye-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/ci-cd-testovye-dannye-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/09/ci-cd-testovye-dannye-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> Решили сэкономить и сразу направить нейросеть на прод – получите гладкое распределение без хвостов, а именно в хвостах живут баги. Решили пропустить валидацию – вот вам и датасет, который внешне похож на реальный, а на деле сломает половину планов запросов. Каждый шаг – это не рекомендация, а контрольная точка. </pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>В третьей части уже расскажу как всё это применять на реальных проектах. Поговорим о российской специфике, покажу 3 кейса из практики – где хорошая синтетика спасала прод, а плохая роняла его через 40 минут после релиза. Также вас будет ждать разбор инструментов и ошибок с прицелом на РФ. А ещё расчёт экономики для защиты бюджета и план на 90 дней по неделям. </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/outsourcing/" data-type="page" data-id="26">мы можем зайти и выстроить весь конвейер под ключ</a>: от профилирования и контракта на данные до размножителя, каталога патологий, учёта <a href="https://quality-lab.ru/blog/a-vashi-testirovshhiki-zashhishhayut-vash-produkt-i-kompaniyu-ot-millionnyx-shtrafov/" data-type="post" data-id="29493">регуляторных требований</a>, валидации в CI, доставки по кнопке и масштабирования до терабайт. Приходите – разберём ваш контур и прикинем, что и за какой срок реально сделать. Первая консультация бесплатно. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:details --></p>
<details class="wp-block-details">
<summary><span class='font-weight-bold'>Зачем вообще нужна синтетика, если есть маскирование?</span></summary>
<p><!-- wp:paragraph {"placeholder":"Введите / для добавления скрытого блока"} --></p>
<p>Маскирование сохраняет структуру реальных данных, но искажает значения. Проблема в том, что искажение почти всегда ломает распределения. Плюс маскирование юридически не выводит данные из-под 152-ФЗ, пока есть ключ обратимости.</p>
<p><!-- /wp:paragraph --></details>
<p><!-- /wp:details --></p>
<p><!-- wp:details --></p>
<details class="wp-block-details">
<summary><span class='font-weight-bold'>Что такое детерминированный размножитель?</span></summary>
<p><!-- wp:paragraph {"placeholder":"Введите / для добавления скрытого блока"} --></p>
<p>Это функция от трёх аргументов: слепка распределений]]></description>
<link>https://quality-lab.ru/blog/7-shagov-k-konvejeru-sinteticheskix-dannyx-dlya-testirovaniya/</link>
<pubDate>Wed, 23 Sep 2026 11:49:05 +0300</pubDate>
</item>
<item>
<title>Параметризация Pytest: когда файловая коллекция становится тест-кейсами</title>
<description><![CDATA[<p>Меня зовут <a href="https://habr.com/ru/companies/infowatch/articles/1012040/" mce_href="https://habr.com/ru/companies/infowatch/articles/1012040/" target="_blank" style="">Владислав Тимашенков</a>, я занимаюсь автоматизацией тестирования в ГК InfoWatch. Мы разрабатываем DLP-систему для защиты контента и предотвращения утечек информации.</p><p>Специфика продуктов InfoWatch состоит в анализе самых разнообразных данных. Поэтому практически каждый автотест требует подхода с широким набором параметров.&nbsp;Для нашей команды хорошим решением стало вынести генерацию параметров&nbsp;<code>pytest.mark.parametrize</code>&nbsp;в отдельный компонент, который собирает данные из файловой коллекции проекта.</p><p>Существует множество способов параметризировать тестовые функции.&nbsp;Эта статья — пример изящной параметризации Pytest для сценариев, основанных на файловой коллекции проекта с большим количеством данных. Расскажем про наш опыт решения такой задачи.</p><p>Параметризация Pytest позволяет сделать из теста каркас, шаблон, который принимает данные для конфигураций, для assert и т.д.</p>]]></description>
<link>https://www.software-testing.ru/library/testing/testing-automation/4538-parameterization-of-pytest</link>
<pubDate>Tue, 22 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/quality.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/quality.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Джеймс Бах (James Bach)<br /><strong><a href="https://www.satisfice.com/blog/archives/487632" mce_href="https://www.satisfice.com/blog/archives/487632" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод: </strong>Ольга Алифанова</p>
<p>В противовес моей идее о том, что тестирование программного обеспечения должно быть ролью, а не просто задачей, мне иногда говорят, что «настоящий Agile» этого не допускает. Почему? Потому что в Agile «качество — ответственность каждого». Это утверждение иногда подаётся так, будто это моральная истина, не подлежащая обсуждению, или же как моральное достижение, уникальное для аджайлистов, будто предыдущим поколениям разработчиков программного обеспечения никогда не приходило в голову помогать друг другу создавать хорошие вещи.</p>
<p>В любом случае, для меня это не имеет смысла.</p>
<p>Первая мысль, которая приходит в голову: «Я говорю о тестировании, а не о качестве. Почему сюда притягивается качество?» Тестировщики не обеспечивают качество. Тестировщики НЕ МОГУТ обеспечить качество. Тестировщики сейчас и никогда не «владели качеством» ни в каком смысле.</p>
<p>Но даже если отложить это в сторону, качество не должно считаться «ответственностью каждого». Вот почему меня беспокоит эта формулировка:</p>]]></description>
<link>https://www.software-testing.ru/library/around-testing/processes/4504-everyone-is-not-responsible-for-quality</link>
<pubDate>Sun, 20 Sep 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Синтетические данные для тестирования: методология, масштаб и контроль приватности</title>
<description><![CDATA[<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:paragraph --></p>
<p><em>Подход зависит от задачи: где-то хватит пяти тысяч строк на фикстурах, где-то нужен конвейер генерации 4 ТБ с проверкой по статистике, планам запросов и приватности. Юридическая сторона при этом определяет стоимость. Маскирование с обратимым ключом остается персональными данными по 152-ФЗ</em><sup data-fn="0618beca-5380-47fc-9893-72fb14414b99" class="fn"><a href="https://quality-lab.ru#0618beca-5380-47fc-9893-72fb14414b99" id="0618beca-5380-47fc-9893-72fb14414b99-link">1</a></sup><em>. Синтез выводит данные из-под закона, только если доказано, что связь с реальными людьми отсутствует, – с 1 сентября 2026 года это проверяется по национальным стандартам ПНСТ 1064–1066</em><sup data-fn="49eb3687-cab5-4c86-9172-07cefd958a8d" class="fn"><a href="https://quality-lab.ru#49eb3687-cab5-4c86-9172-07cefd958a8d" id="49eb3687-cab5-4c86-9172-07cefd958a8d-link">2</a></sup><em>.</em></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>Наш ведущий эксперт Олег подготовил цикл из трех материалов, в которых пошагово рассказывает, как построить конвейер, который выдает обезличенные данные в промышленных объемах, и как убедиться, что они не врут. Никакой магии – только метрики, пороги и грабли, на которые он уже наступал. Полезно для руководителей разработки и QA, продакт-менеджеров и всех, кто работает с тестовыми данными.</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":31280,"width":"277px","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/09/testovye-dannye.png" alt="testovye-dannye" class="wp-image-31280" style="width:277px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/testovye-dannye.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/testovye-dannye-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/testovye-dannye-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/09/testovye-dannye-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:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p>Понедельник, планерка. Тестировщик разводит руками: у меня не воспроизводится, на моих данных все зеленое. Аналитик говорит, что у него выгрузка трехмесячной давности и новых статусов заявки там еще нет. Нагрузочник молчит – у него стенд на 40 ГБ против 6 ТБ прода, и он давно перестал верить собственным графикам. А безопасник в этот момент пишет письмо о том, что дамп боевой базы опять оказался на ноутбуке подрядчика. Если у вас такого никогда не бывало – вы либо совсем маленькие, либо уже очень взрослые. В обоих случаях дальше можно не читать.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Я лет десять кручусь вокруг тестовых сред, и первые года три делал ровно то, что делают все: выгружал из прода двести тысяч строк, менял фамилии на Иванов1, Иванов2 и так далее, и считал, что обезличил. Пока не заметил, что в выгрузке остались номера договоров. А по номеру договора на нашей же публичной форме проверки статуса доставался город и последние четыре цифры телефона. Это был не взлом – это была форма на сайте, которую мы сами и сделали. Мне повезло, что очень быстро именно я нашел ее первым.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>С тех пор я отношусь к тестовым данным как к проду: с той же паранойей и тем же уровнем проектирования. Ниже – методология, которой хватает и на регресс из 5 000 строк, и на нагрузочный контур в 4 ТБ.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Пара цифр для контекста, чтобы было понятно: проблема не выдуманная. По опросу «Гарды»<sup data-fn="ad1e69ae-6c7d-429a-a949-c169a4c502b6" class="fn"><a href="https://quality-lab.ru#ad1e69ae-6c7d-429a-a949-c169a4c502b6" id="ad1e69ae-6c7d-429a-a949-c169a4c502b6-link">3</a></sup> среди российских компаний специализированные средства маскирования применяют около <span class='font-weight-bold'>3%</span> респондентов, почти половина регулярно переносит в тестовые среды копии продуктивных баз без изменений, а <span class='font-weight-bold'>18,8% </span>держат тестовые базы в том же кластере, что и боевую. При этом с 30 мая 2025 года по 420-ФЗ<sup data-fn="9620e49a-b5fd-42c2-b1f2-35717bc47a2b" class="fn"><a href="https://quality-lab.ru#9620e49a-b5fd-42c2-b1f2-35717bc47a2b" id="9620e49a-b5fd-42c2-b1f2-35717bc47a2b-link">4</a></sup> утечка данных 1 000–10 000 человек стоит юрлицу от 3 до 5 млн рублей, а повторная – от 1 до 3% годовой выручки, минимум 25 млн. Это уже не риски информационной безопасности, это строчка в P&amp;L.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Какие задачи решает создание тестовых данных и чем они отличаются?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Самая дорогая ошибка здесь скрывается на старте, и стоить она может около 6 месяцев бесполезной работы. Звучит так: давайте сделаем нормальные тестовые данные, но без уточнения, для чего. Я вам расскажу про четыре основных задачи с несовместимыми требованиями, которые могут прятаться за таким расплывчатым запросом. Данные, отличные для <a href="https://quality-lab.ru/blog/how-to-reduce-a-regression-testing-time-from-3-to-1-day/" data-type="post" data-id="11328">регресса</a>, бесполезны для <a href="https://quality-lab.ru/blog/kak-nagruzochnoe-testirovanie-zashhishhaet-biznes-ot-ubytkov/" data-type="post" data-id="29802">нагрузочного тестирования</a>, а данные, на которых обучается скоринг, не подойдут для демо партнеру. И наоборот. Обязательно прочитайте, чтобы не пойти по ложному направлению с самого начала, так как переделывать будет очень дорого.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<figure style="max-width:1100px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<table style="width:100%; min-width:850px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Четыре задачи создания тестовых данных</caption>
<thead>
<tr>
<th style="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; white-space:nowrap; width:17%;">Задача</th>
<th style="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; white-space:nowrap; width:29%;">Что критично воспроизвести</th>
<th style="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; white-space:nowrap; width:25%;">Чем можно пожертвовать</th>
<th style="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; white-space:nowrap; width:16%;">Типичный объём</th>
<th style="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; white-space:nowrap; width:13%;">Основной метод</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top; font-weight:700; white-space:nowrap;">Функциональное и регресс</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Покрытие состояний и переходов, ссылочная целостность, валидность форматов, наличие всех справочных значений</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Реальные пропорции. Хоть 50/50 — лишь бы все ветки были</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top; font-weight:600; white-space:nowrap;">100 МБ – 20 ГБ</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top; white-space:nowrap;">Правила + подмножество прода</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top; font-weight:700; white-space:nowrap;">Нагрузочное и производительность</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Кардинальность, скошенность, корреляции, доля NULL, длина строк, распределение по партициям, физический порядок вставки</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Осмысленность конкретных значений — планировщику всё равно, «Петров» там или «Ыфвап»</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top; font-weight:600; white-space:nowrap;">0,5 – 50 ТБ</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top; white-space:nowrap;">Статистика + масштабирование</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top; font-weight:700; white-space:nowrap;">Обучение и валидация моделей</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Совместное распределение, редкие классы, временна́я динамика, сезонность, дрейф</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Точное соответствие форматам систем-источников</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top; font-weight:600; white-space:nowrap;">1 ГБ – 5 ТБ</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top; white-space:nowrap;">Нейросетевой синтез</td>
</tr>
<tr>
<td style="padding:14px; color:#374151; vertical-align:top; font-weight:700; white-space:nowrap;">Демо, обучение людей, песочницы</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Правдоподобие «на глаз», связность историй, приличные ФИО и адреса</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Статистика вообще. Никто её не проверяет</td>
<td style="padding:14px; color:#374151; vertical-align:top; font-weight:600; white-space:nowrap;">10 МБ – 5 ГБ</td>
<td style="padding:14px; color:#374151; vertical-align:top; white-space:nowrap;">Правила + LLM</td>
</tr>
</tbody>
</table></div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:12px; font-style:italic;">Основные задачи, о которых стоит знать в самом начале</figcaption></figure>
<p><!-- /wp:html --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":31283,"width":"261px","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/09/testovyj-kontur.png" alt="testovyj-kontur" class="wp-image-31283" style="width:261px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/testovyj-kontur.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/testovyj-kontur-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/testovyj-kontur-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/09/testovyj-kontur-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 {"style":{"color":{"background":"#f9ecf0"}}} --></p>
<p class="has-background" style="background-color:#f9ecf0"><span class='font-weight-bold'>Мой любимый антипаттерн: </span>команда полгода строит пайплайн на CTGAN, покупает видеокарты, а нужны были пять тысяч строк для регресса, где важно только одно – чтобы у клиента было от нуля до семи карт. Это делается за два дня на фикстурах. Бывает и наоборот, и это дороже: под нагрузочное тестирование берут данные, сделанные для демо. Чем это кончается – обязательно расскажу на примере кейсов в третьей статье цикла. Был случай, когда p99 на стенде отличался от прода в двадцать три раза.</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":"#e3fbf0"}}} --></p>
<p class="has-background" style="background-color:#e3fbf0">Соберите всех, кто работает с тестовыми данными, и попросите каждого назвать одну <a href="https://quality-lab.ru/blog/perestante-schitat-bagi-sovremennye-metriki-testirovaniya-dlya-it-komand/" data-type="post" data-id="30560">метрику</a>, по которой он поймет, что данные плохие. Не общие слова про реалистичность, а конкретно: доля отказов по эквайрингу – 2,8% ± 0,3. Если человек не может назвать такую метрику – значит, у него не требования, а ощущения. А ощущения меняются каждый спринт, работать с ними нельзя.</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>Британское статистическое ведомство (ONS)<sup data-fn="63dd30ee-1bbd-43e4-bbbe-cb8fe04bb9e4" class="fn"><a href="https://quality-lab.ru#63dd30ee-1bbd-43e4-bbbe-cb8fe04bb9e4" id="63dd30ee-1bbd-43e4-bbbe-cb8fe04bb9e4-link">5</a></sup> предложило шкалу из шести уровней – самую вменяемую из тех, что я видел. Подготовил для вас удобную таблицу и добавил от себя столбец «для чего годится»: в оригинале его нет, но так нагляднее и полезнее.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":31288,"sizeSlug":"large","linkDestination":"none"} --></p>
<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="355" src="https://quality-lab.ru/wp-content/uploads/2026/09/6-urovnej-sinteticheskih-dannyh-1024x355.png" alt="6-urovnej-sinteticheskih-dannyh" class="wp-image-31288" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/6-urovnej-sinteticheskih-dannyh-1024x355.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/6-urovnej-sinteticheskih-dannyh-300x104.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/6-urovnej-sinteticheskih-dannyh-768x267.png 768w, https://quality-lab.ru/wp-content/uploads/2026/09/6-urovnej-sinteticheskih-dannyh-1536x533.png 1536w, https://quality-lab.ru/wp-content/uploads/2026/09/6-urovnej-sinteticheskih-dannyh-2048x711.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:html --></p>
<figure style="max-width:1000px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<table style="width:100%; min-width:820px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Шкала ONS: шесть уровней синтетических данных</caption>
<thead>
<tr>
<th style="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; white-space:nowrap; width:6%;">№</th>
<th style="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; white-space:nowrap; width:17%;">Уровень</th>
<th style="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; white-space:nowrap; width:38%;">Что воспроизводится</th>
<th style="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; white-space:nowrap; width:25%;">Для чего реально годится</th>
<th style="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; white-space:nowrap; width:14%;">Риск раскрытия</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top; font-weight:700; text-align:center;">1</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Структурная</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Только схема: типы, длины, обязательность. Значения — шум</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Прогон миграций, проверка сборки, smoke</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; font-weight:600; white-space:nowrap;">нулевой</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top; font-weight:700; text-align:center;">2</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Валидная</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Плюс бизнес-правила и ограничения: контрольные суммы, диапазоны, FK</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Функциональные тесты, интеграции, автотесты API</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; font-weight:600; white-space:nowrap;">нулевой</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top; font-weight:700; text-align:center;">3</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Одномерная</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Плюс маргинальные распределения каждого поля по отдельности</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Первые прикидки по объёму, отчёты «на глаз»</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; font-weight:600; white-space:nowrap;">низкий</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top; font-weight:700; text-align:center;">4</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Многомерная</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Плюс совместные распределения и корреляции между полями</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Нагрузочное тестирование, витрины, BI-регресс</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#d97706; vertical-align:top; font-weight:600; white-space:nowrap;">умеренный</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top; font-weight:700; text-align:center;">5</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Дополненная<br />правдоподобная</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Плюс тонкая структура: сезонность, редкие классы, поведенческие цепочки</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#374151; vertical-align:top;">Обучение моделей, антифрод, аналитические гипотезы</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#d97706; vertical-align:top; font-weight:600; white-space:nowrap;">заметный</td>
</tr>
<tr>
<td style="padding:14px; color:#6b7280; vertical-align:top; font-weight:700; text-align:center;">6</td>
<td style="padding:14px; color:#1f2937; vertical-align:top; font-weight:700; white-space:nowrap;">Реплика</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Практически замещает реальные данные в анализе</td>
<td style="padding:14px; color:#374151; vertical-align:top;">Исследования и публикации — и только с формальными гарантиями</td>
<td style="padding:14px; color:#dc2626; vertical-align:top; font-weight:600; white-space:nowrap;">высокий</td>
</tr>
</tbody>
</table></div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Шкала ONS в переводе и с колонкой применимости. Практический вывод: 4-й уровень закрывает почти все инженерные задачи, а лезть на 5–6 стоит, только если вы готовы обосновывать невосстановимость. Что это значит юридически — в следующем разделе.</figcaption></figure>
<p><!-- /wp:html --></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:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":31281,"width":"308px","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/sinteticheskie-dannye.png" alt="sinteticheskie-dannye" class="wp-image-31281" style="width:308px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/sinteticheskie-dannye.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/sinteticheskie-dannye-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/sinteticheskie-dannye-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/09/sinteticheskie-dannye-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><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>Этот раздел я проговариваю с юристом и безопасником на первой же встрече – от него зависит стоимость всего проекта. Разница между тремя подходами не техническая, а <a href="https://quality-lab.ru/blog/a-vashi-testirovshhiki-zashhishhayut-vash-produkt-i-kompaniyu-ot-millionnyx-shtrafov/" data-type="post" data-id="29493">правовая</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'>Обезличивание регулируется жестко.</span> С 1 сентября 2025 года действует приказ Роскомнадзора № 140 от 19.06.2025<sup data-fn="8c7637b8-690b-43ba-9c12-79c7567715d5" class="fn"><a href="https://quality-lab.ru#8c7637b8-690b-43ba-9c12-79c7567715d5" id="8c7637b8-690b-43ba-9c12-79c7567715d5-link">6</a></sup> – он заменил прежний № 996 от 2013 года. Методы в целом те же: идентификаторы, изменение состава и семантики, перемешивание, декомпозиция – плюс добавился новый метод преобразования массива. Но важнее методов требования к самому процессу, а их как раз редко кто читает.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Что требует приказ № 140 и что из этого ломает привычную практику:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"style":{"color":{"background":"#f7f1dd"}}} --></p>
<ul style="background-color:#f7f1dd" class="wp-block-list has-background"><!-- wp:list-item --></p>
<li>Нельзя хранить обезличенные данные вместе с исходными. Схема, когда в одной базе рядом лежат clients и clients_masked, – вне закона. А так делают почти все.</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 --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":31282,"width":"300px","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/obezlichivanie-personalnyh-dannyh.png" alt="obezlichivanie-personalnyh-dannyh" class="wp-image-31282" style="width:300px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/obezlichivanie-personalnyh-dannyh.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/obezlichivanie-personalnyh-dannyh-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/obezlichivanie-personalnyh-dannyh-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/09/obezlichivanie-personalnyh-dannyh-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> Вы не переделываете записи реальных людей, а создаете новые. Нет записи, которая соответствует конкретному человеку, – нет и персональных данных. Но это нужно доказывать, а не просто заявлять.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>И тут стало проще. Росстандарт выпустил первые стандарты по синтезу данных – их подготовила Ассоциация больших данных. Три документа: <span class='font-weight-bold'>ПНСТ 1064-2026</span> – основные понятия и термины, <span class='font-weight-bold'>ПНСТ 1065-2026 </span>– архитектура и методы синтеза, <span class='font-weight-bold'>ПНСТ 1066-2026</span> – оценка качества результатов. Действуют с 1 сентября 2026 года, то есть уже сейчас. Там наконец-то есть то, чего не хватало: как оценить достоверность, как измерить риск восстановления исходных данных, как валидировать, как маркировать и аудитировать.</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>Если нужно обосновать подход для зарубежной части группы, логика везде одна: смотрят не на название метода, а на остаточный риск повторной идентификации. GDPR<sup data-fn="016ea7dd-325b-42b1-86b1-d1e8631668f1" class="fn"><a href="https://quality-lab.ru#016ea7dd-325b-42b1-86b1-d1e8631668f1" id="016ea7dd-325b-42b1-86b1-d1e8631668f1-link">7</a></sup> (соображение 26) и заключение WP29 05/2014<sup data-fn="330b2c0e-d6d7-4d5c-b0f1-991544101d5f" class="fn"><a href="https://quality-lab.ru#330b2c0e-d6d7-4d5c-b0f1-991544101d5f" id="330b2c0e-d6d7-4d5c-b0f1-991544101d5f-link">8</a></sup> требуют закрыть три риска – выделение записи, связывание и вывод атрибута. Остался хоть один – это уже не анонимизация. Самый практичный документ – <span class='font-weight-bold'>NIST SP 800-188</span><sup data-fn="c5b085d4-173b-4129-8c09-0f93c8017791" class="fn"><a href="https://quality-lab.ru#c5b085d4-173b-4129-8c09-0f93c8017791" id="c5b085d4-173b-4129-8c09-0f93c8017791-link">9</a></sup>, финальная редакция от сентября 2023. Там же описаны совет по проверке раскрытия и тест мотивированного нарушителя. В HIPAA<sup data-fn="a7ee12b2-fa0a-45e6-b9c4-31f079f91883" class="fn"><a href="https://quality-lab.ru#a7ee12b2-fa0a-45e6-b9c4-31f079f91883" id="a7ee12b2-fa0a-45e6-b9c4-31f079f91883-link">10</a></sup> две дорожки: удалить 18 атрибутов из списка или провести экспертную оценку риска. Российская практика по факту дрейфует ко второй.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Отдельная работа для всех, кому синтетику продают как серебряную пулю: <span class='font-weight-bold'>Stadler, Oprisanu, Troncoso, Synthetic Data – Anonymisation Groundhog Day, USENIX Security 2022</span><sup data-fn="735cd239-fd5b-4c7a-b4cc-117ec352059a" class="fn"><a href="https://quality-lab.ru#735cd239-fd5b-4c7a-b4cc-117ec352059a" id="735cd239-fd5b-4c7a-b4cc-117ec352059a-link">11</a></sup>. Вывод неудобный: сама по себе синтетика не дает лучшего баланса между приватностью и полезностью, чем классическая анонимизация. Либо теряете полезность, либо защищаете не все записи, а предсказать заранее, где окажетесь, трудно. Отсюда единственный рабочий вывод: <span class='font-weight-bold'>не верить, а измерять.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Еще две цифры на случай, если кто-то думает, что убрал ФИО и теперь безопасно. Латания Суини<sup data-fn="7617c8c9-03a2-4e8a-91c5-227710f7686c" class="fn"><a href="https://quality-lab.ru#7617c8c9-03a2-4e8a-91c5-227710f7686c" id="7617c8c9-03a2-4e8a-91c5-227710f7686c-link">12</a></sup> еще в девяностых показала: около 87% американцев однозначно определяются по связке индекса, даты рождения и пола. Rocher, Hendrickx и de Montjoye в Nature Communications за 2019 год оценили<sup data-fn="c225365b-f293-4675-82a6-b48cadf9793f" class="fn"><a href="https://quality-lab.ru#c225365b-f293-4675-82a6-b48cadf9793f" id="c225365b-f293-4675-82a6-b48cadf9793f-link">13</a></sup>, что<span class='font-weight-bold'> 99,98% американцев можно переопределить по пятнадцати демографическим атрибутам</span>, причем даже на сильно прореженных выборках. Пятнадцать атрибутов есть в любой таблице клиентов.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<figure style="max-width:1100px; margin:30px auto; font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;">
<div style="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;">
<div style="overflow-x:auto; -webkit-overflow-scrolling:touch;">
<table style="width:100%; min-width:900px; border-collapse:collapse; font-size:14px; line-height:1.5;">
<caption style="font-size:18px; font-weight:700; color:#1f2937; text-align:left; padding:0 0 16px 0; caption-side:top;">Шесть способов получить тестовые данные</caption>
<thead>
<tr>
<th style="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; white-space:nowrap; width:16%;">Подход</th>
<th style="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; white-space:nowrap; width:15%;">Обратимость</th>
<th style="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; white-space:nowrap; width:20%;">Статус по 152-ФЗ</th>
<th style="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; white-space:nowrap; width:16%;">Ссылочная целостность</th>
<th style="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; white-space:nowrap; width:17%;">Годится для нагрузки</th>
<th style="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; white-space:nowrap; width:16%;">Трудозатраты на старте</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Копия прода «как есть»</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#6b7280; vertical-align:top;">—</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#dc2626; vertical-align:top; font-weight:600;">ПДн в полный рост</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; font-weight:600;">идеальная</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; font-weight:600;">да</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; font-weight:600;">нулевые</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Маскирование с ключом (FPE / HMAC)</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#dc2626; vertical-align:top; font-weight:600;">есть</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#dc2626; vertical-align:top; font-weight:600;">ПДн (псевдонимизация)</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; font-weight:600;">сохраняется</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; font-weight:600;">да</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; font-weight:600;">низкие</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Обезличивание по приказу № 140</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#d97706; vertical-align:top; font-weight:600;">частичная</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#d97706; vertical-align:top; font-weight:600;">обезличенные ПДн, ст. 13.1</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#d97706; vertical-align:top; font-weight:600;">требует усилий</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#d97706; vertical-align:top; font-weight:600;">частично</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#d97706; vertical-align:top; font-weight:600;">средние</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Синтез без формальных гарантий</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; font-weight:600;">нет</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; font-weight:600;">не ПДн — если доказано</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#d97706; vertical-align:top; font-weight:600;">нужно проектировать</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; font-weight:600;">да</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#dc2626; vertical-align:top; font-weight:600;">высокие</td>
</tr>
<tr>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#1f2937; vertical-align:top; font-weight:700;">Синтез с дифференциальной приватностью</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; font-weight:600;">нет</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#16a34a; vertical-align:top; font-weight:600;">не ПДн, с гарантией</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#d97706; vertical-align:top; font-weight:600;">нужно проектировать</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#dc2626; vertical-align:top; font-weight:600;">хвосты умирают</td>
<td style="padding:14px; border-bottom:1px solid #f0f2f5; color:#dc2626; vertical-align:top; font-weight:600;">очень высокие</td>
</tr>
<tr>
<td style="padding:14px; color:#1f2937; vertical-align:top; font-weight:700;">Гибрид: правила + синтез + каталог патологий</td>
<td style="padding:14px; color:#16a34a; vertical-align:top; font-weight:600;">нет</td>
<td style="padding:14px; color:#16a34a; vertical-align:top; font-weight:600;">не ПДн — если доказано</td>
<td style="padding:14px; color:#16a34a; vertical-align:top; font-weight:600;">проектируется явно</td>
<td style="padding:14px; color:#16a34a; vertical-align:top; font-weight:600;">да, лучше всех</td>
<td style="padding:14px; color:#d97706; vertical-align:top; font-weight:600;">средние</td>
</tr>
</tbody>
</table></div>
</p></div><figcaption style="font-size:14px; color:#6b7280; text-align:center; margin-top:14px; font-style:italic; line-height:1.5;">Шесть способов получить тестовые данные. Нижняя строка — то, к чему в итоге приходит большинство зрелых команд: нейросеть отвечает за структуру, правила — за форматы и ключи, каталог патологий — за хвосты. Про дифференциальную приватность отдельно: она нужна, когда данные уходят наружу, и почти никогда — когда они остаются в вашем контуре.</figcaption></figure>
<p><!-- /wp:html --></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:heading --></p>
<h2 class="wp-block-heading">Главный вывод первой части</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Закон не запрещает работать с тестовыми данными – он запрещает работать с ними небрежно. </span>Граница между псевдонимизацией, обезличиванием и синтезом не техническая, а правовая, и цена ошибки здесь не часы переделки, а оборотные штрафы и репутация. Приказ Роскомнадзора № 140, стандарты Росстандарта по синтезу, требования GDPR и HIPAA – все сходится в одном: документально доказанный остаточный риск повторной идентификации. Не название метода и не уверенность на совещании, а отчет, который можно положить на стол аудитору.</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:paragraph {"style":{"color":{"background":"#ddf3ed"}}} --></p>
<p class="has-background" style="background-color:#ddf3ed">Мы в «Лаборатории качества» во время <a href="https://quality-lab.ru/qa-audit/" data-type="page" data-id="24392">аудитов</a> находим в среднем от двух до пяти проблем в тестовых контурах, о которых команды заказчиков даже не подозревали. Иногда это забытая выгрузка с реальными телефонами, иногда – маскирование, которое юридически не обезличивает ничего. Хотите узнать, все ли на вашем проекте в порядке? Запишитесь на бесплатную консультацию. Разберем ваш кейс и ответим на вопросы. </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:details --></p>
<details class="wp-block-details">
<summary><span class='font-weight-bold'>Чем отличаются тестовые данные от боевых?</span></summary>
<p><!-- wp:paragraph {"placeholder":"Введите / для добавления скрытого блока"} --></p>
<p>Боевые данные – это реальные записи людей и организаций, используемые в продуктиве. Их утечка влечет штраф по 152-ФЗ до 1–3% выручки (мин. 25 млн руб к повторной утечке спец категорий и биометрии, для общих данных минимум – 20 млн). Тестовые данные нужны для отладки и нагрузочного тестирования. Они не являются персональными данными, так как не позволяют идентифицировать субъекта, и для работы с ними не требуют прохождения процедур ИСПДн, если они получены синтетическим путем.</p>
<p><!-- /wp:paragraph --></details>
<p><!-- /wp:details --></p>
<p><!-- wp:details --></p>
<details class="wp-block-details">
<summary><span class='font-weight-bold'>Можно ли тестировать на копии продакшн-базы?</span></summary>
<p><!-- wp:paragraph {"placeholder":"Введите / для добавления скрытого блока"} --></p>
<p>Копия базы продакшена содержит персональные данные и подпадает под действие 152-ФЗ. По Приказу Роскомнадзора № 140 хранить исходные и обезличенные данные в одной системе запрещено. Передача копии базы подрядчику или выгрузка в незащищенный тестовый контур незаконны. Чтобы тестировать на копии, необходимо предварительно провести полное обезличивание или псевдонимизацию с выносом ключей в отдельное защищенное хранилище.</p>
<p><!-- /wp:paragraph --></details>
<p><!-- /wp:details --></p>
<p><!-- wp:details --></p>
<details class="wp-block-details">
<summary><span class='font-weight-bold'>Что такое синтетические данные и чем они отличаются от маскирования?</span></summary>
<p><!-- wp:paragraph {"placeholder":"Введите / для добавления скрытого блока"} --></p>
<p>Маскирование подменяет значения в реальных записях, сохраняя связь с реальным субъектом. Ключ обратимости означает, что данные остаются персональными. Синтез генерирует новые, вымышленные записи на основе статистических паттернов оригинала. Связи с реальным человеком нет, поэтому данные не являются ПДн. Но отсутствие утечки необходимо подтверждать: по стандартам ПНСТ 1064-1066 предоставляется отчет об оценке качества и остаточного риска приватности.</p>
<p><!-- /wp:paragraph --></details>
<p><!-- /wp:details --></p>
<p><!-- wp:details --></p>
<details class="wp-block-details">
<summary><span class='font-weight-bold'>Чем маскирование отличается от обезличивания по закону?</span></summary>
<p><!-- wp:paragraph {"placeholder":"Введите / для добавления скрытого блока"} --></p>
<p>Маскирование с сохранением обратимого ключа – это псевдонимизация. Данные остаются персональными по 152-ФЗ, а система – ИСПДн. Обезличивание по Приказу Роскомнадзора № 140 – это необратимое преобразование, когда личность нельзя установить ни при каких условиях. Оно требует строгого раздельного хранения исходных и преобразованных данных и ведения учета каждой выгрузки, так как полностью выводит данные из-под ответственности оператора ПДн.</p>
<p><!-- /wp:paragraph --></details>
<p><!-- /wp:details --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:footnotes /--></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>]]></description>
<link>https://quality-lab.ru/blog/sinteticheskie-dannye-dlya-testirovaniya-metodologiya-masshtab-i-kontrol-privatnosti/</link>
<pubDate>Fri, 18 Sep 2026 11:31:00 +0300</pubDate>
</item>
<item>
<title>Что значит «отвечать за качество»?</title>
<description><![CDATA[<p>Автор: <a href="https://t.me/quality_trek" mce_href="https://t.me/quality_trek" target="_blank" style="">Пономарева Анастасия</a></p>
<p>Недавно знакомый PM попросил рассказать «Что значит отвечать за&nbsp;качество?» в&nbsp;контексте продуктовых команд. Вопрос оказался не&nbsp;из&nbsp;простых, ведь каждый проект имеет свои особенности. Да&nbsp;и понятие качества может отличаться. Ниже&nbsp;— мой взгляд на&nbsp;тему через призму измеримых показателей. Если у&nbsp;вас есть дополнения, другие метрики или&nbsp;иной управленческий опыт&nbsp;— велкам в&nbsp;комментарии. Будет интересно обсудить и расширить картину.</p><p>Начну немного издалека. Последние лет пять тема продуктовых команд очень популярна. Тестировщиков из «колодцев» и подчинения QA&nbsp;лидам и хэдам забирают в&nbsp;команды. Если сначала&nbsp;было матричное управление с&nbsp;функциональным руководством, то последние годы растет тренд на&nbsp;отказ от&nbsp;QA&nbsp;лидов с&nbsp;передачей функции&nbsp;лидам продуктовых команд.</p>]]></description>
<link>https://www.software-testing.ru/library/around-testing/management/4536-responsible-for-quality</link>
<pubDate>Tue, 15 Sep 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Автоматизация нудной рутины с Goose и Playwright MCP</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/goose1.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/goose1.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Филип Рик (Filip Hric)<br /><strong><a href="https://filiphric.com/how-i-automated-the-annoying-part-of-my-job-with-goose-and-playwright-mcp" mce_href="https://filiphric.com/how-i-automated-the-annoying-part-of-my-job-with-goose-and-playwright-mcp" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод: </strong>Ольга Алифанова</p>
<p>Никто не любит переключаться между контекстами, и я не исключение. Когда я глубоко погружён в работу, то обычно записываю заметки где-нибудь сбоку и продолжаю работать.</p>
<p>Но после завершения сессии концентрации обычно приходится сталкиваться со скучной и длительной задачей — переносить эти заметки в систему тикетов, чтобы команда могла обработать обратную связь по продукту и баг-репорты.</p>
<p>И поскольку мне нравится автоматизировать свои проблемы, я решил упростить это с помощью инструментов, которые пробовал в последнее время. Покажу, как использовал Goose, Playwright MCP и их новое расширение Playwright MCP Bridge для Chrome, чтобы автоматизировать скучную задачу создания множества тикетов во внутренней системе отслеживания задач.</p>]]></description>
<link>https://www.software-testing.ru/library/testing/testing-automation/4507-goose-and-playwright-mcp</link>
<pubDate>Sun, 13 Sep 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Юзабилити-аудит для B2B-сайта франшизы: от красивых кнопок к соответствию ожиданиям пользователей</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p>Когда заказчик просит «посмотреть сайт свежим взглядом» и заказывает <a href="https://quality-lab.ru/usability-testing/" data-type="page" data-id="15065">анализ юзабилити</a>, он часто ожидает услышать про цвета, шрифты или расположение кнопок. Но важно понимать: <span class='font-weight-bold'>внешность сайта &#8212; это лишь интерфейс (UI)</span>. А настоящий<span class='font-weight-bold'> юзабилити-аудит (UX) охватывает намного больше факторов и показателей</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":31249,"width":"251px","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="669" height="715" src="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-92_11zon.png" alt="пользовательское тестирование" class="wp-image-31249" style="width:251px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-92_11zon.png 669w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-92_11zon-281x300.png 281w" sizes="(max-width: 669px) 100vw, 669px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">К примеру, если предприниматель заходит на B2B-сайт франшизного проекта, он ожидает увидеть цифры, сроки окупаемости и юридическую прозрачность. Если вместо этого он видит развлекательный контент, это не «креатив». Это нарушение базового принципа соответствия системы реальному миру. И именно такие нарушения стоят бизнесу миллионов рублей упущенной прибыли.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Решили поделиться интересным кейсом «Лаборатории качества». Мы провели комплексный <a href="https://quality-lab.ru/blog/kachestvennyj-yuzabiliti-ux-kak-klyuch-k-uspexu/" data-type="post" data-id="24539">UX-аудит</a> сайта франшизы федеральной сети салонов для животных и выявили <span class='font-weight-bold'>19 критических ошибок и 29 точек роста</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>Аудит выполняли наши специалисты с опытом в B2B и юзабилити-анализе. Был использованы такой стек: Яндекс.Метрика (Вебвизор, карты кликов, воронки), инструменты автоматизированного тестирования, чек-листы по эвристикам Нильсена и методы когнитивного walkthrough. Такой микс компетенций и подбор команды позволил найти не только визуальные недочеты, но и скрытые технические и юридические риски.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Шаг 1. Анализ Яндекс.Метрики: от цифр к гипотезам о поведении</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Прежде чем смотреть на дизайн, мы изучили <span class='font-weight-bold'>данные за последние полгода (02.02.2026 &#8212; 02.08.2026)</span>. Цифры сами по себе не дают ответов, но они позволяют сформулировать точные гипотезы о том, <em><span class='font-weight-bold'>где</span></em> и <em><span class='font-weight-bold'>почему</span></em> пользователи теряются. Картина была противоречивой: <span class='font-weight-bold'>трафик рос (+20,7%)</span>, но <span class='font-weight-bold'>конверсия падала (-0,42%)</span>. Доход по целям сократился на 6,93%. Это классический сигнал о том, что качество трафика или соответствие интерфейса ожиданиям аудитории ухудшилось.</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'>Гипотеза 1: </span>нерелевантный трафик из платных каналов. Канал Google Ads приносил 3 574 визита (9,4% всего трафика), но конверсия составляла всего 0,03%, а доход &#8212; 1 000 рублей. <em>Для сравнения:</em> органический поиск при меньшем объеме в 2,5 раза давал конверсию 9,3% и доход 167 500 рублей.</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>либо реклама настроена неверно, либо посадочная страница не соответствует ожиданиям аудитории из этого источника. Сайт «обманывает» ожидания кликнувших по объявлению, что подтверждается высоким показателем отказов (23,7%) и снижением времени на сайте на 10,55%. <em>Примечание: В рамках данного аудита фокус был на основном проблемном канале, но рекомендация по аудиту распространяется на все платные источники.</em></li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Гипотеза 2: </span>первый экран не удерживает B2B-аудиторию. 44,8% пользователей уходили после просмотра одной страницы. При этом те, кто смотрел 2-3 страницы, имели конверсию 2%, а доскроллившие до отзывов и цифр &#8212; 8,9%. Эти пользователи приносили 66,1% всего дохода.</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 --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Гипотеза 3:</span> основной инструмент лидогенерации работает против пользователя. Квиз был главным инструментом захвата лидов (26 700 просмотров, 4 837 запусков). Однако конверсия внутри него составила всего 3,5% (169 заявок). 80% пользователей открывали квиз, но не нажимали кнопку «Пройти». Еще 48% бросали заполнение формы контактов в самом конце.</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>стартовый экран квиза не продает ценность, а финальная форма вызывает недоверие или сложность. Инструмент, который должен генерировать заявки, фактически отсекает 96,5% потенциальных клиентов.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Гипотеза 4: </span>аудитория ищет бизнес-информацию, а получает развлечения. Ядро целевой аудитории &#8212; женщины 35-54 лет с долгосрочными интересами в финансах, бизнесе, красоте и здоровье. Они приходят за цифрами, сроками и гарантиями, так как должны понимать, во что им предлагают вкладывать инвестиции.</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>наблюдается полное несоответствие ментальной модели B2B-инвестора с B2C-развлечениями на сайте. Развлекательный контент создает когнитивный диссонанс и снижает доверие к бренду как к надежному партнеру для бизнеса.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph {"style":{"color":{"background":"#f7eccd"}}} --></p>
<p class="has-background" style="background-color:#f7eccd"><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">Шаг 2. Экспертный анализ по эвристикам Нильсена: поиск ошибок и точек роста</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":31250,"width":"294px","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/09/Rectangle-89_11zon.png" alt="юзабилити тестирование" class="wp-image-31250" style="width:294px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-89_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-89_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-89_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-89_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:heading {"level":3} --></p>
<h3 class="wp-block-heading">Нарушение принципа «Соответствие системы реальному миру» (ошибка)</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Сайт продавал сложную услугу для бизнеса (B2B), но вел себя как развлекательный портал для конечных потребителей (B2C). </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>выдуманные персонажи-животные занимали 30% контента;</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: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>валидация полей показывала зеленые галочки при вводе невалидного телефона («+7 (2») и email («test»). Ошибка появлялась только после нажатия «Отправить»;</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>после прохождения интерактивного теста ссылка на бонус вела в пустую папку облачного хранилища. Пользователь тратил время, оставлял контакты, но не получал обещанное. Это полностью обесценивало инструмент;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>все ссылки на «Политику конфиденциальности» вели на страницу 404 с креативной иллюстрацией. Для юридического документа это недопустимо.</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:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>добавить детальное описание паушального взноса и роялти (сейчас пользователь видит сумму, но не понимает состав);</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>расширить FAQ с 3 до 8-10 вопросов для снятия возражений;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>оптимизировать блоки с персонажами: сократить количество шагов или изменить действие кнопок;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>удалить или переработать блок «Тип бизнеса» (абстрактная концепция, AI-изображения).</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Шаг 3. Когнитивный разбор сценариев: путь предпринимателя vs B2C-подход</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":31253,"width":"292px","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="890" src="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-94_11zon.png" alt="тестирование ui ux" class="wp-image-31253" style="width:292px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-94_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-94_11zon-300x261.png 300w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-94_11zon-768x668.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">Мы смоделировали поведение типичного партнера (женщина 40 лет, ищет инвестиции, интересуется финансами) и сравнили его с тем, что предлагает сайт. Здесь мы анализировали когнитивную нагрузку: где возникает перегрузка, путаница или сомнения.<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: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 месяцев»). <em>Нагрузка:</em>пользователю приходится гадать или спрашивать менеджера.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Нет детализации взносов и роялти. <em><span class='font-weight-bold'>Нагрузка:</span></em> недоверие («скрывают условия»).</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Блок «Цели на будущее» с sticky-эффектом зависал при скролле, заставляя ждать смены слайдов. <em><span class='font-weight-bold'>Нагрузка:</span></em> потеря контроля над просмотром, утомление.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Блок «Новости и СМИ» занимал 20% длины страницы, отвлекая от целевых действий. <em><span class='font-weight-bold'>Нагрузка:</span></em> визуальный шум, сложность поиска сути.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph {"style":{"color":{"background":"#f7eccd"}}} --></p>
<p class="has-background" style="background-color:#f7eccd"><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">Шаг 4. Технический аудит и комплаенс: где скрыты юридические риски</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":31254,"width":"250px","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="500" height="503" src="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-95_11zon.png" alt="проведение пользовательского тестирования" class="wp-image-31254" style="width:250px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-95_11zon.png 500w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-95_11zon-298x300.png 298w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-95_11zon-150x150.png 150w" sizes="(max-width: 500px) 100vw, 500px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Юзабилити - это не только удобство, но и <a href="https://quality-lab.ru/blog/a-vashi-testirovshhiki-zashhishhayut-vash-produkt-i-kompaniyu-ot-millionnyx-shtrafov/" data-type="post" data-id="29493">безопасность</a>. Мы выявили критические проблемы соответствия законодательству, которые грозили финансовыми и репутационными рисками для бизнеса.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Нарушение 152-ФЗ:&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> В чекбоксах форм была только ссылка на Политику конфиденциальности. Штраф: 60 000–100 000 ₽;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Cookie-баннер имел только кнопку «Принять»</span>. Отсутствовала возможность отклонить или настроить категории cookie. Штраф: до 300 000 ₽.</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:heading --></p>
<h2 class="wp-block-heading">Шаг 5. Сравнительный анализ с конкурентами</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Важно было проверить сайт клиента на соответствие рыночным стандартам. Мы сравнили его с сайтами эталонных конкурентов и выявили ключевые пробелы.</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>
<td><span class='font-weight-bold'>Риск</span></td>
</tr>
<tr>
<td>Финансовая модель</td>
<td>Можно скачать PDF/Excel</td>
<td>Только калькулятор на сайте</td>
<td>Потеря 15–25% конверсии, недоверие</td>
</tr>
<tr>
<td>Договор франшизы</td>
<td>Публичная оферта/PDF</td>
<td>Отсутствует</td>
<td>Снижение доверия, рост вопросов менеджерам</td>
</tr>
<tr>
<td>Виджет чата</td>
<td>WhatsApp/Telegram в углу</td>
<td>Только ссылки в футере</td>
<td>Конверсия в мессенджеры 0,16% vs 5–10% у лидеров</td>
</tr>
<tr>
<td>Cookie-баннер</td>
<td>Категории + настройка</td>
<td>Только «Принять»</td>
<td>Юридический риск, негативный UX</td>
</tr>
<tr>
<td>Согласие на рассылку</td>
<td>Отдельный чекбокс</td>
<td>Объединено с ПДн</td>
<td>Риск штрафов по ФЗ «О рекламе»</td>
</tr>
<tr>
<td>Форма отзыва согласия</td>
<td>Есть в футере/политике</td>
<td>Отсутствует</td>
<td>Нарушение 152-ФЗ, штраф до 100 тыс. ₽</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph {"style":{"color":{"background":"#f7eccd"}}} --></p>
<p class="has-background" style="background-color:#f7eccd"><span class='font-weight-bold'>Вывод:</span> отсутствие базовых элементов доверия (договор, финмодель, прозрачные условия) напрямую влияет на bottom line. Бизнес теряет деньги не потому, что продукт плохой, а потому что интерфейс не дает пользователю чувства безопасности, необходимого для принятия решения о крупной инвестиции. Внедрение этих элементов &#8212; это не «украшательство», а прямая работа над увеличением выручки.</p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></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:paragraph --></p>
<p><span class='font-weight-bold'>Топ-4 задачи (Critical):</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>Оптимизировать основной инструмент лидогенерации. Изменить первый экран (показать выгоду), упростить форму контактов, добавить мотивационные триггеры. Цель: рост конверсии с 3,5% до 8-10%.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Добавить навигацию. Фиксированное меню с якорями + кнопка «Наверх». Решить проблему 44,8% отказов и потери ориентации на длинном лендинге.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Добавить недостающий B2B-контент. Сроки запуска, детализация взносов, скачиваемая финансовая модель, расширенный FAQ. Закрыть потребности аудитории 35-54 лет.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Проработанный UX позволяет добиться предсказуемого пользовательского поведения</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:preformatted --></p>
<pre class="wp-block-preformatted">Хорошее юзабилити <a href="https://quality-lab.ru/blog/yuzabiliti-testirovanie-bez-rozovykh-ochkov/" data-type="post" data-id="29642">не делает сайт более красивым или стильным</a>. Оно делает его предсказуемым и более конверсионным. Когда предприниматель заходит на сайт франшизы, он хочет чувствовать себя в безопасности. Он хочет видеть, что компания понимает его задачи, уважает его время и говорит с ним на языке бизнеса.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":31255,"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="681" height="591" src="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-90.png" alt="пользовательское тестирование" class="wp-image-31255" style="width:290px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-90.png 681w, https://quality-lab.ru/wp-content/uploads/2026/09/Rectangle-90-300x260.png 300w" sizes="(max-width: 681px) 100vw, 681px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Как только мы убираем красивые картинки с излишним интертейментом с B2B-сайта, и добавляем сухие, но необходимые данные (сроки, документы, финансовые модели), то площадка начинает работать на свою целевую аудиторию и приносить бизнесу достойный результат.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#f7eccd"}}} --></p>
<p class="has-background" style="background-color:#f7eccd">Кстати, клиент принял наши рекомендации практически в полном объеме, отметив понятность, пользу и удобство отчёта. В ближайшее время уже приступит к внедрению изменений.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Это лучшее подтверждение того, что качественный <a href="https://quality-lab.ru/blog/issledovatelskoe-testirovanie-i-uxaudit-dlya-internet-magazina/" data-type="post" data-id="29685">UX-аудит</a> — это не просто список правок, а дорожная карта для роста бизнеса. Помните: Пользователю не нужно, чтобы было красиво. Ему нужно, чтобы было понятно, безопасно и полезно. Всё остальное &#8212; просто декорации. А чтобы отличить декорации от работающего инструмента, нужны данные, документы и системный подход.</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/usability-testing/" data-type="page" data-id="15065">юзабилити</a>? Напишите нам, и мы покажем скрытые проблемы: от когнитивной нагрузки до нарушений 152‑ФЗ. Запишитесь на бесплатную консультацию – разберём 2–3 ключевых сценария и дадим список гипотез для проверки.</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/yuzabiliti-audit-dlya-b2b-sajta-franshizy-ot-krasivyx-knopok-k-sootvetstviyu-ozhidaniyam-polzovatelej/</link>
<pubDate>Thu, 10 Sep 2026 14:12:25 +0300</pubDate>
</item>
<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>Зачем командам разработки и 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://www.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://www.software-testing.ru/library/around-testing/processes/4505-10x</link>
<pubDate>Sun, 30 Aug 2026 23:00:00 +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://www.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://www.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>Почему индустриальный подход к качеству важнее 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.webp" mce_src="https://software-testing.ru/images/stories/library/11hs/industrial-approach-to-quality/industrial-approach-to-quality1.webp" 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://www.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>Курсор, куда ты лезешь? Эх, не прокатило...</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>Мои 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>Анализируем данные в файле с помощью ИИ</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>Как я сделала отчет о дифференциальном тестировании через 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>
</channel>
</rss>
