<?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>Как я сделала отчет о дифференциальном тестировании через Cursor</title>
<description><![CDATA[<p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Я хочу рассказать, как я сделала отчет о дифференциальном тестировании (сравнение двух функций на одних данных) через ИИ. Знаю, что многие уже применяют ИИ и в хвост и в гриву, но также много тех, кто пока не умеет этого делать.</p><figure class="full-width" style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: center; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><img alt="Картинка на заставку, конечно же, тоже сделала через ИИ (нанобанано)" decode="async" height="768" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/5bd/ce5/01f/5bdce501f1f6fce2a6b73630835df624.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/5bd/ce5/01f/5bdce501f1f6fce2a6b73630835df624.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/5bd/ce5/01f/5bdce501f1f6fce2a6b73630835df624.png 781w" style="border-style: none; height: auto; margin: 0px; max-width: 100%; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle;" title="Картинка на заставку, конечно же, тоже сделала через ИИ (нанобанано)" width="1376" /><div style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><figcaption style="color: #8f8f8f; font-size: 0.8125rem; line-height: 1.125rem; margin-top: 4px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; white-space: pre-wrap;">Картинка на заставку, конечно же, тоже сделала через ИИ (нанобанано)</figcaption></div></figure><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Поэтому я хочу показать на конкретном примере из жизни, где еще несколько лет назад пришлось бы делать красивый отчет в ручную, а теперь его делает робот за пару минут. Возможно, это вдохновит вас тоже попробовать сделать нечто похожее =))</p><div style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; line-height: 1.4375rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: left; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="font-size: large;"><a href="https://habr.com/ru/articles/1058722/" target="_blank">Ссылка на Хабр</a></span></div><div><br /></div><span><a name='more'></a></span><h3 style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; font-size: 1.125rem; font-weight: 500; line-height: 1.4375rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><br /></h3><h3 style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; font-size: 1.125rem; font-weight: 500; line-height: 1.4375rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Мой пример</h3><p><a class="anchor" id="my_case" name="my_case" style="background-color: white; color: #548eab; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" target="_blank"></a><a class="anchor" id="tests" name="tests" style="background-color: white; color: #548eab; display: block; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin-top: 12px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" target="_blank"></a></p><h4 style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; font-size: 16px; font-weight: 500; line-height: 1.25rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">1. Проведение тестирования</h4><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Тестировала задачу исследования — изменение коэффициента похожести для поиска дублей. То есть функция определения коэффициента уже есть, работает. Но решили «тут поменять, там поменять», и посмотреть, станет ли лучше.&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Поэтому это и называется задачей исследования — мы не сразу заменяем старую функцию новой, а проводим эксперимент:</p><ol style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="counter-increment: item 1; line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">делаем вторую функцию,&nbsp;</p></li><li style="counter-increment: item 1; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">готовим тестовые данные,&nbsp;</p></li><li style="counter-increment: item 1; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">прогоняем их на старой и новой функции,</p></li><li style="counter-increment: item 1; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">анализируем результат — если “да, круто вышло!”, то заменяем одну функцию на другую, если “чет не то”, то думаем дальше.</p></li></ol><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Вторую функцию сделали, моя задача была — провести шаги 2-3. И частично 4, нужно красиво-понятно отобразить отчет о тестировании, чтобы аналитик его изучил и потом уже принимал решение.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Тестовые данные я подготовила сама. Посмотрела на ТЗ и так, и эдак, и поняла, что я дольше буду расписывать ИИ, что именно тут надо сделать, чем сделаю это сама. Хотя ИИ я все равно погоняла и в хвост, и в гриву для сбора тестовых данных, но об этом я расскажу в следующий раз.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Данные собрала, потом написала автотесты. Выглядят они примерно так (для простоты понимания будем сравнивать ФИО):</p><pre style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(247, 247, 247); border-radius: 4px; border: 1px solid rgb(240, 240, 240); box-sizing: border-box; color: #333333; font-size: 0.875rem; line-height: 1.6; margin: 32px 0px 0px; overflow-wrap: normal; overflow: auto; padding: 17px 10px 10px 20px; quotes: &quot;«&quot; &quot;»&quot;; tab-size: 4; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; word-break: normal;"><code style="background: 0px 0px; border-radius: 4px; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, Courier, monospace; font-size: inherit; overflow-wrap: normal; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; tab-size: 4; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; word-break: normal; word-spacing: normal;">Опечатка в отчестве;99;Назина;Ольга;Евгеньевна;Назина;Ольга;Еквгеньевна</code><div class="code-explainer" style="display: flex; left: 0px; margin-top: 2px; position: sticky; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><a class="tm-button code-explainer__link" href="https://sourcecraft.dev/" style="align-items: center; background-color: rgba(0, 0, 0, 0); border-color: currentcolor; border-image: none; border-style: none; border-width: medium; color: #548eab; cursor: pointer; display: flex; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 0.75rem; gap: 6px; line-height: 0.875rem; margin-left: auto; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; text-decoration: none; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; visibility: visible;" target="_blank">Объяснить с<img src="https://assets.habr.com/habr-web/release_2.330.3/client/img/sourcecraft-light-BPeLGH4v.svg" style="border-style: none; height: 14px; margin: 0px; max-width: 100%; object-fit: cover; object-position: left center; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle; width: 87px;" /></a></div></pre><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Что тут есть:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Описание теста</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Коэффициент похожести</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">ФИО первой пары в трех ячейках</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">ФИО второй пары</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Обычно в автотестах делают разные файл — что подается на вход, что получаем на выходе. Но у меня выходной параметр всего один (коэффициент), поэтому он записывается сразу внутри теста.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Если автотест упадет, выглядеть это будет так (допустим, вместо коэффициента 99 вернулся 0):</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;Expected:&nbsp; [2/Similarity]:99</em></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Actual:&nbsp; [2/Similarity]:0</em></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Input data: 1. Опечатка в отчестве;99;Назина;Ольга;Евгеньевна;Назина;Ольга;Еквгеньевна</em></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Etalon data: 1. Опечатка в отчестве;99;Назина;Ольга;Евгеньевна;Назина;Ольга;Еквгеньевна</em></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Result data: 1. Опечатка в отчестве;0;Назина;Ольга;Евгеньевна;Назина;Ольга;Еквгеньевна</em></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Это стандартный вывод автотестов:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Input data — что на входе</em></p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Etalon data — что я ожидаю</em></p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Result data — что тест ожидает</em></p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Да, в моем случае <em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Input и Etalon </em>совпадают, но зато такое решение работает как для разных входных-выходных файлов, так и для одного.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Итак, автотесты я сделала. Получилось их довольно много, больше 300, так как много разных сценариев нужно было покрыть + на каждый сценарий надо было сделать 2-6 тестов (тест-дизайн и все такое).</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Прогнала на новой функции — 100 падений (цифры эти для примера, но чтобы показать масштаб проблемы формирования результата). Сохранила результаты прогона в файл new.txt.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Прогнала на старой функции — 200 падений (то есть новая работает лучше).&nbsp; Сохранила результаты прогона в файл old.txt.&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Огонь, осталось оформить!</p><hr style="background-color: white; border-color: rgb(51, 51, 51) rgb(51, 51, 51) currentcolor; border-image: none; border-style: solid solid none; border-width: 1px 1px 0px; box-sizing: content-box; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; height: 0px; margin: 56px auto; max-width: 280px; overflow: visible; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" /><h4 style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; font-size: 16px; font-weight: 500; line-height: 1.25rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">2. Оформление результата</h4><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Я подумала — как я хочу видеть результат? Хорошо бы в виде таблички, чтобы сразу видно “эта функция справилась, эта нет”.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Взяла из результатов прогона новой функции первое падение (см пример выше) и на его основе накидала в конфлюенсе такую табличку:</p><div style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><div class="table" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><div class="table table_wrapped" style="margin-bottom: 24px; overflow-x: auto; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><table style="border-collapse: collapse; border: 1px solid rgb(191, 191, 191); margin: 32px 0px 0px; min-width: 100%; quotes: &quot;«&quot; &quot;»&quot;; table-layout: fixed; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; width: auto; word-break: normal;"><tbody style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><tr style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Описание</span></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Коэф</span></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">ФИО 1</span></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">ФИО 2</span></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">testOldFunction</span></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">testNewFunction</span></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Комментарий</span></p></td></tr><tr style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><td colspan="7" style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">testOldFunction работает, testNewFunction нет</span></p></td></tr><tr style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">1. Опечатка в отчестве</p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">99</p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Назина</p><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Ольга</p><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Евгеньевна<br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" /></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Назина</p><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Ольга</p><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Еквгеньевна<br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" /></p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Успех</p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">FAIL / ожидает 0</p></td><td style="border: 1px solid rgb(191, 191, 191); line-height: 1.5; min-width: 50px; padding: 6px 12px 9px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: top;"><p align="left" style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"></p></td></tr></tbody></table></div></div></div><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">По сути я просто вытащила все колонки из теста и добавила в конец 3 новые для анализа результата:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">testOldFunction</span> — как справилась старая функция</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">testOldFunction</span> — как справилась новая функция</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Комментарий </span>— чтобы подсвечивать “тут некритично, а тут обратите внимание!”</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Что писать в колонки прогонов:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Успех — если в файле прогона функции НЕТ этого теста, значит, он не упал, а прошел успешно. По крайней мере я сохранила в файл именно падения.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">«FAIL / ожидает такое-то значение», чтобы было видно, что ждем мы (2 колонка) и что выдал тест.</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Ну и, конечно, результаты надо бы сгруппировать:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Старая функция работает, новая нет</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Новая функция работает, старая нет</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Обе не работают</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">И внутри еще сгруппировать (помните ведь, что падений было 200+, да?). Я посмотрела глазками отчеты и выделила некоторые повторяющиеся падения.&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Допустим, есть проблема в двойном имени. Тогда все сценарии, в которых оно участвует, упадут. И вот эти падения хотелось бы сгруппировать, чтобы:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Сразу увидеть масштаб проблемы — сколько таких сценариев сломалось</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Понять, что еще сломалось — увидеть все другие падения отдельно, а не так, что через раз будет “снова двойное имя”.</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Так, работа понятна! Но делать ее вручную — это ж капец сколько времени! Вытащить из результатов падений что-то одно (например, строку Result data), чтобы открыть в экселе, а не блокноте, чтобы это все скопировать и вставить в таблицу в конфлюенсе.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Но ведь все группировки придется делать вручную! Да, можно через поиск их находить и копировать пачками, а потом удалять в прогоне и смотреть, что осталось, но все равно это очень унылая работа.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">А вот робот с рутиной справляется на ура! Главное, четко сформулировать ему, что именно ты хочешь. И показать, в каком виде тебе это нужно сделать. А у меня и это есть, вон табличка с примером.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Я выгрузила эту табличку из конфлюенс в ворд-файл test_results_demo.docx, чтобы скормить ИИ. Правда, пришлось внести коррективы уже на этом этапе. Исходно то я и правда вставила в конфлюенс тест «как ]]></description>
<link>http://okiseleva.blogspot.com/2026/07/cursor.html</link>
<pubDate>Tue, 21 Jul 2026 17:40:06 +0300</pubDate>
</item>
<item>
<title>Как тестировщику участвовать в open-source проектах</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/open-source-projects.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/open-source-projects.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Има-Абаши Эффионг (Ima-Abasi Effiong)<br /><strong><a href="https://www.ministryoftesting.com/articles/how-to-contribute-to-open-source-projects-as-a-software-tester" mce_href="https://www.ministryoftesting.com/articles/how-to-contribute-to-open-source-projects-as-a-software-tester" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><h1>Почему тестировщикам важно участвовать в проектах с открытым исходным кодом (OSS)</h1>
<p>Участие в open source помогло мне приобрести множество навыков. Я научилась эффективно и уважительно общаться, что укрепило уверенность при взаимодействии с людьми. И хотя я не пишу код, я стала уверенно пользоваться GitHub и командной строкой в терминалах — навыком, который можно освоить только на практике. Open source предоставляет такую возможность.</p>]]></description>
<link>https://software-testing.ru/library/around-testing/job/4500-how-to-contribute-to-open-source-projects-as-a-software-tester</link>
<pubDate>Sun, 19 Jul 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Мобильный маркетинг начинается с QA: как тестирование влияет на модерацию и рейтинг приложения</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p><em><span class='font-weight-bold'>Пока разработчики заняты кодом, маркетолог рискует столкнуться с оттоком пользователей и обвалом рейтинга приложения. Узнайте, почему тестировщики &#8212; верные союзники маркетологов в удержании позиций на рынке мобильных приложений.</span></em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Эта статья – для тех, кто продвигает мобильные приложения. Можно готовить гениальные рекламные кампании, но низкий рейтинг в сторах убивает конверсию на корню. К тому же магазинов становится всё больше: от классических Play Market и App Store до отечественного RuStore и более экзотических альтернатив – например, AppGallery от Huawei (его пришлось запустить из‑за закрытия доступа к сервисам Google). Работать сложнее из‑за региональной фрагментации интернет‑среды и всеобщей зарегулированности.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Так, может, пусть айтишники сами разбираются? При чём здесь маркетинг?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Полтора года назад я могла бы согласиться – я толком даже не интересовалась, чем занимаются тестировщики. Серьёзно. К тому моменту я уже 10 лет работала в диджитал и классическом маркетинге: перформанс, ивенты, контент, работа с репутацией – вот это всё. О тестировании я, конечно, знала, но аббревиатуру QA впервые услышала в 2025 году, когда получила оффер от <a href="https://quality-lab.ru/" data-type="page" data-id="18174">«Лаборатории качества»</a>. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В первый месяц среди тестировщиков мне казалось, что это слишком техническая сфера. Утешала я себя на первых порах тем, что мне для продвижения хватит знания продукта и аудитории, а там по ходу разберусь. И QA‑мир меня захватил – особенно когда я поняла, насколько тестирование полезно для <a href="https://quality-lab.ru/blog/5-smertnykh-grekhov-podgotovki-k-black-friday/" data-type="post" data-id="28544">интернет‑маркетинга</a>. Это был приятный культурный и профессиональный шок: теперь я смотрю на продвижение цифровых продуктов совсем другими глазами.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>За последние полтора года я много общалась с тестировщиками, ходила на <a href="https://quality-lab.ru/blog/meetup-2-security-ai/" data-type="post" data-id="28079">вебинары</a>, прочитала книгу Романа Савина «Тестирование Дот Ком, или Пособие по жестокому обращению с багами в интернет‑стартапах», прошла курсы по QA на Stepik и в <a href="https://quality-lab.ru/education/" data-type="page" data-id="30">учебном центре</a> своей компании. Я не эксперт по QA и не претендую на этот статус, но<span class='font-weight-bold'> у меня есть взгляд со стороны маркетинга</span> – и именно с этой точки зрения мне открылась одна неприятная вещь, которой хочу с вами поделиться.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Тезис у меня простой и немного провокационный</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30718,"width":"400px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="1016" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/Replace_the_AppStore_logo_with_a_logo_featuring_a_raccoon_an-Photoroom-1_11zon-1.png" alt="мобильный маркетинг" class="wp-image-30718" style="width:400px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/Replace_the_AppStore_logo_with_a_logo_featuring_a_raccoon_an-Photoroom-1_11zon-1.png 1016w, https://quality-lab.ru/wp-content/uploads/2026/07/Replace_the_AppStore_logo_with_a_logo_featuring_a_raccoon_an-Photoroom-1_11zon-1-298x300.png 298w, https://quality-lab.ru/wp-content/uploads/2026/07/Replace_the_AppStore_logo_with_a_logo_featuring_a_raccoon_an-Photoroom-1_11zon-1-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/07/Replace_the_AppStore_logo_with_a_logo_featuring_a_raccoon_an-Photoroom-1_11zon-1-768x774.png 768w" sizes="(max-width: 1016px) 100vw, 1016px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>Пройдёт ли приложение модерацию? <br>Как пользователи его воспримут? <br>Понравится ли оно им? <br>Какой отзыв оставят?</span><br><br>Это чистая <span class='font-weight-bold'>ответственность маркетинга</span>. Но зачастую мы не вникаем в эти нюансы как следует. Пора это менять: <span class='font-weight-bold'>любой маркетолог, который продвигает мобильные приложения, должен разобраться в тестировании</span> – чтобы понимать, какие риски оно помогает закрыть.  </pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Мы практически целиком отдали вопрос размещения в сторах айтишникам, будто это не наше дело. И зря. Например, я вспоминаю два кейса из опыта, когда ещё на заре карьеры команда, в которой я работала, запустила приложение культурной направленности в App Store, и оно вышло в топы – за это нас, ребят из маркетинга и PR, прям захвалили, но мы сидели, скромно опустив глаза, так как понимали, что это не до конца наша заслуга и мы не совсем понимаем, как это произошло.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Также был случай, когда мы запустили приложение по доставке мясной продукции, и у него были конкретные проблемы с модерацией – запуститься не могли несколько недель. Нам не хватало экспертизы подсказать разработчикам, как это исправить. Оставалось только нервно ходить в IT‑отдел и обновлять статус задачи. Довольно неприятное ощущение, когда ты не можешь на что‑то повлиять, так как не разбираешься в механизмах.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Немного о продуктовом подходе</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>В России мобильные маркетологи нередко отвечают за продвижение и репутацию – занимаются ASO, работают с карточкой приложения, модерируют отзывы, а иногда и следят за опытом пользователя после установки. При этом в небольших проектах техническую часть берут на себя IT‑специалисты, а QA‑инженера зачастую вообще нет. На Западе подход другой: зоны ответственности чётко разделены – есть отдельные ASO‑, ORM‑ и QA‑специалисты, ведь там давно считают качество продукта основой маркетинга <span class='font-weight-bold'>(вспомним классику маркетинга – 4P: сначала продукт, потом цена, место и продвижение)</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>У нас <span class='font-weight-bold'>маркетологов до сих пор не всегда допускают к работе над продуктом</span>: во многих компаниях решения спускают сверху с установкой просто продвинуть товар и не «умничать». Чаще такой подход приводит не к успеху, а к болезненному опыту – и <span class='font-weight-bold'>в итоге всё равно приходится дорабатывать продукт и приводить его в соответствие с рыночным запросом</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Для размышлений</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li>Согласно <a href="https://developer.apple.com/app-store/ratings-and-reviews/" rel="nofollow">официальным рекомендациям Apple</a>, рейтинг и отзывы напрямую влияют на видимость приложения в App Store и количество установок. При этом компания рекомендует оперативно устранять технические проблемы, чтобы они не превращались в негативные отзывы пользователей. Именно поэтому качество тестирования становится не только технической, но и маркетинговой задачей.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>По данным исследования <a href="https://www.sciencedirect.com/science/article/pii/S0167811624000922" rel="nofollow">Elsevier</a>, сбор обратной связи пользователей при развитии приложения приводит к улучшению пользовательских оценок. Ну а пользовательский опыт напрямую зависит от качества продукта (привет, QA).</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Мобильный маркетинг начинается с тестирования</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>С первых месяцев работы я заметила: к нам регулярно приходят компании с проблемами мобильных приложений – чаще всего это либо провал модерации, либо низкий рейтинг (около двух звёзд), а иногда – постепенное падение оценок без понятной причины. При этом привлекать тестировщиков обычно решают разработчики, технические директора и продакты, а маркетологи подключаются крайне редко – и такой осознанный подход вызывает особое уважение.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Публикация приложения в сторах – это по сути продвижение: больше площадок – больше охват. Мы тщательно работаем над конверсией и тональностью комментариев, но при этом нередко игнорируем качество самого продукта, хотя именно оно напрямую влияет на оценки в магазинах и другие показатели. Пора менять этот подход: в 2026 году мобильному маркетингу критически важно интегрировать тестирование приложений – расскажу, что это даст.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dbeded"}}} --></p>
<p class="has-background" style="background-color:#dbeded"><em>Для этой части статьи я привлекла на помощь ведущего тестировщика нашей компании, поэтому дальше будет немного технического занудства. Но я постаралась описать его максимально понятно и просто. Также вас ждёт немного статистики и чек-лист, который можно сразу забирать в работу. Начинаем!</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Первый шаг: модерация</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Важный нюанс: <span class='font-weight-bold'>нет единого списка требований для прохождения модерации</span>. Каждый стор публикует собственные правила. При этом около 80% требований совпадают. Мы собрали их для вас в одну обзорную таблицу.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":30705,"sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="923" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0-%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B-%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3-1-2-923x1024.png" alt="тестирование мобильных приложений" class="wp-image-30705" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильны-маркетинг-1-2-923x1024.png 923w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильны-маркетинг-1-2-270x300.png 270w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильны-маркетинг-1-2-768x852.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильны-маркетинг-1-2-1385x1536.png 1385w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильны-маркетинг-1-2.png 1684w" sizes="(max-width: 923px) 100vw, 923px" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p>Большинство причин отклонения приложения связаны с качеством продукта, а не с рекламой. Тестирование помогает продвижению: повышает шансы на публикацию, снижает риск негативных отзывов и способствует росту рейтинга в сторах.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Интересная статистика: по разным оценкам, в App Store <span class='font-weight-bold'><a href="https://www.adalo.com/posts/common-app-store-rejection-reasons/" rel="nofollow">около четверти новых приложений</a> не может пройти модерацию с первого раза</span>. Вот что чаще всего становится причиной отказа (по сводкам за 2025–2026 годы):</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Приватность (Guideline 5.1.1).</span> Нет ссылки на политику конфиденциальности внутри приложения и в метаданных, приложение просит доступы к геолокации, контактам, камере без внятного объяснения зачем, нет возможности удалить аккаунт прямо в приложении. Apple на приватности повёрнут, и это самый частый повод для разворота.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true,"start":2} --></p>
<ol start="2" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Краши и баги (Guideline 2.1, «App Completeness»).</span> Ревьюер словил вылет, фриз или нерабочий экран &#8212; всё, до свидания. И не важно, что у вас на устройстве всё летает: у него другая модель телефона, другая версия ОС, слабый интернет &#8212; и баг вылез.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":3} --></p>
<ol start="3" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Метаданные не соответствуют реальности (Guideline 2.3).</span> Скриншоты показывают функции, которых в приложении нет. Или &#8212; мой любимый случай &#8212; на скриншоте для App Store размещён макет на Android-телефоне. Это мгновенный разворот (это уже точно <span class='font-weight-bold'>маркетинговый косяк</span>).</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":4} --></p>
<ol start="4" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Сырой материал.</span> Тексты «Lorem ipsum», «coming soon», битые ссылки, нерабочий support URL (ревьюер по нему реально кликает и ждёт увидеть живую страницу поддержки).</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":5} --></p>
<ol start="5" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Покупки и подписки (Guideline 3.1.1).</span> Сломана или спрятана кнопка «Восстановить покупки».</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":6} --></p>
<ol start="6" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Минимальная функциональность (Guideline 4.2) и клоны (4.1).</span> Например, если Apple считает, что ваше приложение ничем не отличается от браузерной версии продукта.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>И это только один магазин приложений! <span class='font-weight-bold'>А вы заметили, сколько из этих требований пересекается с зоной ответственности маркетинга?</span> Скриншоты, тексты карточки, соответствие обещаний реальности – это всё наше родное. А значит, маркетолог, который в этом не разобрался или вовремя не привлёк дополнительную экспертизу в виде мобильного QA‑инженера, вполне может своими непродуманными действиями привести к провалу модерации. Или же, наоборот, способствовать прохождению этого «весёлого» квеста с первого раза. Без магния и походов к психологу (это уже что‑то личное, простите). </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dbeded"}}} --></p>
<p class="has-background" style="background-color:#dbeded">Не забывайте, что в некоторых случаях выход приложения на рынок раньше вашего конкурента – это вопрос завоевания доли рынка или даже выживания. Поэтому не рискуйте и не тратьте время на тормоза при модерации – берите контроль в свои руки.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Второй шаг: рейтинг и видимость</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Допустим, прошли модерацию. Дальше начинается то, ради чего всё затевалось, – органика. И вот тут рейтинг становится одним из ключевых факторов ранжирования и конверсии. Вот вам наглядная таблица.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":30707,"sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="866" src="https://quality-lab.ru/wp-content/uploads/2026/07/%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0-%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3-2-3-1024x866.png" alt="продвижение мобильных приложений" class="wp-image-30707" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-2-3-1024x866.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-2-3-300x254.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-2-3-768x649.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-2-3-1536x1299.png 1536w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-2-3.png 1684w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph --></p>
<p>Вот несколько интересных отрезвляющих цифр.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>90% приложений, которые попадают в подборки App Store, имеют рейтинг 4,0 и выше.</span> Приложения с рейтингом ниже <span class='font-weight-bold'>3,5</span> ранжируются примерно <span class='font-weight-bold'>в три раза реже</span> в топ-10 по ключевым запросам.  Это подтверждается исследованием <a href="https://www.apptweak.com/en/aso-blog/aso-app-store-trends-benchmarks-report" rel="nofollow">AppTweak</a>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Из этого же исследования известно, что даже <span class='font-weight-bold'>небольшое увеличение среднего рейтинга способно заметно повысить конверсию карточки приложения</span>. Пользователи значительно чаще устанавливают приложения с высоким рейтингом, а Apple прямо указывает, что оценки и отзывы помогают повысить обнаруживаемость приложения и стимулируют загрузки.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>77% людей <a href="https://www.alchemer.com/resources/blog/improve-mobile-app-ratings-and-reviews/" rel="nofollow">читают</a> хотя бы один отзыв перед установкой бесплатного приложения, 80% &#8212; перед платным.</span> Приложение с рейтингом ниже 4,0 часто просто пролистывают, даже если оно стоит высоко в выдаче.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Важная и недооценённая штука &#8212; <span class='font-weight-bold'>скорость появления свежих отзывов</span> (review velocity). Пользователи воспринимают недавно оставленные отзывы как более актуальные. Высокий рейтинг сам по себе не гарантирует успех. Если приложение давно не обновлялось и не получает новых отзывов, пользователи могут воспринимать его как заброшенное. Поэтому после каждого релиза важно не только исправлять ошибки, но и работать с обратной связью пользователей. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Подумайте также о первом пользовательском опыте. </span>Маркетинг оплачивает привлечение пользователя и если человек удаляет приложение после первого запуска из-за ошибок, то эти деньги уже не вернуть. Поэтому высокое качество работы приложения становится не только задачей разработки и QA, но и фактором окупаемости маркетингового бюджета.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Откуда берётся низкий рейтинг?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Можно долго рассуждать про не то время, не то место, не те деньги и так далее, но если посмотреть на реальные плохие отзывы в любом сторе, то огромная их доля &#8212; это конкретные баги: «Вылетает при оплате», «Не открывается на моём телефоне», «После обновления пропали все данные», «Кнопка не работает». Это не проблема позиционирования. Это пропущенные в прод баги. А люди хладнокровные, они не будут жалеть вас и ваше приложение.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>По данным опроса <a href="https://www.quality-ai.com/insights/news/survey-88-of-app-users-will-abandon-apps-based-on-bugs-and-glitches" rel="nofollow">QualiTest и Google Consumer Surveys</a>, более половины пользователей готовы отказаться от приложения, если сталкиваются с ошибками ежедневно. </span>Это ещё раз показывает, что даже небольшие, но регулярно повторяющиеся баги способны привести к потере аудитории.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>53% пользователей <a href="https://www.slideshare.net/slideshow/mobile-app-usersurveyfailingmeetuserexpectations/62096923" rel="nofollow">удаляли</a> мобильное приложение, если сталкивались с серьёзными проблемами &#8212; крашами, зависаниями или ошибками.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В индустрии есть бенчмарк стабильности &#8212; <span class='font-weight-bold'>доля сессий без крашей (crash-free sessions). Норма сейчас около 99,95%.</span> Звучит как почти 100%, но истина в хвостике: приложения, у которых этот показатель падает ниже <span class='font-weight-bold'>~99,7%</span>, статистически уезжают в зону рейтинга <span class='font-weight-bold'>ниже 3 звёзд</span>. Десятые доли процента крашей &#8212; и вот вам минус звезда.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>То есть связь прямая: баги, краши и сломанные сценарии приводят удалениям и злым отзывам, затем к падению рейтинга. Как итог: выпадение из выдачи, рост стоимости привлечения и падение охвата.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#dbeded"}}} --></p>
<p class="has-background" style="background-color:#dbeded">Так вот, <span class='font-weight-bold'>тестирование (QA) как раз пресекает эту порочную цепочку в самом начале</span>, до того, как баг увидел пользователем и проклял в отзыве всю вашу команду.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":30708,"sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="826" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0-%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3-3-2-826x1024.png" alt="Тестирование мобильных приложений" class="wp-image-30708" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-3-2-826x1024.png 826w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-3-2-242x300.png 242w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-3-2-768x952.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-3-2-1239x1536.png 1239w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-3-2-1652x2048.png 1652w, https://quality-lab.ru/wp-content/uploads/2026/07/Таблица-мобильный-маркетинг-3-2.png 1684w" sizes="(max-width: 826px) 100vw, 826px" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30709,"width":"304px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="683" src="https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-1-Photoroom_11zon-1024x683.png" alt="продвижение мобильных приложений" class="wp-image-30709" style="width:304px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-1-Photoroom_11zon-1024x683.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-1-Photoroom_11zon-300x200.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-1-Photoroom_11zon-768x512.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/An_anthropomorphic_3D_raccoon_Exudes_confidence_and_expertis-1-Photoroom_11zon.png 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Если свести всё в одну фразу: QA помогает приложению пройти модерацию с первого раза и не разочаровать реальных пользователей. А это ровно те две вещи, от которых зависит органический охват продукта и успешное выполнение маркетинговых целей.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Чек-лист сознательного маркетолога</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>1. Контролируйте ход работ, задавайте вопросы. </span>Если видите, что не хватает тестирования – согласуйте бюджет и привлекайте на аутсорсе или аутстафе напрямую или через вашего СТО. Самая дешёвая правка – та, которую сделали до подачи в стор. Попросите, чтобы вас звали на миты с разработкой, а не ставили перед фактом публикации. Ваш интерес тут законный: от качества релиза зависит охват и репутация.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>2. Пройдитесь по этим пунктам.</span> Это пять минут, но вы облегчите своей команде жизнь:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>ссылка на политику конфиденциальности есть и внутри приложения, и в метаданных, и она открывается;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>удаление аккаунта доступно прямо в приложении (если есть регистрация);</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>support URL ведёт на живую страницу с реальным способом связи, а не на 404 или заглушку;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>скриншоты показывают то, что реально есть в приложении, и соответствуют устройству (никаких андроид-макетов в App Store);</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>никаких «Lorem ipsum» и других сырых штук;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>кнопка восстановления покупок на месте и работает.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>3. Приложите ревьюеру записку (Review Notes). Если публикуете приложение не вы, то подсветите эту необходимость команде и подготовьте текст.</span> Если в приложении есть вход – дайте демо-аккаунт и логин/пароль ревьюеру. Опишите, как протестировать неочевидные фичи, объясните, зачем вы просите доступ к камере или геолокации. Половина отказов случается просто потому, что при ревью не смогли разобраться. Это, между прочим, чистый копирайтинг – тоже часть нашей работы.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>4. Настройте мониторинг отзывов.</span> Раз в неделю разбивайте свежие отзывы на три группы: баги, проблемы UX и запросы фич. Баги &#8212; немедленно командам разработки и тестирования, чтобы они не снижали рейтинг. И отвечайте на негатив в течение 24–48 часов: люди, получившие живой (не шаблонный!) ответ на плохой отзыв, заметно чаще возвращаются и поднимают оценку.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>5. Подружитесь с метрикой crash-free sessions.</span> Попросите у команды доступ к Firebase Crashlytics или аналогу и оценивайте его как маркетинговый показатель. Падение этой цифры – ранний сигнал, что через неделю-другую к вам поедет волна негатива и просядет рейтинг. Лучше узнать об этом из дашборда, чем из отзывов.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>6. Не лейте трафик на сырое приложение.</span> И это главное. Запустить дорогую рекламную кампанию на продукт, которое крашится у каждого десятого, – значит <span class='font-weight-bold'>платить за одно­звёздочные отзывы</span>. Вы своими руками приводите в стор недовольную аудиторию.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>7. Тестируйте не только продукт, но и карточку.</span> A/B-тесты скриншотов, иконки, текстов – это ASO, то есть наше поле. У топовых игр в Google Play больше половины команд тестируют скриншоты по нескольку раз в год, и это даёт ощутимый прирост конверсии. Тут маркетинг и культура тестирования вообще сливаются в одно.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p>Я по природе склонна постоянно искать новые подходы, но отношусь ко всему с изрядной долей скепсиса. Особенно в нашей сфере, когда любую новую штуку нам подают как революцию в профессии буквально каждую неделю. Но вот по поводу тестирования я искренне не понимаю, почему маркетологи упустили эту сферу из виду, особенно при взрывном развитии цифровых продуктов в последние 15 лет. Все сейчас хайпуют на ИИ, но ведь QA для маркетологов – это ещё один высокотехнологичный инструмент, который в нашей среде почти не используется.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Для себя я сделала однозначный вывод: <span class='font-weight-bold'>интернет-маркетолог, который продвигает мобильные приложения и другие цифровые площадки, но при этом не понимает, что такое тестирование и какие риски оно закрывает, – это уже вчерашний день.</span> Не потому что QA &#8212; это модная и эффектная аббревиатура, которую я выучила и теперь умничаю, а потому что без него мы получаем дыру в самом начале воронки.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>Не дайте багам обнулить маркетинговые усилия. Получите бесплатный разбор узких мест и технических причин низкой конверсии. Оставьте контакты – и мы дадим конкретные рекомендации.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Список официальных документов с требованиями в упомянутых в статье сторах:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://developer.apple.com/app-store/review/guidelines/" rel="nofollow">Apple App Store Review Guidelines</a></span></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://support.google.com/googleplay/android-developer" rel="nofollow">Google Play Developer Policy Center</a></span></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://developer.android.com/docs/quality-guidelines" rel="nofollow">Google Play Quality Guidelines</a></span></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://developer.huawei.com/consumer/en/doc/app/agc-help-appreview" rel="nofollow">Huawei AppGallery Review Guidelines</a></span></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://www.rustore.ru/help/developers" rel="nofollow">RuStore &#8212; Требования к приложениям</a></span></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://developer.amazon.com/docs/app-submission/submission-checklist.html" rel="nofollow">Amazon Appstore Developer Guidelines</a></span></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'><a href="https://seller.samsungapps.com/" rel="nofollow">Samsung Galaxy Store Seller Portal</a></span></li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>]]></description>
<link>https://quality-lab.ru/blog/mobilnyj-marketing-nachinaetsya-s-qa-kak-testirovanie-vliyaet-na-moderaciyu-i-rejting-prilozheniya/</link>
<pubDate>Thu, 16 Jul 2026 17:27:47 +0300</pubDate>
</item>
<item>
<title>При общении с ИИ не усложняйте вопрос, это сожрет лишние токены</title>
<description><![CDATA[<p>&nbsp;Я тут код исправляла <strike>грязными ручками</strike>. Скрипт заполнения таблицы составляется примерно так:</p><pre style="box-sizing: border-box; color: #182230; margin: 0px; max-width: 100%; min-width: 0px; overflow-wrap: anywhere; overflow: hidden; padding: 12px; white-space: pre-wrap; word-break: break-word;"><code style="box-sizing: border-box; font-size: 13px; line-height: 1.55;"><span style="font-family: Cascadia Mono, Consolas, Liberation Mono, monospace;">insert into table
( column_1, column_2, column_3, column_4)<br />select 'SYSTEM_A',  'ANY',       'ANY',      30 from dual union
select 'SYSTEM_B',  'ANY',       'ANY',      60 from dual union
select 'SYSTEM_C',  'ANY',       'ANY',      60 from dual;<br /><br /></span><span style="font-family: inherit;"></span></code></pre>Мне надо было его поправить — тут удалить строчку, там добавить, тут значение обновить... Вроде все сделала, а у меня автотесты перестали запускаться, падая на создании контекста.<div><br /></div><div>Я вроде понимаю, что где-то в скрипте "typo-fix" нужен, опечатка какая-то, но какая и где? Скрипт большой, самой искать не хочется. Решила сходить к Курсору за советом. И я же научена вводить в контекст, так что подсветила ему, какая именно ошибка мне выдается при сборке:</div><div><br /></div><div></div><blockquote><div>Проверь файл C:\tmp\schema\init\my_script.sql. При сборке мавеном падает на создании контекста: Caused by: org.hsqldb.HsqlException: unexpected end of statement : line: 96. Что не так в скрипте?</div><div></div></blockquote><div><br /></div><div>Курсор ушел в себя на час! Он насоздавал 17 файлов, запустил 69 команд, перебирая скрипт и всё, что лежит вокруг. Сожрал кучу токенов, что тоже важно.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyv6BxkR5AtEEv_MUZaLXqZLitbjmm71_hbFGOF-2sA7acKKPhncKU96TXj234YV9OvwuihiXAs2tzBeitbYNsTORfZ-vlvju3AJUiHESec_0VIHool53WLdHxg_x1wfeA-pO59iLC4nvEln261wxQamG9_3yQpgH_vgSCmYli83o39Spp8K5JQXo-0Bw/s1664/1784210168.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="928" data-original-width="1664" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyv6BxkR5AtEEv_MUZaLXqZLitbjmm71_hbFGOF-2sA7acKKPhncKU96TXj234YV9OvwuihiXAs2tzBeitbYNsTORfZ-vlvju3AJUiHESec_0VIHool53WLdHxg_x1wfeA-pO59iLC4nvEln261wxQamG9_3yQpgH_vgSCmYli83o39Spp8K5JQXo-0Bw/s320/1784210168.png" width="320" /></a></div><br /><div><br /></div><span><a name='more'></a></span><div>А ошибка оказалась банальной, это как внутри JSON-запроса обычно бывает, когда местами строки меняешь:</div><div><ul style="text-align: left;"><li>в последнюю строку накопипастил запятую в конце</li><li>в непоследнюю строку скопипастил БЕЗ запятой в конце</li></ul><div>Тут аналогично, непоследняя строка должна быть с union и без точки с запятой, последняя — наоборот. А я в одном или двух местах сделала криво.</div></div><div><br /></div><div>И можно было просто скормить ИИ-шке файл с вопросом, есть ли в скриптах проблемы. По идее, должен найти, в JSON-запросе находил легко.&nbsp;</div><div><br /></div><div>А тут я подсказала, что собираю мавеном, номер строки, на которой падает. Поэтому робот проверил эту строку — не на ней. Пошел изучать контекст, из чего скрипт в мавене собирается... И все это сожрало кучу времени и токенов =))</div><div><br /></div><div>И ведь была у меня мысль просто попросить проверить скрипт на ошибки, вне контекста. Задать вопрос попроще. Не стоило ее отметать ????</div><div><br /></div><div>Поэтому начинайте с более простых вопросов, особенно если есть подозрение, что ошибка простая и контекст ИИ не пригодится. А вот если простой вопрос не помог, то можно добавить контекста (у меня падает при сборке мавеном...)</div><div><br /></div><div><br /></div><div><i style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">PS — эта статья написана в помощь студентам моего курса «</i><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><i><a href="https://testbase.ru/learn/chatgpt" style="color: #336699; text-decoration: none;" target="_blank">Применение ChatGPT в тестировании</a>»</i></span><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">&nbsp;</span></div><div><br /></div>]]></description>
<link>http://okiseleva.blogspot.com/2026/07/blog-post.html</link>
<pubDate>Thu, 16 Jul 2026 17:22:34 +0300</pubDate>
</item>
<item>
<title>Типы границ для классов эквивалентности</title>
<description><![CDATA[<p>Автор: <a href="https://software-testing.ru//edu/tutor/5" mce_href="https://software-testing.ru/edu/tutor/5">Ольга Назина (Киселёва)</a>, автор курса&nbsp;<a href="https://software-testing.ru/edu/3-online/56-school-for-beginer" mce_href="https://software-testing.ru/edu/3-online/56-school-for-beginer">Школа для начинающих тестировщиков</a></p>
<div xmlns="http://www.w3.org/1999/xhtml"><img src="https://software-testing.ru/images/stories/library/11hs/equivalence-classes/equivalence-classes1.png" mce_src="https://software-testing.ru/images/stories/library/11hs/equivalence-classes/equivalence-classes1.png" width="500" mce_style="float: left;" style="float: left;" /><p>Про типы границ я впервые услышала на тренинге Алексея Баранцева. Зачем они нужны? Да просто чтобы не забыть всё проверить. Написал чек-лист, потом проверяешь себя:</p><p>— Все учел? Вот эти классы эквивалентности, какие границы логические? А какие технологические? ...</p><p>Так можно вспомнить о проверке, про которую забыл или просто не подумал! Полезная штука.</p><p>Алексей дал нам тогда про такую типизацию границ:</p><ul><li><p><strong>Физическая</strong> — которую физически нельзя преодолеть. </p></li><li><p><strong>Логическая</strong> — ограничение, накладываемое логикой, не программой.</p></li><li><p><strong>Технологическая</strong> — ограничение, накладываемое используемой технологией.</p></li><li><p><strong>Произвольная</strong> —&nbsp;ограничение, наложенное аналитиком или заказчиком.</p>]]></description>
<link>https://software-testing.ru/library/testing/test-analysis/4527-types-of-boundaries-for-equivalence-classes</link>
<pubDate>Tue, 14 Jul 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Начинаем работу с мутационным тестированием</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/mutation-testing2.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/mutation-testing2.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Баз Дейкстра (Bas Dijkstra)<br /><strong><a href="https://www.ontestautomation.com/on-getting-started-with-mutation-testing/" mce_href="https://www.ontestautomation.com/on-getting-started-with-mutation-testing/" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод: </strong>Ольга Алифанова</p><p>Как участники команды разработки программного обеспечения, мы тратим много времени на создание продуктов, от которых наши конечные пользователи (надеюсь) получают удовольствие. Мы также тратим значительное время на тестирование этих продуктов, а также на создание автоматизации, поддерживающей это тестирование. И чем выше степень автоматизации в процессе сборки, развертывания и доставки, тем больше доверия мы возлагаем на результаты этих автоматизированных тестов.</p>
<p>Во всём этом нет ничего нового: автоматизация тестирования, пайплайны сборки и практики вроде непрерывной интеграции уже давно часть нашей работы. Так почему же тогда, несмотря на высокий уровень доверия к автоматизированным тестам, команды (или, по крайней мере, те, с которыми мне доводилось работать) обычно тратят гораздо меньше времени на получение информации о качестве этих самы-х тестов?</p>]]></description>
<link>https://software-testing.ru/library/testing/other-testing/4499-on-getting-started-with-mutation-testing</link>
<pubDate>Sun, 12 Jul 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Настраиваем IDEA с ИИ, уточняем теорию, часть 3</title>
<description><![CDATA[<p>&nbsp;<i>С вами рубрика «где тестировщик может применять ИИ в своей работе»!</i></p><p>Я вроде уже настроила компьютер с помощью ИИ (начинала <a href="https://okiseleva.blogspot.com/2026/06/ide.html" target="_blank">тут</a>). Но все равно иногда всплывают моментики, которые я раньше бы спрашивала у своего куратора, а сейчас — у ИИ. Вот очередная пачка вопросов роботу, для вдохновения, с чем к нему вообще можно приходить.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLzkoVjOZqujQgVt9TIaS9ZbkR7Z2oHcnRfTOau7Cg816YKDOZUe3j-HXcwkoUaKgYo-sTpCyrkU7NPoTEn2IMsbDEUwiw9GI-hQErS9ertqTqhWu7KPGSzsd46FQ0sIeW52PCkflfZXI9h4-MKY0FnHQ47wj4xOjcijydWJS5w1NxW2MXjg3u_Kc1cWk/s2996/4_1_Anna_%D0%9D%D0%B5%20%D0%B1%D0%BE%D0%B9%D1%81%D1%8F,%20%D1%8F%20%D1%82%D0%B5%D0%B1%D0%B5%20%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D1%83.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2491" data-original-width="2996" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLzkoVjOZqujQgVt9TIaS9ZbkR7Z2oHcnRfTOau7Cg816YKDOZUe3j-HXcwkoUaKgYo-sTpCyrkU7NPoTEn2IMsbDEUwiw9GI-hQErS9ertqTqhWu7KPGSzsd46FQ0sIeW52PCkflfZXI9h4-MKY0FnHQ47wj4xOjcijydWJS5w1NxW2MXjg3u_Kc1cWk/s320/4_1_Anna_%D0%9D%D0%B5%20%D0%B1%D0%BE%D0%B9%D1%81%D1%8F,%20%D1%8F%20%D1%82%D0%B5%D0%B1%D0%B5%20%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D1%83.png" width="320" /></a></div><br /><p><br /></p><h3 style="text-align: left;">1. Как отменить настройку в IDE?</h3><p>Тыкнула в эксель-файлик в Giga IDE, он предложил прочитать его как текстовый, я сдуру и согласилась. А там все очень плохо с отображением таких файлов, если что))</p><p>Но теперь, тыкая на любой эксельник, он открывается в ИДЕ криво-косо. И тут или страдать (Open in explorer, чтобы открылась виндовая папка, открывать в ней), или изменить настройку. А где?&nbsp;</p><span><a name='more'></a></span><p>Отличный вопрос для ИИ! Прям так ему и пишем — что сделали и вопрос "как исправить":</p><p></p><blockquote><p>я сказала гига иде открыть эксель файл как текстовый, где поменять эту настройку, чтобы открывалось через строннее приложение (через эксель), а не через ИДЕ?</p><p></p></blockquote><p>ИИ выдал пошаговую инструкцию:</p><p></p><blockquote><p>Чтобы вернуть настройки и сделать так, чтобы Excel-файлы (<code>.xlsx</code>, <code>.xls</code>) открывались в системном приложении (MS Excel, LibreOffice и т.д.), а не как текст внутри Giga IDE, вам нужно изменить ассоциации файлов в настройках.<br /><br />Вот пошаговая инструкция, как это сделать:<br /><br /><b>Шаг 1. Откройте настройки</b><br /><br />• Нажмите <code>Ctrl + Alt + S</code> (на Windows/Linux) или <code>Cmd + ,</code> (на macOS).<br /><br />• Или перейдите через верхнее меню: <code>File</code> (Файл) -&gt; <code>Settings</code> (Настройки).<br /><br /><b>Шаг 2. Перейдите в раздел «Типы файлов»</b><br /><br />1. В левой колонке настроек разверните узел <code>Editor</code> (Редактор).<br /><br />2. Выберите пункт <code>File Types</code> (Типы файлов).</p><p>...</p></blockquote><p>По сути эти шаги самые важные — где эти настройки найти. Ну очень удобно с ИИ, конечно, потому что нагуглить такие вопросы настройки обычно сложно, надо читать огроные инструкции.</p><p><br /></p><p><br /></p><h3 style="text-align: left;">2. Как в гига иде поискать по названию класса?</h3><p>Собственно, весь вопрос в заголовке. Я раньше часто искала через название класса, руки помнили горячие клавиши, сейчас отвыкла и забыла все. Можно найти самой, прошерстерив менюшки программы, но зачем, когда под рукой есть чатик?</p><p></p><blockquote>как в гига иде поискать по названию класса?</blockquote><p></p><p><br /></p><p>ИИ ответил подробно, даже пару способов поиска привел, но меня интересовал вот этот кусочек:</p><p></p><blockquote>Этот способ ищет <b>только среди классов, интерфейсов и enum</b>, игнорируя обычные файлы и текст.<br /><br />• <b>Windows / Linux:</b> <code>Ctrl + N</code></blockquote><p>Так как я не перекрывала базовые настройки ИДЕ, то у меня срабатывают все подсказываемые комбинации горячих клавиш. И блин, как удобно иметь ИИ под боком в таких ситуациях! Не надо отвлекать коллег, не надо гуглить, спросил и сразу получил ответ!</p><p><br /></p><p><br /></p><h3>3. Что значит опция в гит-команде?</h3><div>Давно ничего не коммитила, подзабыла как это делается. Плюс у нас обновились иснтрукцию по созданию бранчей и коммитов туда. Вот, например, перед пушем теперь делаем пуш с&nbsp;--dry-run. А что это такое?</div><div><br /></div><div>Раньше был путь погуглить, теперь у меня для этого есть волшебный чатик:</div><div><br /></div><div><br /></div><div><blockquote>что значит Тестовый push с dry-run ?<br /><br />git push origin --dry-run</blockquote></div><div>И, пожалуйста, порция теории по моему вопросу!</div><p></p><blockquote><p>Флаг <code>--dry-run</code> (в переводе «пробный прогон» или «сухая тренировка») — это режим <b>безопасной проверки</b>.<br /><br />Когда вы выполняете <code>git push origin --dry-run</code>, Git <b>не отправляет</b> ваши коммиты на сервер. Вместо этого он имитирует процесс отправки и показывает вам, <b>что именно</b> он собирался бы сделать, если бы вы запустили реальную команду.<br /><br /><b>Зачем это нужно?</b><br /><br />Это отличный способ избежать ошибок перед важным пушем. Git покажет:<br /><br />1. Какие ветки он собирается обновить.<br /><br />2. Какие коммиты будут добавлены.<br /><br />3. Какие теги будут отправлены.<br /><br />4. Будут ли какие-то конфликты или ошибки доступа, не меняя ничего на самом сервере.<br /><br /><b>Пример того, что вы увидите в терминале:</b></p><p><b>...</b></p><p><b>Когда стоит использовать:</b></p><p><b>...</b></p><p><b>Короткий итог:</b> Это команда <b>«покажи, что будет, если я это сделаю, но ничего не меняй»</b>. Самый безопасный способ убедиться, что вы пушите именно то, что нужно.</p></blockquote><p></p><p><br /></p><p>В коммите нужен флаг -a, его если и помнила, то забыла. Снова к чату:</p><p></p><blockquote>git commit -a -m <br /><br />а что значит "-а"?</blockquote><p>Тут ответ приводить не буду, но смысл понятен — видишь что-то незнакомое, спроси чат! Если не понял ответ, можно так и сказать "я не поняла, зачем эта опция, покажи с примером"</p><p><i style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">PS — эта статья написана в помощь студентам моего курса «</i><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="color: #333333;"><span style="font-size: 14.85px;"><i><a href="https://testbase.ru/learn/chatgpt" target="_blank">Применение ChatGPT в тестировании</a>»</i></span></span>&nbsp;</p><p></p><code></code><p></p><p></p>]]></description>
<link>http://okiseleva.blogspot.com/2026/07/idea-3.html</link>
<pubDate>Fri, 10 Jul 2026 15:15:29 +0300</pubDate>
</item>
<item>
<title>5 промтов, которые сэкономили мне часы рутинной работы тестировщика</title>
<description><![CDATA[<p>Автор: Екатерина Гаврилова (QA Tech Lead в MD Audit)</p><p>Сегодня бы не будем говорить о банальностях типа чек-листов и тест кейсах. Эта база, я о ней уже писала <a href="https://software-testing.ru/library/testing/general-testing/4477-ii" mce_href="https://software-testing.ru/library/testing/general-testing/4477-ii" style="">коротко</a> и даже <a href="https://software-testing.ru/library/testing/testing-tools/4488-ii" mce_href="https://software-testing.ru/library/testing/testing-tools/4488-ii" style="">длинно</a>.   Речь пойдет именно о тех интересных вариациях использования нейросети, которые я не видела или не нашла.</p>]]></description>
<link>https://software-testing.ru/library/testing/other-testing/4526-ii</link>
<pubDate>Wed, 08 Jul 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Как маркетологу готовить сайты и приложения к акциям – и почему нельзя слепо доверять своим айтишникам</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p>Хочу поговорить о вещи, которую маркетологи часто упускают из виду, – <span class='font-weight-bold'>о тестировании площадок, куда мы гоним трафик.</span> Делюсь личным опытом. Раньше я, как и многие в маркетинге, не придавала тестированию большого значения. В отделе и так голова кругом: гениальные идеи от продажников, гипотезы от стажёров, десятки проектов одновременно – лишь бы всё успеть.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Всё поменялось, когда я пришла маркетологом в «Лабораторию качества» – компанию, которая давно работает на IT‑рынке и специализируется на обеспечении качества ПО, сайтов и приложений. Погружаясь в <a href="https://quality-lab.ru/outsourcing/" data-type="page" data-id="26">QA‑услуги</a>, я всё чётче видела, насколько это ценный инструмент для маркетолога. Жаль, что раньше мне никто не подсказал: нельзя полностью полагаться на IT. Сколько проблем можно было избежать! Сбои во время рекламных кампаний, падение функционала в самый горячий момент – всё это било по бюджету и репутации. <span class='font-weight-bold'>А ведь достаточно было просто проверить площадку для приёма трафика под нагрузкой.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">История о том, как наша реклама обвалила сайт федерального билетного оператора</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Объясню на конкретном кейсе. В 2023 году в Белгороде появился новый парк аттракционов «Калейдоскоп», и отдел, который я возглавляла на тот момент, курировал открытие и продвижение этого объекта.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Руководством было принято решение раздать билеты на торжественное открытие парка бесплатно. При этом нужно было всё грамотно организовать, чтобы не случилось коллапса и никто не чувствовал себя обиженным. Для этого разработали лендинг, продумали рекламную и коммуникационную кампании. С помощью посевов в региональных сообществах в соцсетях мы заранее сообщали дату бронирования билетов и подробно объясняли условия. Сами билеты можно было забронировать <a href="https://belgorod.kassir.ru/festivali/ootkryitie-parka-attraktsionov-v-belgorode-kaleydoskop" rel="nofollow">в системе Kassir</a> – не более трёх в одни руки.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В начале всё шло хорошо. Я лично зашла в кабинет к нашим разработчикам и спросила, выдержит ли лендинг нагрузку. Конечно же, мне ответили в духе: </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p>«Иди решай свои гуманитарные вопросы, не лезь к технарям. Давайте пусть каждый будет заниматься своим делом». </p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:paragraph --></p>
<p>Убедившись, что все понимают: трафик будет большим и лендинг должен его выдержать, – я спокойно делегировала им технические задачи и отправилась разгребать вопросы в отделе. Наш менеджер в Kassir также была со мной на связи и доброжелательно ответила, что на их стороне всё готово (хах, они явно не рассчитывали на то, что трафик из небольшого областного центра сможет обвалить федеральную систему). </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Мы приступили к запуску и дальше ситуация развивалась стремительно.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>2 августа в 14:30</span> мы объявили о начале брони билетов.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>В 14:37 наш лендинг сначала затормозил, а потом обвалился. </span>Потом заработал – и снова обвалился. И так несколько раз: полная катастрофа.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Затем произошло то, чего мы точно не ожидали: <span class='font-weight-bold'>белгородский трафик обвалил kassir.ru. Это было легендарно и ужасно одновременно. </span>Только те маркетологи меня поймут, кто испытывал нечто похожее.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#ffdbe4"}}} --></p>
<p class="has-background" style="background-color:#ffdbe4"><span class='font-weight-bold'>Всего за 37 минут, несмотря ни на что, все бесплатные билеты были забронированы. И на нас полился шквал негатива от обиженных людей, так как они посчитали, что столкнулись не с техническими сбоями, а с обманом и хитростями со стороны организаторов. Две‑три ночи мне не спалось от зашкаливающего адреналина и прокручивания ситуации в голове.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30657,"width":"448px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="529" height="478" src="https://quality-lab.ru/wp-content/uploads/2026/07/%D0%9D%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BE%D1%87%D0%BD%D0%BE%D0%B5-%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BB%D1%8F-%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%BE%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2-1.png" alt="Нагрузочное-тестирование-для-маркетологов" class="wp-image-30657" style="width:448px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/Нагрузочное-тестирование-для-маркетологов-1.png 529w, https://quality-lab.ru/wp-content/uploads/2026/07/Нагрузочное-тестирование-для-маркетологов-1-300x271.png 300w" sizes="(max-width: 529px) 100vw, 529px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30658,"width":"332px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="539" height="603" src="https://quality-lab.ru/wp-content/uploads/2026/07/%D0%BD%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BE%D1%87%D0%BD%D0%BE%D0%B5-%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BB%D1%8F-%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%BE%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2-2.png" alt="нагрузочное-тестирование-для-маркетологов" class="wp-image-30658" style="width:332px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/нагрузочное-тестирование-для-маркетологов-2.png 539w, https://quality-lab.ru/wp-content/uploads/2026/07/нагрузочное-тестирование-для-маркетологов-2-268x300.png 268w" sizes="(max-width: 539px) 100vw, 539px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Тогда я не знала, что всего этого можно было бы избежать, если бы IT‑служба и моей компании, и сервиса Kassir.ru заранее провела тестирование под нагрузкой. Как мы помним, незнание не освобождает от ответственности. Это правило, к сожалению, работает не только в правовом поле, но и в коммуникационном.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Нужно было что‑то решать. Мы договорились с руководством и для снижения градуса негатива решили раздать ещё 500 билетов, заранее объяснив ситуацию: могут быть сбои, это не обман, а издержки цифровизации. Мы сообщили, что, если желающих снова будет несколько тысяч одновременно, то сайт, к сожалению, может вновь не выдержать такой нагрузки. Тем более что операторы Kassir.ru уже предупредили нас об этом. Вторая волна тоже не прошла без происшествий, но поток негатива всё равно удалось остановить.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Почему не стоит всё перекладывать на IT-службу?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Да, как руководитель отдела продвижения, я не была виновата в произошедшем. Но сейчас, понимая, что всё можно было исправить, просто заранее подняв вопрос о <span class='font-weight-bold'>нагрузочном тестировании</span>, становится грустно.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Именно поэтому я считаю, что <span class='font-weight-bold'>каждый маркетолог, который продвигает <a href="https://quality-lab.ru/blog/5-smertnykh-grekhov-podgotovki-k-black-friday/" data-type="post" data-id="28544">маркетплейсы</a>, сайты, приложения и другие цифровые продукты, просто обязан углубиться в QA</span>. Нужно понимать, как подготовить площадку к приёму трафика не только с точки зрения дизайна, контента, CTA и механик привлечения, но и с технической стороны. Мы заинтересованы в устойчивости во время рекламных кампаний и распродаж как никто другой. Так давайте брать бразды правления в свои руки!</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30659,"width":"230px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="683" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/9ec9fd01-172c-438b-baaf-b711186c15d6-Photoroom_11zon-683x1024.png" alt="нагрузочное тестирование" class="wp-image-30659" style="width:230px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/9ec9fd01-172c-438b-baaf-b711186c15d6-Photoroom_11zon-683x1024.png 683w, https://quality-lab.ru/wp-content/uploads/2026/07/9ec9fd01-172c-438b-baaf-b711186c15d6-Photoroom_11zon-200x300.png 200w, https://quality-lab.ru/wp-content/uploads/2026/07/9ec9fd01-172c-438b-baaf-b711186c15d6-Photoroom_11zon-768x1152.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/9ec9fd01-172c-438b-baaf-b711186c15d6-Photoroom_11zon.png 1024w" sizes="(max-width: 683px) 100vw, 683px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Мы всегда отвечаем за трафик, но не всегда – за готовность сайта к пиковым нагрузкам. При этом, если лендинг, корзина, промо‑механика или форма заявки ломаются во время кампании, бюджет и все усилия сливаются мгновенно. Перекладывать низкую конверсию и провал маркетинговых активностей на айтишников глупо. Вот и думайте, кто должен заранее предусмотреть ресурсы на тестирование и обеспечить его проведение.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Когда я пришла в сферу качества, первое, что перевернулось у меня в голове, – это понимание: в тот злополучный день программист мне не врал, когда говорил, что всё будет хорошо. Это был честный ответ человека, который не понимал толком масштаба. Ведь внутренний IT отвечает за то, чтобы система работала «в обычном режиме». День ото дня штатная нагрузка предсказуема, и под неё всё настроено. А распродажа или вирусная акция – это не обычный режим, а аномалия, которой по умолчанию нет в их картине мира.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>И вот между этими двумя зонами – провал. Маркетологи обычно думают, что техническое состояние сайта – это зона ответственности IT. При этом айтишники думают, что всё будет нормально, потому что не догадываются о масштабе трафика. Да что там айтишники – и сам маркетинг порой может только догадываться, насколько сильно выстрелит та или иная реклама.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30660,"width":"284px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/86b911fa-b60a-4820-8361-68fd4b3793b2-Photoroom_11zon.png" alt="нагрузочное тестирование" class="wp-image-30660" style="width:284px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/86b911fa-b60a-4820-8361-68fd4b3793b2-Photoroom_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/86b911fa-b60a-4820-8361-68fd4b3793b2-Photoroom_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/86b911fa-b60a-4820-8361-68fd4b3793b2-Photoroom_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/07/86b911fa-b60a-4820-8361-68fd4b3793b2-Photoroom_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Я ни в коем случае не говорю, что внутренний IT – это плохо или что им нельзя доверять. Доверять нужно: это наши люди, они знают внутреннюю систему лучше любого подрядчика. Я говорю о другом: перед крупными запусками одного доверия мало – нужна проверка.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Где тонко, там и рвётся</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Я попросила одного из ведущих тестировщиков нашей компании помочь разобраться, в каких местах чаще всего происходят сбои во время пиковых нагрузок и почему это важно знать маркетологам. Делюсь списком с вами.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Форма заявки и регистрация. </span>Это самое слабое звено: записать данные в базу всегда сложнее, чем просто их показать. Когда на сайт одновременно заходит много людей, форма начинает сбоить – а хуже всего, если из‑за сбоя появляются дубли. Для маркетинга это прямой удар по качеству лидов.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":2} --></p>
<ol start="2" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Корзина и оформление заказа. </span>Тут завязано сразу много процессов: надо проверить, есть ли товар, зарезервировать его, несколько раз сходить в базу. Если блок падает, теряются реальные деньги – те самые, которые уже почти дошли до кассы.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":3} --></p>
<ol start="3" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Промо‑механика. </span>Промокоды, счётчики, лимиты «один в руки» – на первый взгляд мелочи, а на деле зона повышенного риска. При всплеске трафика система может случайно выдать один бонус дважды или показать отрицательный остаток. Я видела случай, когда из‑за этого сгорел бюджет на промо.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":4} --></p>
<ol start="4" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Платёжный шлюз и интеграции. </span>У платёжных сервисов есть жёсткие лимиты на количество запросов в секунду. Даже если ваш сайт работает без сбоев, оплата может не проходить просто потому, что вы упёрлись в ограничения партнёра. Для маркетинга это значит: трафик есть, интерес есть, а конверсия падает по техническим причинам.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":5} --></p>
<ol start="5" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Сторонние скрипты. </span>Чаты, виджеты, аналитика, рекомендательные блоки – всё это тянет ресурсы с чужих серверов. В пиковый момент такой скрипт может зависнуть и «положить» сайт. Результат – посетители уходят, а вы теряете конверсию.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":6} --></p>
<ol start="6" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Капча, авторизация, СМС‑коды.</span> Если на сайт одновременно приходит волна регистраций, сервисы рассылок быстро упираются в лимиты. Люди не получают коды подтверждения и не могут завершить регистрацию. С точки зрения маркетинга это выглядит как потеря интереса аудитории, хотя проблема чисто техническая.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true,"start":7} --></p>
<ol start="7" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Автомасштабирование не успевает за трафиком. </span>Облако действительно умеет добавлять мощности, но не мгновенно. Если все заходят в одну минуту – например, сразу после запуска рекламы, – сервис может упасть раньше, чем инфраструктура успеет нарастить ресурсы. А значит, пик трафика, на который вы рассчитывали, пройдёт впустую.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><em><span class='font-weight-bold'>Да, проблем много, но решение есть. Всё это можно обнаружить вовремя, если проверить поведение системы под конкретным профилем нагрузки.</span></em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Что такое нагрузочное тестирование и зачем это маркетологам?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Расскажу так, как мне самой объяснили, когда я ещё особо ничего не понимала.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><a href="https://quality-lab.ru/blog/kak-nagruzochnoe-testirovanie-zashhishhaet-biznes-ot-ubytkov/" data-type="post" data-id="29802">Нагрузочное тестирование</a> – это когда вашу систему специально нагружают. Есть инструменты, которые имитирует тысячи и десятки тысяч виртуальных пользователей. Они одновременно ходят по сайту, выполняя реальные пользовательские сценарии: переходят по ссылкам, добавляют товары в корзину, вводят промокоды и т.д. Задача такой проверки &#8212; обнаружить где, что и когда начнёт отказывать или сбоить.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Видов нагрузочного тестирования несколько, и все они отвечают на разные вопросы:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:table --></p>
<figure class="wp-block-table">
<table class="has-fixed-layout">
<tbody>
<tr>
<td><span class='font-weight-bold'>Вид тестирования</span></td>
<td><span class='font-weight-bold'>Суть для маркетологов</span></td>
</tr>
<tr>
<td>Нагрузочное тестирование (load)</td>
<td>Выполняется, когд нужно понять, выдержит ли система трафик во время акции. Для маркетолога это страховка: вы заранее знаете, потянет ли сайт ожидаемый приток пользователей</td>
</tr>
<tr>
<td>Стресс‑тест (stress)</td>
<td>Задача – найти точку, где система ломается. Нагрузку повышают и создают буквально экстремальные условия, пока сервис не начнёт сбоить. Так вы узнаёте реальный потолок возможностей ваших IT-продуктов до того, как столкнётесь с этим в реальности</td>
</tr>
<tr>
<td>Пиковая нагрузка (spike)</td>
<td>Проверяем сценарий «все пришли в одну минуту» – как бывает после рассылки, пуша или поста у крупного блогера. Именно такой резкий всплеск чаще всего срывает акции, и тест помогает к нему подготовиться</td>
</tr>
<tr>
<td>Тест стабильности (soak)</td>
<td>Смотрим, как система ведёт себя при долгой нагрузке – например, в течение недельной распродажи. Так выявляют проблемы, которые не проявляются сразу: утечки памяти, постепенное накопление сбоев</td>
</tr>
<tr>
<td>Объёмное тестирование (volume)</td>
<td>Выясняем, как сервис справляется, когда в базе не тысяча заявок, а миллион. К концу большой акции база сильно разрастается – и функционал, который отлично работал в начале, может сильно замедлиться</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph --></p>
<p>Главное – получить не просто «всё ок» или «всё плохо», а чёткие цифры. Например: система стабильно держит 8000 одновременных пользователей, при 11 000 начинает тормозить корзина, при 14 000 перестаёт работать оформление заказа. Узкое место – пул соединений к базе данных, на восстановление после пика нужно около двух минут.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>С такими данными вы уже не гадаете, а управляете рисками. Знаете свой потолок – и можете заранее что‑то сделать: нарастить мощности перед акцией, растянуть рассылку по времени, добавить очередь ожидания. Или хотя бы честно сказать руководству, на какой нагрузке система начнёт сбоить.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">На какие метрики нужно ориентироваться?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>А теперь секретное оружие. Я дам вам всего несколько слов, которые позволят разговаривать с айтишниками на одном языке и понимать, что вам показывают. Запомните эти термины.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>RPS (запросов в секунду) </span>– показывает, сколько обращений система обрабатывает за секунду. Простая, но надёжная оценка пропускной способности. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Зачем маркетологу:</span> помогает понять, выдержит ли сайт всплеск трафика во время акции – и не потеряет ли компания деньги из‑за того, что система «не потянет» наплыв пользователей.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Время отклика</span> – сколько уходит на ответ пользователю. Тут важно не ориентироваться на среднее значение: оно может скрывать проблемы. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Зачем маркетологу: </span>напрямую влияет на конверсию: если страница грузится долго, люди уходят, и рекламный бюджет сгорает впустую.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Перцентили (p95, p99)</span> – самый полезный показатель. Например, p95 = 2 секунды значит, что 95 % пользователей получают ответ быстрее, а 5 % ждут дольше. Если смотреть только на среднее, можно не заметить, что часть клиентов подолгу висит на загрузке – и терять премиальный трафик. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Зачем маркетологу:</span> позволяет увидеть реальную картину пользовательского опыта: даже если в среднем всё выглядит хорошо, отдельные группы аудитории могут сталкиваться с серьёзными задержками – и это бьёт по репутации и продажам.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Error rate (доля ошибок) </span>– процент запросов, которые завершились ошибкой под нагрузкой. Добиться нуля почти невозможно, но важно заранее определить, какой уровень ошибок для вас допустим. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Зачем маркетологу:</span> даёт чёткое понимание, сколько потенциальных клиентов реально теряют из‑за технических сбоев, – и помогает обосновать необходимость доработки или масштабирования перед запуском кампании.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Точка деградации </span>– момент, когда система начинает работать хуже. Это ключевая цифра в отчёте: именно она показывает реальный предел возможностей. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Зачем маркетологу: </span>позволяет заранее спланировать риски: если пик трафика может превысить этот порог, можно либо усилить инфраструктуру, либо скорректировать план продвижения – например, растянуть рассылку по времени.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Время восстановления</span> – как быстро система возвращается к нормальной работе после пика. Если она «отходит» полчаса после спада нагрузки, акция всё равно будет испорчена. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Зачем маркетологу:</span> критично для оценки устойчивости бизнеса к сбоям: даже кратковременный простой может стоить компании тысяч упущенных заказов, а долгое восстановление – усугубить негатив и снизить доверие аудитории.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Чек-лист: как подготовить площадку перед запуском акции, распродажи или рекламной кампании</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30661,"width":"245px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="683" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/0939dfd1-0993-4a46-b1ca-b44d02b2e03b-Photoroom_11zon-683x1024.png" alt="стресс тестирование" class="wp-image-30661" style="width:245px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/0939dfd1-0993-4a46-b1ca-b44d02b2e03b-Photoroom_11zon-683x1024.png 683w, https://quality-lab.ru/wp-content/uploads/2026/07/0939dfd1-0993-4a46-b1ca-b44d02b2e03b-Photoroom_11zon-200x300.png 200w, https://quality-lab.ru/wp-content/uploads/2026/07/0939dfd1-0993-4a46-b1ca-b44d02b2e03b-Photoroom_11zon-768x1152.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/0939dfd1-0993-4a46-b1ca-b44d02b2e03b-Photoroom_11zon.png 1024w" sizes="(max-width: 683px) 100vw, 683px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Это то, что спасёт вас от сбоев, проблем и головной боли. Главное –  спланировать и подготовить всё заранее. Даю вам рабочий таймлайн, проверенный на опыте.<br><br>Для тестирования используют разные <a href="https://quality-lab.ru/blog/lluchshie-instrumenty-i-strategii-nagruzochnogo-testirovaniya-rukovodstvo-dlya-cto/" data-type="post" data-id="28611">инструменты</a> – чаще всего JMeter, k6, Gatling, Locust, Яндекс Танк. Из более серьёзных решений – LoadRunner и NeoLoad. Маркетологу не нужно в них разбираться. Достаточно уметь задать простой вопрос: «Каким инструментом, по каким сценариям проверяли и какие цифры получили?» <br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>За 3–4 недели до старта:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Просчитайте пик нагрузки. Не пишите «будет много людей», а выведите точные цифры: сколько пользователей, с каких каналов, какой ожидается максимальный наплыв пользователей. Это основа для всех расчётов – без этих данных IT ничего не проверит.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Опишите, что будет делать пользователь во время акции: как зайдёт на сайт, как найдёт товар, как добавит в корзину и т.д. (всё зависит от конкретно вашего пользовательского пути – чем конкретнее пропишите, рем реальнее будет симуляция нагрузки).</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Заранее согласуйте бюджет на тестирование, особенно, если в вашей компании нет QA-инженеров.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>За 2 недели:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Проведите нагрузочное и стресс‑тестирование на копии системы (на стенде, как называют его в IT). Получите чёткие данные, где именно система начнёт сбоить.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Отдельно прогоните сценарий резкого наплыва (spike) – когда все заходят одновременно. Сбои из-за пиковых нагрузок особенно распространены при запуске рекламы.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Проверьте не только сайт, но и все внешние сервисы: платёжную систему, СМС‑рассылки, капчу и так далее. Учитывайте, что у каждого свои лимиты – сбой может случиться на любом участке.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>За неделю:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Вместе с IT устраните узкие места или осознанно сократите планируемый поток пользователей. Главное – действуйте на основе данных, а не наугад.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>После всех правок обязательно ещё раз всё протестируйте. Убедитесь, что проблемы реально удалось решить.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Настройте мониторинг и оповещения на день акции. В момент запуска следите за тем, что происходит, в реальном времени – не ждите, пока о сбое напишут в комментариях.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>В день акции</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Держите рядом дежурного от IT – не просто «на телефоне», а по‑настоящему на связи и готового сразу реагировать.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Заранее продумайте план Б на случай сбоя: страница‑заглушка с понятным текстом, очередь ожидания, запасной канал для связи с аудиторией. Если сбой грамотно обработать, удар по репутации будет куда меньше, чем от полной тишины и ошибки 502.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">А кто, собственно, должен платить за тестирование?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Перехожу к неудобному вопросу: <span class='font-weight-bold'>из какого бюджета должны идти деньги на тестирование?</span> IT не закладывает, потому что для них стабильность систем во время акций и распродаж не входит в KPI. Маркетинг не закладывает, потому что считает, что ещё только технических вопросов им не хватает ко всем прочим.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Давайте посмотрим на это трезво. <span class='font-weight-bold'>Запуск акции или распродажи без нагрузочного тестирования – крупный финансовый риск, и отвечает за провал именно маркетинг.</span> Если в момент кампании отваливается лендинг, корзина, промо‑механика или форма заявки, то бюджет на трафик сгорает в никуда. Я это видела своими глазами и заплатила за это собственными нервами. Защищает от такого риска только одна вещь – нагрузочное тестирование.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Стоимость проверки по нагрузкой под конкретное событие почти всегда намного меньше рекламного бюджета. Мы вкладываем сотни тысяч рублей в охваты – и не думаем о том, что можно вложить долю процента от этой суммы, чтобы гарантировать зашиту от слива денег и негатива пользователей.</span></p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30662,"width":"224px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="683" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/47816629-63f6-4fde-9236-2ec1ebec894d-Photoroom_11zon-683x1024.png" alt="нагрузочная проверка сайта" class="wp-image-30662" style="width:224px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/47816629-63f6-4fde-9236-2ec1ebec894d-Photoroom_11zon-683x1024.png 683w, https://quality-lab.ru/wp-content/uploads/2026/07/47816629-63f6-4fde-9236-2ec1ebec894d-Photoroom_11zon-200x300.png 200w, https://quality-lab.ru/wp-content/uploads/2026/07/47816629-63f6-4fde-9236-2ec1ebec894d-Photoroom_11zon-768x1152.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/47816629-63f6-4fde-9236-2ec1ebec894d-Photoroom_11zon.png 1024w" sizes="(max-width: 683px) 100vw, 683px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Мой вывод простой: раз ответственность за результат кампании лежит на маркетинге, значит, и инициатива проверить готовность инфраструктуры и заложить на это бюджет – тоже на нас. Не потому, что маркетологи теперь должны разбираться ещё и в графиках RPS. А потому, что больше об этом заранее никто не подумает, а отвечать перед руководством за провал приходится нам.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Ещё одна мысль, которую я вынесла дорогой ценой: <span class='font-weight-bold'>под крупные события внутренний IT стоит усиливать <a href="https://quality-lab.ru/blog/shtat-gibrid-ili-autsors-testirovaniya-chestnyj-razbor-ekonomiki-qa-komand-v-2026/" data-type="post" data-id="29877">внешними тестировщиками</a></span>. Как это проверить? Сходите и поговорите с ними на тему этой статьи. Если увидите непонимание в глазах ваших разрабов или активное сопротивление, то задуматься точно стоит. У внутренней команды глаз замылен, да и узкоспециализированных компетенций по нагрузке часто нет – это отдельная профессия. У подрядчика есть и нужные инструменты, и опыт работы с сотнями похожих кейсов, ну и привлекать их можно время от времени, только при случае необходимости.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">По итогу</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Выдержит ли сайт или приложение прирост трафика? Это можно узнать заранее: предупреждён – значит вооружён. Нагрузочное тестирование даёт гарантию и понимание ситуации. С ним вы управляете рисками, а без него – тратите нервы, которых у нас в маркетинге и так не хватает. Доверяйте внутреннему IT, но перед крупными событиями лучше привлечь подрядчика по тестированию нагрузки – и заранее заложить бюджет на QA‑услуги. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>Чтобы рассчитать стоимость нагрузочного тестирования именно для вашего проекта, запишитесь на бесплатную консультацию. Вы получите подробный разбор вашего кейса и конкретную сумму для планирования рекламного бюджета.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:latest-posts /--></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>]]></description>
<link>https://quality-lab.ru/blog/kak-marketologu-gotovit-sajty-i-prilozheniya-k-akciyam-i-pochemu-nelzya-slepo-doveryat-svoim-ajtishnikam/</link>
<pubDate>Wed, 08 Jul 2026 16:47:02 +0300</pubDate>
</item>
<item>
<title>Как убрать поп-ап с параметром в ТeamСity</title>
<description><![CDATA[<p>Столкнулась с такой проблемой — заходишь в&nbsp;ТeamСity (он же ТС) запустить деплой на тестовый контур, нажимаешь «Run», а тебе вылезает поп-ап окно «А вот этот параметр вы какой ожидаете?».</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTFLnrW2PuH7vKUJKRuAEsoi9Okfu3SpQYs4S2wKwHfIBgRoPyS4BuhOIpLuvsvEJT4hrXwOYZDGjsEeXP9qIs2269uWLQEiKYH428aJPGca09tH8Q4tfCEvDwt9Tpi9WozfzFeJoSb2csRowgNLNZ_AVBHwy6NEv_ZEHhKPrg5AReG-dF0zaAAOwe6gQ/s2436/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1081" data-original-width="2436" height="142" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTFLnrW2PuH7vKUJKRuAEsoi9Okfu3SpQYs4S2wKwHfIBgRoPyS4BuhOIpLuvsvEJT4hrXwOYZDGjsEeXP9qIs2269uWLQEiKYH428aJPGca09tH8Q4tfCEvDwt9Tpi9WozfzFeJoSb2csRowgNLNZ_AVBHwy6NEv_ZEHhKPrg5AReG-dF0zaAAOwe6gQ/s320/1.png" width="320" /></a></div><p>Когда-то это было оправданно, кнопка деплоит два сервера приложений, а иногда нужно обновить только один из них. Вот система и уточняет, надо ли обновлять второй, или лучше сэкономить время. Удобно!</p><p>Но со временем отпала необходимость обновлять что-то одно, поэтому поп-ап стал бесполезным, только лишний "тык" делать. В конце концов, если вдруг нужно прогнать с нестандартными параметрами, можно нажать многоточие около кнопки «Run». Но вот как убрать этот поп-ап?</p><span><a name='more'></a></span><p><br /></p><h3 style="text-align: left;">Как убрать поп-ап в шаблоне (на N сборок)</h3><p>1. Открыть нужную сборку в ТС, нажать "Edit configuration"</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCCgcrKJMsNe39WfLxN3Vijc6Sn7Kmmg-NvmooZmzzN8oTbuSAXGjX8y98nsXXnS8l2mdw5NNhzDGkhT6dm3bdUI8MSqD87W0NJ31z8AEwbpogONB4ZxL05pxjcL0Z9sZY4k5E_KI-T3uXGvaOrA29aoYGy6STMaCSxqbKDdmxmJDlZO_7f-NH_L__eFE/s835/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="441" data-original-width="835" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCCgcrKJMsNe39WfLxN3Vijc6Sn7Kmmg-NvmooZmzzN8oTbuSAXGjX8y98nsXXnS8l2mdw5NNhzDGkhT6dm3bdUI8MSqD87W0NJ31z8AEwbpogONB4ZxL05pxjcL0Z9sZY4k5E_KI-T3uXGvaOrA29aoYGy6STMaCSxqbKDdmxmJDlZO_7f-NH_L__eFE/s320/2.png" width="320" /></a></div><br /><p><br /></p><p>2. Но менять мы будем не эту конкретную конфигурацию, а шаблон! Сверху видим надпись «Based on templates» и список шаблонов, на которых основана сборка, в виде ссылок. Выбираем нужный шаблон и проваливаемся в него.</p><p>3.&nbsp;Перейти в параметры:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimJSahJGCGV0BPio6rb-RnidNPgkwWKhafrVpQN8ltXZvipId0JEFKnxSGEHfoyrebR3uojNVc4THQvE2gtA8lDuRXXdKro4NBeoF0u6Frf-tFa2L1aJwkaYSqdtXuJDxVF8i0cegjgIxlLWU10LsyHfxIGZY5XI6P5YeKw7g1_Zt2Q3KsFzRDJ0Rp_Ss/s587/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="584" data-original-width="587" height="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimJSahJGCGV0BPio6rb-RnidNPgkwWKhafrVpQN8ltXZvipId0JEFKnxSGEHfoyrebR3uojNVc4THQvE2gtA8lDuRXXdKro4NBeoF0u6Frf-tFa2L1aJwkaYSqdtXuJDxVF8i0cegjgIxlLWU10LsyHfxIGZY5XI6P5YeKw7g1_Zt2Q3KsFzRDJ0Rp_Ss/s320/3.png" width="320" /></a></div><br /><p>4. Редактировать нужный параметр — кнопка «Edit»</p><p>5. Видим параметры, прописанные одной строкой, но можно нажать кнопку «Edit», чтобы проще их редактировать было:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXKpXyt4X_M3isGlZgEultZ1tPUYYdAP7JGCNcbJpmJgKg51BbmHlbi-2BR3N9I6nzSC2I4t-RuvHrV6DUVXoxlHj0oR343MFuxUZU9rpLuIMlmLDBW1PjfyGy_tQfdU6KxFt7Gdz6yk0MFgxlgcauYA_rhrF1cFhBmytaS_CN4u5X5lFmzK8FurCvzWQ/s835/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="679" data-original-width="835" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXKpXyt4X_M3isGlZgEultZ1tPUYYdAP7JGCNcbJpmJgKg51BbmHlbi-2BR3N9I6nzSC2I4t-RuvHrV6DUVXoxlHj0oR343MFuxUZU9rpLuIMlmLDBW1PjfyGy_tQfdU6KxFt7Gdz6yk0MFgxlgcauYA_rhrF1cFhBmytaS_CN4u5X5lFmzK8FurCvzWQ/s320/4.png" width="320" /></a></div><br /><p>6. И вот тут параметр Display:</p><p></p><ul style="text-align: left;"><li>Prompt — вылезать поп-апом</li><li>Normal — обычный режим</li><li>Hidden — вообще спрятать параметр (если в конкретной сборке он мешает)</li></ul><p></p><p>Меняем на Normal, сохраняем - мы красавцы!</p><p><br /></p><h3 style="text-align: left;">Как поменять параметр в конкретной сборке</h3><p>Если бы надо было оставить параметр в шаблоне, но изменить только в конкретной сборке, основанной на нем, то в конфигурации сборки не надо переходить в шаблон (шаг 2 пропускаем).</p><p>Выбираем сразу нужный параметр → Override, поменяется только в этой сборке.</p>]]></description>
<link>http://okiseleva.blogspot.com/2026/07/eamity.html</link>
<pubDate>Tue, 07 Jul 2026 20:21:52 +0300</pubDate>
</item>
<item>
<title>Заранее находим, что тестировать: модель ревью требований</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/requirements-review-model.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/requirements-review-model.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Ханиша Арора (Hanisha Arora)<br /><strong><a href="https://www.ministryoftesting.com/articles/finding-software-testing-opportunities-early-with-the-requirements-review-model" mce_href="https://www.ministryoftesting.com/articles/finding-software-testing-opportunities-early-with-the-requirements-review-model" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><p>Тестирование программного обеспечения — это не только поиск багов, но и их предотвращение. Случалось ли вам смотреть на требование и думать: «вроде всё нормально»? А затем, спустя несколько недель, наблюдать, как код по этому требованию превращается в баг-репорт, часы доработок или недовольство стейкхолдера? Это знакомо не только вам.</p>
<p>Именно поэтому была создана модель ревью требований (<strong>Requirements Review Model, RRM</strong>): чтобы дать тестировщикам и командам простой и единый подход к ревью. Это помогает повышать качество ещё до того, как написана хоть одна строка кода.</p>
<p>Модель была создана для <a href="https://www.ministryoftesting.com/certifications/mot-software-testing-essentials-certificate" mce_href="https://www.ministryoftesting.com/certifications/mot-software-testing-essentials-certificate">сертификата Software Testing Essentials от Ministry of Testing (MoT)</a>, чтобы обучать тестировщиков-новичков ревью требований. В MoT решили, что будет полезно поделиться моделью со всеми, за пределами сертификата, и поддержать тестировщиков и их команды. Это соответствует их цели — развивать индустрию любыми позитивными способами. Поэтому и написана эта статья!</p>]]></description>
<link>https://software-testing.ru/library/around-testing/requirements/4498-finding-software-testing-opportunities-early-with-the-requirements-review-model</link>
<pubDate>Mon, 06 Jul 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Перестаньте считать баги: современные метрики тестирования для IT-команд</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Как понять, что перед вами хороший тестировщик? Он будет говорить о рисках, а не о багах. В статье рассказываем, какие метрики мы внедрили вместо подсчёта количества багов, как&nbsp; собрать риск‑матрицу за пару часов, сколько это стоит и что будет, если забить и игнорировать новые подходы в тестировании. Читайте о проверенных на практике решениях, которые действительно работают &#8212; без претензии на истину в последней инстанции.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Вот история, которая много лет назад навсегда отучила нас гордиться количеством найденных дефектов. Был у нас релиз – чистый, образцовый. За спринт команда тестирования нашла <span class='font-weight-bold'>214 </span>багов, закрыла <span class='font-weight-bold'>209</span>, а пять оставшихся сочла косметическими – решили поправить позже. На ретро все были довольны: менеджер строил график «найдено/исправлено», стрелочка вверх, дофамин рекой. Релиз выкатили в прод в пятницу вечером (да, знаем, знаем, &#8212; это же классика).</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В субботу в 6 утра раздался звонок: у части пользователей при оплате двойное списание. Не критический сбой, не белый экран, а тихая, незаметная штука, которая ни в один из тех 214 багов не вошла. Но проблема касалась реальных денег.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30558,"width":"301px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" width="944" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/d9eefb83-9a63-403c-9f4c-89b9a1444846-1_11zon-944x1024.png" alt="метрики тестирования" class="wp-image-30558" style="width:301px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/d9eefb83-9a63-403c-9f4c-89b9a1444846-1_11zon-944x1024.png 944w, https://quality-lab.ru/wp-content/uploads/2026/07/d9eefb83-9a63-403c-9f4c-89b9a1444846-1_11zon-277x300.png 277w, https://quality-lab.ru/wp-content/uploads/2026/07/d9eefb83-9a63-403c-9f4c-89b9a1444846-1_11zon-768x833.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/d9eefb83-9a63-403c-9f4c-89b9a1444846-1_11zon.png 1024w" sizes="(max-width: 944px) 100vw, 944px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Мы тогда чинили это 14 часов. И пока в шесть утра приходилось буквально в пижаме объяснять по телефону, почему мы пустили это в прод, стало ясно: <span class='font-weight-bold'>нам платят не за найденные баги, а за то, чтобы релиз был качественным и предсказуемым</span>. Оказалось, всё это время мы измеряли не то. Заказчику было всё равно сколько багов удалось найти - его боль была в том, чтобы релиз не был похож на лотерею.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Почему считать баги уже недостаточно?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Сначала разберёмся, почему подсчёт багов &#8212; это уже прошлый день. Не потому что баги не важны. А потому что это метрика <span class='font-weight-bold'>активности</span>, а не <span class='font-weight-bold'>результата</span>. Всё равно что считать, сколько тренировок в месяц вы посетили вместо оценки изменений тела.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Что не так с этой метрикой? Разберёмся по пунктам:<br /></h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Она ничего не говорит о качестве продукта.</span> 500 багов в спринте – это плохой продукт или хорошая команда тестирования? А 5 багов – это шедевр разработки или просто никто толком не тестировал?&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Она прямо вредит, как только становится KPI.</span> Тут работает закон Гудхарта: как только показатель превращается в цель, то он перестаёт быть хорошим показателем. Платите тестировщику за количество багов – получаете больше багов. Каждую опечатку в плейсхолдере оформят отдельным тикетом с тремя скриншотами. А искать причину, по которой баги вообще появляются, никто не станет – это же себя обкрадывать.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Она ссорит команду.</span> Когда для QA главное – найти как можно больше багов, а для разработки – сделать всё побыстрее, они невольно оказываются по разные стороны баррикад. QA заинтересовано в большом числе дефектов, а разработка стремится доказать, что часть из них вовсе не баги. В итоге общая цель – выпустить качественный продукт – отходит на второй план, а вместо совместной работы начинается подсчёт и споры в комментариях к тикетам.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Но главная проблема в другом. Тот релиз с 214 багами провалился <span class='font-weight-bold'>не из‑за слабой работы команды. Мы хорошо искали, но пропустили реальный неочевидный риск</span>, который и привёл к проблеме. <span class='font-weight-bold'>Подсчёт багов создаёт иллюзию контроля</span>: цифры растут, графики выглядят благополучно, а настоящая угроза остаётся незамеченной – и может напомнить о себе в самый неподходящий момент.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30554,"width":"283px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" width="1024" height="954" src="https://quality-lab.ru/wp-content/uploads/2026/07/05ae884e-5e37-43a9-9883-692d659ad9d6-1_11zon.png" alt="метрики тестирования" class="wp-image-30554" style="width:283px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/05ae884e-5e37-43a9-9883-692d659ad9d6-1_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/05ae884e-5e37-43a9-9883-692d659ad9d6-1_11zon-300x279.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/05ae884e-5e37-43a9-9883-692d659ad9d6-1_11zon-768x716.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">В чём настоящая ценность QA для бизнеса?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Если коротко: зрелое тестирование должно обеспечивать предсказуемость. Чтобы за день до релиза можно было честно сообщить бизнесу: с вероятностью N% релиз пройдёт без серьёзных проблем, а если что‑то и сломается – то вот в этой зоне, при этом восстановление займёт столько-то минут.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Вот это и есть настоящий QA. Не отчёт на 40 страниц о том, что протестировано, а чёткий анализ с пониманием цены и вероятности возможной ошибки. Бизнесу неважно, сколько багов нашли. Ему важно планировать: обещать ли клиенту дату, быть ли уверенным в стабильности, брать ли с собой в отпуск ноутбук? <span class='font-weight-bold'>И вот тут на сцену выходят метрики тестирования, которые измеряют именно предсказуемость продуктов, а не демонстрацию активной деятельности.&nbsp;</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">MTBF и MTTR – две QA-метрики нового поколения</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Эти показатели давно используют в эксплуатации оборудования и в SRE, но в продуктовом тестировании, к нашему глубокому сожалению, они приживаются медленно. Сейчас объясним простыми словами, что это такое, как считать и применять.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#f9f6e8"}}} --></p>
<p class="has-background" style="background-color:#f9f6e8"><span class='font-weight-bold'>MTBF (Mean Time Between Failures) – среднее время между сбоями.&nbsp;</span><br />Суть: сколько ваша система спокойно работает, прежде чем что-то отвалится.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Считается так:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">MTBF = суммарное время нормальной работы /количество сбоев</pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Например:</span> работали 30 дней, было 3 серьёзных инцидента – MTBF около 10 дней. Это метрика стабильности. Чем она больше, тем реже сбои.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#f9f6e8"}}} --></p>
<p class="has-background" style="background-color:#f9f6e8"><span class='font-weight-bold'>MTTR (Mean Time To Recovery) – среднее время восстановления.</span><br />Суть: это метрика устойчивости. Чем она меньше, тем система стабильнее.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Считается так:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>MTTR = суммарное время простоя / количество инцидентов</span></pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Например:</span> за месяц случилось три инцидента общей продолжительностью 150 минут, поэтому среднее время восстановления (MTTR) составило 50 минут.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"width":"33.33%"} --></p>
<div class="wp-block-column" style="flex-basis:33.33%"><!-- wp:image {"id":30553,"width":"203px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="683" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/f122192c-9d08-451f-a829-427db3b266d8-1_11zon-683x1024.png" alt="количество багов" class="wp-image-30553" style="width:203px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/f122192c-9d08-451f-a829-427db3b266d8-1_11zon-683x1024.png 683w, https://quality-lab.ru/wp-content/uploads/2026/07/f122192c-9d08-451f-a829-427db3b266d8-1_11zon-200x300.png 200w, https://quality-lab.ru/wp-content/uploads/2026/07/f122192c-9d08-451f-a829-427db3b266d8-1_11zon-768x1152.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/f122192c-9d08-451f-a829-427db3b266d8-1_11zon.png 1024w" sizes="(max-width: 683px) 100vw, 683px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center","width":"66.66%"} --></p>
<div class="wp-block-column is-vertically-aligned-center" style="flex-basis:66.66%"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Ключевой сдвиг в подходе, который не сразу удаётся принять: <span class='font-weight-bold'>полностью исключить сбои невозможно</span>. Сложная система неизбежно будет ломаться – это закономерность, а не признак непрофессионализма.<br><br>Настоящая цель – не стремиться к мифическому «нулю багов», а <span class='font-weight-bold'>работать над двумя показателями: увеличивать MTBF</span> (чтобы система ломалась реже) и <span class='font-weight-bold'>сокращать MTTR</span> (чтобы восстанавливаться быстрее). </pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#f9f6e8"}}} --></p>
<p class="has-background" style="background-color:#f9f6e8">Именно на основе этих значений рассчитывают <span class='font-weight-bold'>доступность (availability)</span> – ту самую, что закладывают в SLA как «четыре девятки».</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>Доступность = MTBF / (MTBF + MTTR)</span></pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p>Почувствуйте разницу. Фраза <span class='font-weight-bold'>«нашли 214 багов»</span> говорит о прошлом и отражает сам процесс работы. А показатели <span class='font-weight-bold'>«MTBF вырос с 6 до 19 дней, MTTR сократился с 4 часов до 35 минут» </span>показывают реальный результат и дают представление о будущем. Первые цифры уместно обсуждать внутри команды, вторые – спокойно представлять совету директоров.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Важное уточнение: <span class='font-weight-bold'>без нормального мониторинга прода и чёткого учёта инцидентов посчитать MTBF и MTTR не получится</span>. Поэтому первый шаг к предсказуемости – начать фиксировать данные. Об этом расскажем дальше.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30557,"width":"160px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"left"} --></p>
<figure class="wp-block-image alignleft size-large is-resized"><img loading="lazy" decoding="async" width="974" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/86f7731f-06d9-44cb-a810-eb1b23103c37-1_11zon-974x1024.png" alt="it риски" class="wp-image-30557" style="width:160px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/86f7731f-06d9-44cb-a810-eb1b23103c37-1_11zon-974x1024.png 974w, https://quality-lab.ru/wp-content/uploads/2026/07/86f7731f-06d9-44cb-a810-eb1b23103c37-1_11zon-285x300.png 285w, https://quality-lab.ru/wp-content/uploads/2026/07/86f7731f-06d9-44cb-a810-eb1b23103c37-1_11zon-768x808.png 768w, https://quality-lab.ru/wp-content/uploads/2026/07/86f7731f-06d9-44cb-a810-eb1b23103c37-1_11zon.png 1024w" sizes="(max-width: 974px) 100vw, 974px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Риск-ориентированное тестирование: как выпускать релизы без лишних затрат?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Почем тестировать всё подряд &#8212; это плохая идея? Если пытаться одинаково тщательно проверять всё, то проект либо станет слишком дорогим, либо релиз никогда не выйдет в прод.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Предсказуемость достигается не за счёт тестирования всего подряд, а благодаря фокусу на самом важном – и ровно в той степени, в какой это действительно нужно. В этом и суть риск‑ориентированного подхода. Его формула проста до неприличия:&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>Риск = Вероятность сбоя × Влияние сбоя</span></pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p>Дальше берём все наши функции/модули/сценарии и раскидываем по матрице. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Вот рабочая риск-матрица, которую мы используем (5×5 многим избыточна, начните с 3×3):</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:table --></p>
<figure class="wp-block-table">
<table class="has-fixed-layout">
<tbody>
<tr>
<td></td>
<td><span class='font-weight-bold'>Влияние низкое</span></td>
<td><span class='font-weight-bold'>Влияние среднее</span></td>
<td><span class='font-weight-bold'>Влияние высокое</span></td>
</tr>
<tr>
<td><span class='font-weight-bold'>Вероятность высокая</span></td>
<td>Средний риск</td>
<td>Высокий</td>
<td>Критический</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Вероятность средняя</span></td>
<td>Низкий</td>
<td>Средний</td>
<td>Высокий</td>
</tr>
<tr>
<td><span class='font-weight-bold'>Вероятность низкая</span></td>
<td>Низкий</td>
<td>Низкий</td>
<td>Средний</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Как пользоваться матрицей:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Критический и высокий it-риски</span> – оплата, авторизация, целостность данных: всё, где возможна утечка денег или персональных данных, – требуют максимального внимания. Сюда направляем основные усилия: автотесты, ручную проверку, негативные сценарии, нагрузочное тестирование, контроль на проде после релиза. Именно в этой зоне случился тот самый случай с двойным списанием – мы его не заметили, потому что ориентировались на количество багов.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Средний риск</span> – проверяем разумно, без фанатизма.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Низкий риск</span> – вопросы вроде настроек цвета кнопки в профиле – допускают отдельные недочёты: их наличие не несёт серьёзных последствий, и можно сознательно экономить на них ресурсы.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Что вы получаете на выходе:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Чёткое понимание рисков релиза</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Аргумент для бизнеса: «вот этот модуль мы покрываем на 95%, а вот этот – на 40%, потому что цена ошибки тут копеечная». Это взрослый разговор.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Защиту от неэффективного расходования ресурсов на проекте.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Практический совет: формируйте риск‑матрицу совместно с разработкой, продактом и поддержкой – не в одиночку.</span> Поддержка особенно ценна: её сотрудники лучше всех знают реальные проблемы пользователей. Всего час такой встречи раз в квартал помогает сэкономить недели на устранении инцидентов.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Какие ещё показатели помогают в управлении IT-рисками?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Окей, баги считать перестали. Что вешаем на дашборд вместо них? Предлагаем набор метрик, которые можно внедрить уже завтра.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item {"style":{"color":{"background":"#f9f6e8"}}} --></p>
<li style="background-color:#f9f6e8"><span class='font-weight-bold'>Defect Escape Rate</span>, доля «сбежавших» дефектов. Она показывает соотношение багов, найденных до продакшена, к тем, что всё‑таки попали в прод. </li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li></li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>Escape Rate = баги, найденные в проде / (баги в проде + баги до прода)</span></pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p>Это самая честная оценка качества тестирования – не сколько багов нашли, а сколько проворонили. Например, 214 багов до релиза и один в проде – это отличная работа. А вот 12 багов до релиза и 8 в проде – явный пробел в покрытии, сколько бы дефектов ни выявили. Стремитесь держать Defect Escape Rate на уровне ниже 5–10% – дальше ориентируйтесь по особенностям проекта.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>MTBF / MTTR</span> – про них уже писали выше. Это база.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Change Failure Rate</span> – доля провальных изменений: она показывает, какой процент релизов приводит к инциденту, откату или хотфиксу. Эта метрика из исследования DORA прямо отвечает на вопрос, насколько предсказуем релиз. У сильных команд показатель держится на уровне единиц процентов, у команд в постоянном аврале – превышает 30%.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>MTTD (Mean Time To Detect)</span> – это время, за которое команда замечает, что система сломалась. Бывает, что MTTR отличный, но проблема в другом: о сбое узнают от недовольных пользователей в соцсетях спустя два дня. Если вы узнаёте о проблеме последним – быстрое исправление уже не спасает ситуацию.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Покрытие рисков важнее покрытия строк кода.</span> Code coverage в процентах нередко вводит в заблуждение: можно иметь 90% покрытия и при этом тестировать то, что не влияет на стабильность системы. Гораздо полезнее отслеживать, какая доля критических сценариев из риск‑матрицы покрыта тестами. Именно этот показатель помогает в управлении IT-рисками , а не показывает формальные проценты.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Доля флакающих тестов – важный показатель</span>. Тесты, которые то падают, то проходят, опаснее, чем полное их отсутствие: они притупляют бдительность команды и приучают игнорировать предупреждения. Держите их под контролем – иначе дашборд перестанет быть инструментом управления и станет просто пустышкой.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Обратите внимание: все эти метрики отражают результат для пользователя и бизнеса, а не активность команды.</span> Их не получится «накрутить», например, оформив опечатку как отдельный тикет.</p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Пошаговый план перехода к риск-ориентированному тестированию</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>Мы собрали набор практик, которые доказали свою эффективность.</span> Это не план на неделю – это маршрут на несколько кварталов, позволяющий внедрить риск ориентированный подход в тестировании. При этом каждый шаг приносит пользу сразу, поэтому <span class='font-weight-bold'>внедряйте их по очереди</span>.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30555,"width":"214px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="973" src="https://quality-lab.ru/wp-content/uploads/2026/07/7da2f3b5-b99d-4cc7-966e-bbddc38e2b40-1_11zon.png" alt="риск ориентированное тестирование" class="wp-image-30555" style="width:214px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/7da2f3b5-b99d-4cc7-966e-bbddc38e2b40-1_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/7da2f3b5-b99d-4cc7-966e-bbddc38e2b40-1_11zon-300x285.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/7da2f3b5-b99d-4cc7-966e-bbddc38e2b40-1_11zon-768x730.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Начните с измерения состояния прода.</span> Без мониторинга и учёта инцидентов MTBF и MTTR – просто красивые термины, а не рабочие метрики. Заведите простой журнал инцидентов: фиксируйте, что случилось, когда, сколько времени ушло на исправление и как проблему обнаружили. Это не требует затрат, но сразу даёт чёткую картину.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Соберите риск‑матрицу</span> – на это хватит одного вечера, а польза сохранится на месяцы.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Сосредоточьте усилия на зонах высокого риска:</span> вместо тотальной автоматизации сначала закройте автотестами критически важные участки – например, оплату и авторизацию.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Введите блеймлесс-постмортемы.</span> Внедрите разбор инцидентов без поиска виноватых. Пусть каждый такой разбор порождает новый тест‑кейс или проверку – так MTBF будет расти естественным образом.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Сдвигайте тестирование влево (shift-left).</span>&nbsp; чем раньше выявлен дефект, тем дешевле его исправить. Привлекайте QA ещё на стадии обсуждения требований – многие проблемы возникают не из‑за кода, а из‑за расплывчатых формулировок.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Создайте дашборд здоровья релиза с 5–6 ключевыми метриками и разместите его на видном месте. </span>Когда команда ежедневно видит показатели вроде Defect Escape Rate и Change Failure Rate, подход к работе меняется сам собой.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Заранее согласуйте SLO и бюджет ошибок:</span> определите, какой уровень сбоев допустим. Это снимет невроз с ориентацией на «ноль багов» и переведёт разговор в плоскость «у нас бюджет на N минут простоя в месяц, тратим его осознанно».</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>Хотите узнать, как оценить риски перед тестированием за 15 минут? Забирайте чек-лист для экспресс-анализа бесплатно. Используйте, когда времени в обрез. Заполните форму и мы отправим документ вам на электронную почту.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Во сколько обойдётся такой подход?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Честно говоря, такие меры требуют вложений – но они окупаются. Возьмём известное правило <span class='font-weight-bold'>«1–10–100»</span>: дефект, выявленный на этапе требований, условно стоит 1 единицу, в коде – уже 10, а в проде – от 100 и выше. И это без учёта репутации, возвратов, срочных ночных работ и выгорания команды – а эти потери тоже дорого обходятся, хоть их и трудно посчитать.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>Посчитайте стоимость одного серьёзного инцидента:</span> <br>простой сервиса помножить на выручку в час + затраты на устранение (время команды и ставки) + потерянные клиенты и нагрузка на поддержку. </pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p>Для среднего бизнеса это нередко выливается <span class='font-weight-bold'>в сотни тысяч или даже миллионы рублей</span>. Например, инцидент с двойным списанием – с учётом возвратов, ручного разбора транзакций и 14 человеко‑часов в выходные – обошёлся примерно в две месячные зарплаты тестировщика.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"id":30556,"width":"318px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/07/9bb9b2d2-f505-4d6b-b056-e75b314c9942-1_11zon.png" alt="управление it рисками" class="wp-image-30556" style="width:318px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/07/9bb9b2d2-f505-4d6b-b056-e75b314c9942-1_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/07/9bb9b2d2-f505-4d6b-b056-e75b314c9942-1_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/07/9bb9b2d2-f505-4d6b-b056-e75b314c9942-1_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/07/9bb9b2d2-f505-4d6b-b056-e75b314c9942-1_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">При этом вложения в предсказуемость в основном разовые: настроить метрики эффективности тестирования, сформировать риск‑матрицу, скорректировать процессы, обучить команду. Дальше система работает сама и экономит ресурсы с каждым новым релизом. По опыту, грамотно выстроенный риск‑ориентированный QA окупает затраты за счёт одного‑двух предотвращённых инцидентов – то есть примерно за квартал.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">А что если забить и считать баги дальше?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Имеете полное право. Только давайте честно про то, что вас ждёт.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Релизы будут непредсказуемыми. </span>Когда повезёт, когда нет. Вы никогда не будете знать заранее, что вас ждёт и не сможете ничего планировать в таких условиях.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Команду настигнет неумолимое выгорание. </span>Постоянные стрессы, конфликты, переработки. Лучшие уйдут первыми – никто не любит героически чинить то, что можно было предотвратить.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>QA и разработка будут постоянно конфликтовать.</span> KPI по количеству багов противопоставляет их по самой своей природе.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Деньги будут утекать незаметно тонкой струйкой: </span>возвраты, отток клиентов, ухудшение репутации, упущенные возможности. В отчётах вы этого не увидите, потому что продолжите измерять не то, что нужно.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>И главное – вы продолжите гордиться не тем.</span> Графиком найденных багов вместо растущего MTBF. Вредно, обманчиво, ведёт в тупик из иллюзий.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Самое коварное – что по старым метрикам всё будет выглядеть отлично ровно до того момента, пока не станет слишком поздно.</span></li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Когда стоит обратиться к нам?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Мы в «Лаборатории Качества» не изобретаем велосипед, а берём проверенные практики и системно внедряем их, выжимая максимум пользы для клиентов. Наша помощь обычно сводится к трём ключевым шагам – это как раз та разовая инвестиция, которая быстро окупается:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>проводим аудит текущего QA:</span> разбираем, как устроено тестирование, где кроются главные риски, какие дефекты попадают в прод и почему. Даём не формальный отчёт, а реальную картину состояния дел;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>помогаем перейти на осмысленные метрики: </span>вместо простого подсчёта багов внедряем MTBF, MTTR, Defect Escape Rate, Change Failure Rate, выстраиваем риск‑матрицу и собираем понятный дашборд – такой, который не стыдно показать руководству;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>обучаем вашу команду:</span> чтобы после завершения проекта процессы продолжали жить и развиваться внутри компании. Наша цель – не сделать вас зависимыми от подрядчика, а научить команду мыслить категориями рисков и предсказуемости.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>Если этот подход вам близок – запишитесь на бесплатную стратегическую консультацию. Разберём текущий процесс тестирования и метрики, подсветим зоны высоких рисков и подскажем, с каких шагов начать, чтобы уже в ближайший квартал снизить количество инцидентов и сделать релизы предсказуемыми.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:latest-posts /--></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>]]></description>
<link>https://quality-lab.ru/blog/perestante-schitat-bagi-sovremennye-metriki-testirovaniya-dlya-it-komand/</link>
<pubDate>Wed, 01 Jul 2026 18:37:25 +0300</pubDate>
</item>
<item>
<title>Как мы написали UI-тесты для ИИ-агента внутри JetBrains IDE</title>
<description><![CDATA[<p><img src="https://software-testing.ru/images/stories/library/11hs/jetbrains-ide1.png" mce_src="https://software-testing.ru/images/stories/library/11hs/jetbrains-ide1.png" width="300" mce_style="float: left;" style="float: left;" /><a href="https://habr.com/ru/companies/veai/articles/1028756/" mce_href="https://habr.com/ru/companies/veai/articles/1028756/" target="_blank" style="">Оригинальная публикация</a><br />Автор:&nbsp;Nikolay Nedoseykin</p><p>Как проверить, что ИИ-агент в IDE работает, если на одинаковые запросы LLM отвечает по-разному? Ответы модели недетерминированы, а интерфейс и бизнес-логика вполне детерминированы, и их нужно тестировать отдельно.</p><p>Мы делаем ИИ-агента, встраиваемого в JetBrains IDE. В статье расскажу, как мы выстроили UI-автоматизацию плагина так, чтобы тесты ловили регрессии в интерфейсе, бизнес-логике и при этом не «моргали» из-за нестабильности LLM.</p><blockquote><p>Статья пригодится, если вы QA-инженер или разработчик и вам интересны:</p><ol><li><p>Выстраивание UI-автоматизации на примере IDE-плагина</p></li><li><p>Тестирование приложений с ИИ-функциями</p></li><li><p>Разделение ответственности между детерминированной и недетерминированной частями системы</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-tools/4524-jetbrains-ide</link>
<pubDate>Tue, 30 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Как ИИ нам проверку уязвимостей сломал</title>
<description><![CDATA[<p><span face="Arial, sans-serif" style="font-size: 11pt; white-space: pre-wrap;">Сегодня я расскажу историю о том, как ИИ умеет косячить! А то только success-story везде…</span></p><span id="docs-internal-guid-8940cef6-7fff-e3cf-f8b7-d4592340d9b4"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">У нас есть автотесты на уязвимости по базе</span><a href="https://nvd.nist.gov/vuln" style="text-decoration: none;"><span face="Arial, sans-serif" style="color: black; font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span face="Arial, sans-serif" style="color: #1155cc; font-size: 11pt; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">NVD</span></a><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">. И вот что-то эти сборки посыпались пачкой. Тестировщик пошел смотреть… И потом рассказал, в чем дело было:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Сегодня в сборках были найдены уязвимости — оказалось, что PartyFields.java для этих заказчиков правили с помощью агента. Так вот он, подлец, подставил невидимый символ, поменяв кодировку файла, ну и он чекстайл-проверку не прошёл.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"><img height="165" src="https://blogger.googleusercontent.com/img/a/AVvXsEiVI4XBb2YNIm9T_OelzPkyagi87mLLypna0ugLuVMJkJgr4AnDmavn7Xi2s4Cb1lCcyN8Nv5I8NL-5zLBUnbte43Lpm6rN5H8gI1DZ-AJLiQkZUmEwWPJ4AZeRPofXyhnvtCrh8A2f4pEpyXR9v57Mf9M8bDtVQ4VGfVBIT-T4PhkFH9bix32Yn98j_m8" style="border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; border: none;" width="128" /></span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"> → </span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"><img height="169" src="https://blogger.googleusercontent.com/img/a/AVvXsEipqtxzEwzTHHQHg5BFxcWMWk2-CjnqLWuOPaiWvWXGbf65nOa_Wzo_fywm6QqdIdEWgsYvOrOLSLTOC0GRllKLNahd3-2KKCTmLPk2HUeHbT7B8S08ZGzMdvjwBDMIKCs15HkRvu28xejlK4lIJnsr6PdMI0LvYuFzj94Ttjccz6cVPiy1yGVN5CdfMhw" style="border-color: currentcolor; border-image: initial; border-style: none; border-width: medium; border: none;" width="146" /></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Вот, будьте бдительны)</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">Почему использовался агент — вполне понятно, правка была массовая, в нескольких гит-проектах сделать однотипную правку. Но и следить надо, что там этот ИИ натворил!</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;">А ведь такое даже не заметишь сходу, символ то невидимый… В общем, мы молодцы, пресекли его варварство благодаря автотестам, а вы имейте в виду!</span></p><div><span face="Arial, sans-serif" style="font-size: 11pt; font-variant: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div></span>]]></description>
<link>http://okiseleva.blogspot.com/2026/06/blog-post_30.html</link>
<pubDate>Tue, 30 Jun 2026 16:03:35 +0300</pubDate>
</item>
<item>
<title>Мутационное тестирование: не только юнит-тесты</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/mutation-testing/mutation-testing1.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/mutation-testing/mutation-testing1.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Баз Дейкстра (Bas Dijkstra)<br /><strong><a href="https://www.ontestautomation.com/mutation-testing-not-just-for-unit-tests/" mce_href="https://www.ontestautomation.com/mutation-testing-not-just-for-unit-tests/" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><p>Я уже <a href="https://www.ontestautomation.com/improving-the-tests-for-rest-assured-net-with-mutation-testing-and-stryker-net/" mce_href="https://www.ontestautomation.com/improving-the-tests-for-rest-assured-net-with-mutation-testing-and-stryker-net/">несколько раз</a> <a href="https://www.ontestautomation.com/an-introduction-to-mutation-testing-and-pit/" mce_href="https://www.ontestautomation.com/an-introduction-to-mutation-testing-and-pit/">писал</a> о мутационном тестировании в этом блоге, и даже частенько провожу <a href="https://www.ontestautomation.com/training/mutation-testing/" mce_href="https://www.ontestautomation.com/training/mutation-testing/">воркшоп</a> по мутационному тестированию.</p>
<p>Одно из заблуждений, которое иногда всплывает — либо явно в вопросах, либо неявно, когда я слышу, как о мутационном тестировании говорит кто-то еще, — заключается в том, что мутационное тестирование работает только для юнит-тестов. Это не так. Мутационное тестирование можно использовать и для оценки качества других типов тестов.</p>
<p>В этой статье я покажу пример на основе кодовой базы, которую я использую в своих воркшопах по мутационному тестированию. В конце статьи будет ссылка на репозиторий, чтобы можно было посмотреть и попробовать всё самостоятельно.</p>
<p>Важно помнить: хотя мутационное тестирование подходит не <em>только</em> для юнит-тестов, лучше всего оно работает с тестами, которые выполняются быстро. Набор тестов будет запускаться для каждой мутации в продуктовом коде, которую сгенерирует инструмент мутационного тестирования, поэтому, если результатов не хочется ждать часы или даже дни, стоит использовать его с быстрыми тестами — с временем выполнения в миллисекундах, максимум одну-две секунды.</p>]]></description>
<link>https://software-testing.ru/library/testing/other-testing/4497-mutation-testing</link>
<pubDate>Sun, 28 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Настраиваем IDEA с ИИ, часть 2</title>
<description><![CDATA[<p><i>С вами рубрика «где тестировщик может применять ИИ в своей работе»!</i></p><p>Продолжаем настраивать компьютер с помощью ИИ (начинала <a href="https://okiseleva.blogspot.com/2026/06/ide.html" target="_blank">тут</a>). Что ещё я спрашивала у чат-бота?</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLzkoVjOZqujQgVt9TIaS9ZbkR7Z2oHcnRfTOau7Cg816YKDOZUe3j-HXcwkoUaKgYo-sTpCyrkU7NPoTEn2IMsbDEUwiw9GI-hQErS9ertqTqhWu7KPGSzsd46FQ0sIeW52PCkflfZXI9h4-MKY0FnHQ47wj4xOjcijydWJS5w1NxW2MXjg3u_Kc1cWk/s2996/4_1_Anna_%D0%9D%D0%B5%20%D0%B1%D0%BE%D0%B9%D1%81%D1%8F,%20%D1%8F%20%D1%82%D0%B5%D0%B1%D0%B5%20%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D1%83.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2491" data-original-width="2996" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLzkoVjOZqujQgVt9TIaS9ZbkR7Z2oHcnRfTOau7Cg816YKDOZUe3j-HXcwkoUaKgYo-sTpCyrkU7NPoTEn2IMsbDEUwiw9GI-hQErS9ertqTqhWu7KPGSzsd46FQ0sIeW52PCkflfZXI9h4-MKY0FnHQ47wj4xOjcijydWJS5w1NxW2MXjg3u_Kc1cWk/s320/4_1_Anna_%D0%9D%D0%B5%20%D0%B1%D0%BE%D0%B9%D1%81%D1%8F,%20%D1%8F%20%D1%82%D0%B5%D0%B1%D0%B5%20%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D1%83.png" width="320" /></a></div><br /><p><br /></p><h3 style="text-align: left;">1. Какой путь указывать для Java?</h3><p>Разработчик посоветовал в настройках грейдла указать путь для JAVA, скинув пример. Но у него пример на линуксе, а у меня винда. Часть инструментов надо указывать до директории bin, часть нет... Решила уточнить, у ИИ, конечно, а не у разработчика:</p><p></p><blockquote>org.gradle.java.home — на винде какой путь надо указывать, до бин или самой папки? C:\Program Files\Eclipse Adoptium\jdk-25.0.3.9-hotspot\bin</blockquote><p></p><span><a name='more'></a></span><p>Ответ, если вам интересно:</p><p></p><blockquote>Нужно указывать путь <b>до самой папки</b> (то есть до корневой директории JDK), а <b>не</b> до папки <code>bin</code>.<br /><br /><b>Как правильно:</b><br /><br />• ❌ <b>Неправильно:</b> <code>C:\Program Files\Eclipse Adoptium\jdk-25.0.3.9-hotspot\bin</code><br /><br />• ✅ <b>Правильно:</b> <code>C:\Program Files\Eclipse Adoptium\jdk-25.0.3.9-hotspot</code><br /><br /><i>Почему так?</i> Gradle (как и сама Java) ожидает, что в указанной папке он сам найдет подкаталог <code>bin</code> и запустит оттуда файлы <code>bin/java</code> или <code>bin/javac</code>. Если указать путь вместе с <code>bin</code>, Gradle будет искать компилятор по несуществующему пути <code>.../bin/bin/java</code> и выдаст ошибку.</blockquote><p></p><p>+ ИИ дал уточнение по винде, что делать со слешами в пути.</p><p><br /></p><p><br /></p><h3 style="text-align: left;">2. Как в IDEA посмотреть свои правки кода в гите?</h3><p>Помню, что раньше при работе в IDEA у меня слева снизу отображались мои изменения в меркуриал / гите. А тут тыркаюсь, тыркаюсь, историю изменения файла вижу, а мои правки — нет.</p><p>До этого мы обсуждали с куратором некоторые настройки идеи, и я сначала начала писать ей вопрос. И снова, как и в прошлый раз, я остановилась на середине вопроса с мыслью «а почему я пишу это ей?». Скопировала вопрос, стерла, и вставила в чат с ИИ (я общаюсь с&nbsp;@gpt3_unlim_chatbot):</p><p></p><blockquote>можешь подсказать как в идее включить отображение моих правок внутри гита? чтобы видеть какие файлы я меняла и сделать реверт, например</blockquote><p></p><br />Чат мне подробно ответил, причем в контексте нагших прошлых бесед подчеркнул, что этот способ сработает в том числе и с&nbsp;Giga IDE, в которой я и работаю.&nbsp;<div><br /></div><div>Правда, после использования подсказанных горячих клавиш окно у меня открылось не там, где я ожидала. Ну и что? Процитировала его ответ с гоярчими клавишами и уточнила:</div><div><br /></div><div><blockquote>окошко открылось слева сверху, а как его вниз перенести?</blockquote></div><div>Оказалось, достаточно перетащить, хотя я вроде попыталась, но, видимо, плохо захватила в первый раз))</div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">3. Как привести текст в верхний регистр в GIGA?</h3><div><br /></div><div>Для теста мне надо было изменить регистр текста. Я знаю, как это делается в Notepad++, но в IDE эта комбинация не работает. Что делать? Искать по менюшкам или спросить чат!</div><div><br /></div><div><br /></div><div><blockquote>а как в гига привести текст в верхний или нижний регистр? как контрол + U в нотепад++</blockquote></div><div><br /></div><div>Очень быстро и очень удобно! Если раньше надо было уметь гуглить, то теперь достаточно добавить себе чат с ботом, и все.&nbsp;</div><div><br /></div><div>Мне особенно нравится то, что ему можно делегировать все тупые вопросы, которые ты иначе бы задавала коллегам как новичок "а как это в IDEA сделать? А то?". Теперь для этого есть чатик!&nbsp;</div><div><br /></div><div>Учтите на будущее, если вы сами новичок, вот эта реакция "начал писать вопрос коллеге, потом стер и написал в ИИ" — очень полезная штука. Люди, умеющие так делать, ценятся намного больше "ой, я не знаю, помоги" по любому поводу.</div><div><div><br /></div><div><i style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">PS — эта статья написана в помощь студентам моего курса «</i><span style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="font-size: 14.85px;"><i><a href="https://testbase.ru/learn/chatgpt" target="_blank">Применение ChatGPT в тестировании</a>»</i></span></span></div></div>]]></description>
<link>http://okiseleva.blogspot.com/2026/06/blog-post_25.html</link>
<pubDate>Thu, 25 Jun 2026 20:22:34 +0300</pubDate>
</item>
<item>
<title>Психология тестировщика: почему критическое мышление — это суперсила</title>
<description><![CDATA[<p><img src="https://software-testing.ru/images/stories/library/11hs/psychology-of-the-tester.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/psychology-of-the-tester.jpg" width="400" mce_style="float: left;" style="float: left;" /></p><p><a href="https://habr.com/ru/companies/ozontech/articles/924608/" mce_href="https://habr.com/ru/companies/ozontech/articles/924608/" target="_blank" style="">Оригинальная публикация</a></p><p>Меня зовут Галина Коньшина, я работаю QA-инженером в Ozon Tech. Если вы думаете, что тестировщики только ищут баги, то вы заблуждаетесь. Мы не просто охотники за дефектами (хотя баги ловить умеем), мы те, кто ежедневно выходит на поле боя против самого изощрённого противника — нашего собственного мозга.</p><p>Вы обращали внимание на то, как легко не заметить очевидное? Например, когда вы ищете очки, а они у вас на голове. Теперь представьте, что тестировщик делает это на уровне сложных систем и интерфейсов, где каждая «потерянная пара очков» может обернуться тысячами разъярённых пользователей.</p><p>Сегодня хочу рассказать, почему критическое мышление — это суперсила любого тестировщика, ссылаясь на теории классиков, таких как Майерс Г. и Кейнер К. Мы разберём, как когнитивные искажения могут мешать находить баги, что помогает развивать аналитический подход и как нестандартное мышление спасает проекты (и иногда ночной сон).</p>]]></description>
<link>https://software-testing.ru/library/testing/general-testing/4523-psychology-of-the-tester</link>
<pubDate>Tue, 23 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>ИИ, помоги мне настроить IDE</title>
<description><![CDATA[<p><i>С вами рубрика «где тестировщик может применять ИИ в своей работе»!</i></p><p>Я тут на работу из декрета вышла. У меня новый компьютер, так что привет, настройка ПО! ИИ очень хорош как помощник в этом. Вот что я уже успела у него спросить:</p><p><br /></p><h3 style="text-align: left;">1. Как открыть gradle проект в IDEA</h3><p>Мой основной проект собирается через Maven, я помню как его открывать в IDEA (у меня сейчас&nbsp;GIGA IDE, но по сути это та же IDEA) — через pom-ник.</p><p>А вот другой проект собирается на gradle, и как открывать его — я забыла... Но это же не рокет-сайнс именно моего проекта, а что-то общее, так что я пошла к ИИ чат-боту в телеге, которому можно кидать&nbsp;изображения.</p><p>Сделала скрин проекта в гите и задала вопрос:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwFDR2GrWVz0o5de8PVFM66wdQ0Eb5QvlcolATn7Y5-aBi1DsiA31GuLD3h_ww1MceN3bkBUJNbrmizx8kk4PxKgI3EjFuvOc0XXzsSfbPCHzA6DenFx-5TgqT4lLF491_BtXpmzVQEJo3RDX6FSkIBngQUYTV4D2UE6M7zcfEg3V8sbRZzuZp9tw_wns/s1663/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202026-06-22%20192029.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="321" data-original-width="1663" height="62" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwFDR2GrWVz0o5de8PVFM66wdQ0Eb5QvlcolATn7Y5-aBi1DsiA31GuLD3h_ww1MceN3bkBUJNbrmizx8kk4PxKgI3EjFuvOc0XXzsSfbPCHzA6DenFx-5TgqT4lLF491_BtXpmzVQEJo3RDX6FSkIBngQUYTV4D2UE6M7zcfEg3V8sbRZzuZp9tw_wns/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202026-06-22%20192029.png" width="320" /></a></div><p>-&nbsp;как открыть проект в идее, какой файл выбрать?</p><p>ИИ понимает даже убогую "русификацию", так что нет нужды писать ему правильное название — IDEA, он и так все понял и выдал подробную инструкцию.</p><span><a name='more'></a></span><p><br /></p><h3 style="text-align: left;">2. Как настроить кодировку проекта</h3><p>Следующая проблема — один проект работает с кодировкой UTF-08 по умолчанию, а другой — с windows-1251. Собственно, я смогла открыть в идее проект, но не смогла считать файлы:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-gKCXqB9mEfE3AvRouTpNcmM71ssZLffseQ1o8GbCXHlrp0cs1qJSURK3E6LpZgA3i6kEdNzo-Ahbc1-6DxCPM6fMj-3tqen9-MbbDSOCmF0kZKGf39YXguo4tX6goRTO_xOHsdx1O4YauXVn5r_LSaB2ysMj9wIz6ceNBkaNagZoXPck4aofchnOGws/s1685/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202026-06-22%20131335.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="460" data-original-width="1685" height="87" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-gKCXqB9mEfE3AvRouTpNcmM71ssZLffseQ1o8GbCXHlrp0cs1qJSURK3E6LpZgA3i6kEdNzo-Ahbc1-6DxCPM6fMj-3tqen9-MbbDSOCmF0kZKGf39YXguo4tX6goRTO_xOHsdx1O4YauXVn5r_LSaB2ysMj9wIz6ceNBkaNagZoXPck4aofchnOGws/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202026-06-22%20131335.png" width="320" /></a></div><p>Я как-то смутно помню, что это указывается где-то внутри настроек, но где?</p><p>Прошлась по документации "для новичков", сходу не нашла инструкцию. И пошла к своему куратору, которая помогает мне освоиться на проекте. Я уже начала писать вопрос:</p><p>- А напомни, плс, как поменять кодировку только для этого проекта?</p><p>А потом задумалась — а почему я спрашиваю об этом ЕЁ? Стерла сообщение и пошла к ИИ-шке ????</p><p>- <i>(кинула скрин, который показан выше) </i>Идея (точнее GIGA IDE CE 2025.1) открывает файлы не в той кодировке, надо вин-1251. Как настроить эту кодировку на весь проект?</p><p>И снова в ответ — подробная инструкция! Хотя за ИИ нужен глаз да глаз, а то он мне насоветовал глобальные настройки поменять:</p><p><br /></p><p><b></b></p><blockquote><b>Шаг 1. Настройка Windows-1251 на весь проект (и глобально)</b><br /><br />1. Откройте настройки: нажмите <code>Ctrl + Alt + S</code> (или перейдите в меню <b>File</b> $⟶$ <b>Settings</b>).<br /><br />2. В левой колонке перейдите по пути: <b>Editor</b> $⟶$ <b>File Encodings</b> (Кодировки файлов).<br /><br />3. В правой части окна настройте три параметра:<br /><br />   * <b>Global Encoding</b> (Глобальная кодировка): выберите <b>windows-1251</b>.<br /><br />   * <b>Project Encoding</b> (Кодировка проекта): выберите <b>windows-1251</b>.<br /><br />   * <b>Default encoding for properties files</b>: если в <code>.properties</code> файлах тоже используется кириллица, выберите <b>windows-1251</b>.<br /><br />4. Нажмите <b>Apply</b> (Применить), а затем <b>OK</b>.<br /><br /><i>Теперь все новые файлы будут создаваться и открываться в этой кодировке.</i></blockquote><p><br /></p><p>Пришлось уточнять:</p><p>&nbsp;— «Global Encoding (Глобальная кодировка): выберите windows-1251». Что значит этот параметр? он только на этот проект будет действовать? я открываю в ИДЕ и другой проект, где уже кодировка утф-8</p><p>И тогда ИИ скорректировал свой ответ:</p><p><br /></p><p></p><blockquote>Отличный вопрос! Вы очень вовремя обратили на это внимание. <br /><br />Если вы работаете с разными проектами (где один в UTF-8, а другой в Windows-1251), <b>настраивать Global Encoding на Windows-1251 действительно не стоит</b>, иначе это может сломать отображение символов в других проектах.<br /><br />Вот в чем разница между этими параметрами и как правильно поступить в вашей ситуации:<br /><br /><b>В чем разница?</b><br /><br />1. <br /><br /><b>Global Encoding (Глобальная кодировка)</b> — влияет на <b>всю среду разработки</b> (IDE). <br /><br />   * Она применяется к файлам, которые вы открываете «просто так» (вне какого-либо проекта), и служит шаблоном по умолчанию для всех <i>новых</i> проектов. <br /><br />   * Если вы выставите здесь <code>windows-1251</code>, то при открытии другого проекта (где нет жестко сохраненных настроек кодировки) IDE может попытаться прочитать его файлы как Windows-1251, из-за чего «поплывет» уже UTF-8.<br /><br />2. <br /><br /><b>Project Encoding (Кодировка проекта)</b> — действует <b>только на текущий открытый проект</b>.<br /><br />   * Эта настройка сохраняется в скрытой папке <code>.idea</code> внутри папки вашего проекта (в файле <code>encodings.xml</code>). <br /><br />   * Она никак не влияет на другие проекты. Когда вы откроете другой проект, IDE прочитает его собственные настройки (например, UTF-8).<br /><br />——————————<br /><br /><b>Как правильно настроить IDE под вашу ситуацию?</b><br /><br />Чтобы один проект открывался в <b>Windows-1251</b>, а второй — в <b>UTF-8</b>, сделайте так:<br /><br />1. Снова откройте настройки (<code>Ctrl + Alt + S</code> $⟶$ <b>Editor</b> $⟶$ <b>File Encodings</b>).<br /><br />2. <b>Global Encoding</b> верните в <b>UTF-8</b> (это современный стандарт, пусть он будет глобальным).<br /><br />3. <b>Project Encoding</b> для вашего текущего проекта (где кракозябры) установите в <b>windows-1251</b>.<br /><br />4. Нажмите <b>Apply</b> и <b>OK</b>.<br /><br />При такой схеме:<br /><br />• Проект с Windows-1251 будет открываться правильно (так как для него задана индивидуальная кодировка проекта).<br /><br />• Проект с UTF-8 (и все остальные проекты) будут открываться в стандартной UTF-8, используя глобальную настройку. Никакого конфликта не возникнет!</blockquote><p></p><p><br /></p><h3>3. Что значит ошибка?</h3><div>Проект перевели на Java 25, но ещё не обновили доку. Так что я удивилась, увидев ошибку при сборке:</div><div><br /></div><div><blockquote>Dependency requires at least JVM runtime version 25. This build uses a Java 21 JVM.</blockquote></div><div><br /></div><div>Подумала, вдруг что-то не так поняла? Сходила к ИИ:</div><div><br /></div><div></div><blockquote><div>При сборке проекта ошибка: Dependency requires at least JVM runtime version 25. This build uses a Java 21 JVM.</div><div><br /></div><div>Но у меня 21 джава:<br /><br />c:\core&gt;javac -version<br />javac 21.0.11<br /><br />c:\core&gt;java -version<br />openjdk version "21.0.11" 2026-04-21 LTS<br />OpenJDK Runtime Environment Temurin-21.0.11+10 (build 21.0.11+10-LTS)<br />OpenJDK 64-Bit Server VM Temurin-21.0.11+10 (build 21.0.11+10-LTS, mixed mode, sharing)<br /><br />ему нужна 25?</div></blockquote><div></div><div><br /></div><div>Краткий ответ — да, нужна ))</div><div>Океееееей...</div><div><br /></div><div><br /></div><h3 style="text-align: left;">4. Что делает winget?</h3><div><br /></div><div>После шага 3 мне насоветовали команду:</div><div><br /></div><div><blockquote>winget install EclipseAdoptium.Temurin.25.JDK</blockquote></div><div><br /></div><div>Фича крутая, конечно, появилась в винде! Но я засомневалась, а не перезатрет ли мне это параметры в Path? Потому что другой проект собирается на Java 21 и мне нужны обе версии.</div><div><br /></div><div>Собака-подозревака снова пошла к ИИ:</div><div><br /></div><div><blockquote>winget install EclipseAdoptium.Temurin.25.JDK — он установит джаву, но не поменяет Path и Java Home? Я хочу чтобы стояла 21 и 25 версия, но Java Home должен смотреть на 21</blockquote></div><div><br /></div><div>И ведь не зря пошла!</div><div><br /></div><div><blockquote>По умолчанию стандартная установка через <code>winget</code> <b>перепишет</b> ваши переменные <code>JAVA_HOME</code> и <code>Path</code>, сделав Java 25 основной в системе. Инсталлятор от Adoptium (MSI-пакет) устроен так, что он автоматически прописывает себя в системные переменные.<br /><br />Если вы хотите, чтобы глобальной версией в системе оставалась <b>Java 21</b>, а Java 25 использовалась только точечно (например, внутри Giga IDE/Gradle), у вас есть два отличных пути.</blockquote><p></p><blockquote>...&nbsp;</blockquote><p><br /></p><p>Более того! Так как ИИ-шка запоминает контекст, то после шагов для установки Java чат-бот сам выдал инструкцию «Как потом настроить это в Giga IDE (IntelliJ IDEA)?»</p><p>Как удобно стало в мире с ИИ! ????&nbsp;</p><p></p></div><i></i><p></p>]]></description>
<link>http://okiseleva.blogspot.com/2026/06/ide.html</link>
<pubDate>Mon, 22 Jun 2026 19:54:11 +0300</pubDate>
</item>
<item>
<title>Типы границ для классов эквивалентности</title>
<description><![CDATA[<p>&nbsp;</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3NFUah4CHKfw4R2q8G407cMm8FGebHghQXnfV0Hh_SZYFix-Hjle5t9E2JVN3FJIN0P_MN0bqlt7B5HJmaKvCJf58a2ofhCWvP3CrvFIoolWR9GxKRVpPdqkik8iQX3aKAn7o6aX4oiz9twyrbiyQsdqhlVNp4sNSH-mqaXtmh3HXO7_J50vAnD8Zdyg/s963/%D0%A2%D0%B8%D0%BF%D1%8B%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%20%E2%80%94%20%D0%BA%D0%BE%D0%BF%D0%B8%D1%8F.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="537" data-original-width="963" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3NFUah4CHKfw4R2q8G407cMm8FGebHghQXnfV0Hh_SZYFix-Hjle5t9E2JVN3FJIN0P_MN0bqlt7B5HJmaKvCJf58a2ofhCWvP3CrvFIoolWR9GxKRVpPdqkik8iQX3aKAn7o6aX4oiz9twyrbiyQsdqhlVNp4sNSH-mqaXtmh3HXO7_J50vAnD8Zdyg/s320/%D0%A2%D0%B8%D0%BF%D1%8B%20%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%86%20%E2%80%94%20%D0%BA%D0%BE%D0%BF%D0%B8%D1%8F.png" width="320" /></a></div><br /><p></p><p><a href="https://habr.com/ru/articles/1045436/" style="font-size: x-large;" target="_blank"><b>Ссылка на Хабр</b></a></p><p><br /></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Про типы границ я впервые услышала на тренинге Алексея Баранцева. Зачем они нужны? Да просто чтобы не забыть всё проверить. Написал чек-лист, потом проверяешь себя:</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">— Все учел? Вот эти классы эквивалентности, какие границы логические? А какие технологические? ...</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Так можно вспомнить о проверке, про которую забыл или просто не подумал! Полезная штука.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Алексей дал нам тогда про такую типизацию границ:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Физическая</span> — которую физически нельзя преодолеть.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Логическая</span> — ограничение, накладываемое логикой, не программой.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Технологическая</span> — ограничение, накладываемое используемой технологией.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Произвольная</span> — ограничение, наложенное аналитиком или заказчиком.</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Лично я предпочитаю совмещать физическую и логическую. Потому что физическая — это то, что мы вообще преодолеть не можем. Например, при всем желании мы не введем строку отрицательной длины, ну никак не сможем.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Но то, что физически сделать нельзя, часто в программе сделать можно. Например, ввести в количество участников митапа «1,5 человека» — физически невозможно, но программа то позволяет. Значит, для программы это уже логическая, мы же понимаем, что это невозможно.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Так что в моей классификации есть всего три типа границ (сокращенно ЛТП):</p><ol style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="counter-increment: item 1; line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Логическая</span> — ограничение, накладываемое логикой, не программой.</p></li><li style="counter-increment: item 1; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Технологическая</span> — ограничение, накладываемое используемой технологией.</p></li><li style="counter-increment: item 1; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Произвольная</span> — ограничение, накладываемое аналитиком или разработчиком.</p></li></ol><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Рассмотрим каждую из них!</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><br /></p><span><a name='more'></a></span><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><br /></p><p><a class="anchor" id="logic" name="logic" style="background-color: white; color: #548eab; display: block; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin-top: 24px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" target="_blank"></a></p><h3 style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; font-size: 1.125rem; font-weight: 500; line-height: 1.4375rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Логическая граница</h3><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Логическая граница</span> — ограничение, накладываемое логикой, не программой. Это те аксиомы, которые мы знаем с детства. Или физические ограничения реального мира. Например, «1,5 человека»: в программе ввести такое можно, но логично, что это бред и так не бывает.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Самые важные и базовые границы:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><a href="https://okiseleva.blogspot.com/2016/12/blog-post_15.html" rel="noopener noreferrer nofollow" style="background-color: rgba(0, 0, 0, 0); color: #548eab; quotes: &quot;«&quot; &quot;»&quot;; text-decoration: none; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" target="_blank">Ноль</a> — проверяем всегда и везде!</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Один — а вот это неочевидно бывает, обычно только ноль смотрят, а есть еще разница «один-много».</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Эти границы надо смотреть всегда. А какие бывают другие? Посмотрим на примерах:</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">1. В минуте 60 секунд</span></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Даже если система дает ввести больше, мы все равно проверяем 60.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Допустим, разработчик поставил ограничение на поле ввода секунд — можно ввести максимум 2 числовых символа. У нас получаются интервалы:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">0 — 60</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">60 — 99</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">При этом 0 и 60 — логические границы. Логично, что время НЕ может быть отрицательным (в физическом мире ну никак, даже если программа позволяет ввести такое значение). Также логично, что секунд будет максимум 60, иначе это уже следующая минута.</p><figure class="full-width " style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: center; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><img decode="async" height="1080" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/cd0/e23/b97/cd0e23b97db53522a3e4fa6c5431159c.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/cd0/e23/b97/cd0e23b97db53522a3e4fa6c5431159c.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/cd0/e23/b97/cd0e23b97db53522a3e4fa6c5431159c.png 781w" style="border-style: none; height: auto; margin: 0px; max-width: 100%; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle;" width="1200" /></figure><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Что делает интервал «60 — 99» очень интересным для проверки: что будет, если я введу 70 секунд? Система пересчитает это как 1 минуту и 10 секунд? В любом случае это уже разные классы эквивалентности: «нормальное количество секунд» и «больше, чем минута». Проверяем оба + границу между ними.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">А вот в числе 99 никакой логики нет. Ее просто такой сделал разработчик. Завтра он передумает и сделает границу в 999 — и что, изменится логика? Нет. Логика от прихоти разработчика не меняется. Какое бы ограничение он не поставил, у нас остаются границы 0 и 60. А вот 99 — это сплошной произвол, к логике отношения не имеет.</p><figure class="full-width " style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: center; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><img decode="async" height="1080" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/1e4/833/190/1e4833190a9d65133aface115e6a9f6d.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/1e4/833/190/1e4833190a9d65133aface115e6a9f6d.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/1e4/833/190/1e4833190a9d65133aface115e6a9f6d.png 781w" style="border-style: none; height: auto; margin: 0px; max-width: 100%; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle;" width="1468" /></figure><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">2. Строки отрицательной длины не бывает</span></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Если у нас есть строковое поле, то самая очевидная граница — ноль. Логично, что символов всегда будет больше нуля, меньше мы ну никак ввести не сможем. Поэтому всегда проверяем:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Пустое поле (ноль) — логическую границу.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Один символ (один) — пограничное значение.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Один пробел — это не то же самое, что один любой символ, поэтому рекомендую проверить.</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Даже если разработчик ставит ограничение «имя может быть от 3 до 10 символов», это не отменяет границу в нуле и мы ее все равно проверяем. А потом уже смотрим границы по ТЗ.</p><figure class="full-width " style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: center; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><img decode="async" height="1080" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/8fa/ea5/cb2/8faea5cb2c4d6083952ce58b4a2e8e49.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/8fa/ea5/cb2/8faea5cb2c4d6083952ce58b4a2e8e49.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/8fa/ea5/cb2/8faea5cb2c4d6083952ce58b4a2e8e49.png 781w" style="border-style: none; height: auto; margin: 0px; max-width: 100%; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle;" width="1161" /></figure><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">3. Количество книг или платьев в заказе — положительное целое число</span></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Если мы тестируем интернет-магазин, то добавляем что-то в корзину: платье, пиццу, книжку, пару обуви. И количество товара всегда будет целым положительным числом. То есть 2 логических границы:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">0 — мы не можем заказать «минус одно платье»;</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Целое число — мы не можем заказать дробное.</p></li></ul><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Конечно, с нулем проще: мы знаем границу, знаем пограничные значения (-1 и 1), понимаем классы эквивалентности (до нуля и после).</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">В случае дробных значений конкретного граничного значения у нас нет — мы просто знаем, что это разные классы эквивалентности, целые и дробные числа. А разделяет их логика. Поэтому в данном случае мы не тестируем граничное значение, мы просто проверяем «за границей», пытаемся нарушить правильный ход событий и вылезти в некорректную область. То есть ввести дробное число.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">А дальше уже вспоминаем, что дробные пишут и через точку, и через запятую: один большой класс разделился на два поменьше. Выбираем значение из каждого и проверяем.</p><figure class="full-width " style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: center; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><img decode="async" height="1080" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/3ac/cc2/3ea/3accc23ea2df549a1e2d4c1822e7e7c1.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/3ac/cc2/3ea/3accc23ea2df549a1e2d4c1822e7e7c1.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/3ac/cc2/3ea/3accc23ea2df549a1e2d4c1822e7e7c1.png 781w" style="border-style: none; height: auto; margin: 0px; max-width: 100%; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle;" width="1138" /></figure><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">4. Возраст — тоже положительное число</span></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Отрицательного возраста быть не может — это логично. Когда человек рождается, то ему уже 0 лет, 0 минут, сколько-то секунд. Когда он ещё в животике, это тоже не «минус 5 месяцев ему» — это «3 месяца беременности мамы».</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Дробное значение у возраста бывает — «1.5 годика», например. А вот отрицательное — нет.</p><figure class="full-width " style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: center; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><img decode="async" height="1080" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/496/096/775/4960967754070820aa5bd28113895a34.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/496/096/775/4960967754070820aa5bd28113895a34.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/496/096/775/4960967754070820aa5bd28113895a34.png 781w" style="border-style: none; height: auto; margin: 0px; max-width: 100%; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle;" width="730" /></figure><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Итого!</span></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Запомните правило — логика от прихоти разработчика НЕ меняется.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Если разработчик изменил в программе значение и граница поменялась — значит, она была НЕ логическая. А чтобы найти логическую, включаем мозг и думаем: а каким бывает (или не бывает) наше поле? Абстрагируясь от того, что написано ТЗ. ТЗ у нас пойдет отдельно.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Логика может разделять разные классы (дробное / целое число), а может быть конкретным значением. И если вы нашли число, то всегда проверяйте:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><a href="https://okiseleva.blogspot.com/2016/12/blog-post_15.html" rel="noopener noreferrer nofollow" style="background-color: rgba(0, 0, 0, 0); color: #548eab; quotes: &quot;«&quot; &quot;»&quot;; text-decoration: none; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" target="_blank">Ноль — не ноль</a></p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Один — много.&nbsp;</p></li></ul><h3 style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; font-size: 1.125rem; font-weight: 500; line-height: 1.4375rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Технологическая граница</h3><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">&nbsp;</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Технологическая граница</span> — ограничение, накладываемое используемой технологией.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Например, при попытке запихать в integer больше, чем 2 147 483 647. И так как перфокарты уже давно в прошлом, то сейчас поиск технологической границы — это попытка вставить МНОГО данных в поле.&nbsp;</p><figure class="full-width " style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 0px; quotes: &quot;«&quot; &quot;»&quot;; text-align: center; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><img decode="async" height="1080" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/0fb/fda/b2a/0fbfdab2a118fc7193f24a21becc43d8.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/0fb/fda/b2a/0fbfdab2a118fc7193f24a21becc43d8.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/0fb/fda/b2a/0fbfdab2a118fc7193f24a21becc43d8.png 781w" style="border-style: none; height: auto; margin: 0px; max-width: 100%; overflow: hidden; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out; vertical-align: middle;" width="1074" /></figure><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Если говорить о примерах, то они одинаковы для чисел и строк. И туда и туда мы пытаемся запихать незапихиваемое — сто миллионов чисел или символов. Есть два способа:</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Нажать «9» и держать — чтобы получилось «9999999999999999999999999999...» И так сколько влезет.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Использовать специальные инструменты, например, Perlclip.</p></li></ul><blockquote style="background: 0px 0px rgb(255, 255, 255); border-left: 4px solid rgb(84, 142, 171); color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px 12px; padding: 0px 12px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><span style="-webkit-font-smoothing: antialiased; font-weight: bolder; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">См также:</span></p><p style="font-size: 1rem; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><a href="https://okiseleva.blogspot.com/2015/08/blog-post_8.html" rel="noopener noreferrer nofollow" style="background-color: rgba(0, 0, 0, 0); color: #548eab; quotes: &quot;«&quot; &quot;»&quot;; text-decoration: none; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;" target="_blank">Как сгенерить большую строку, инструменты</a> + помощь ИИ, разумеется</p></blockquote><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">При этом, даже если в поле нельзя ввести больше какого-то количества символов, мы все равно генерируем большую строку и пробуем ее туда вкопипастить. А вдруг сначала все упадет от переполнения буфера, а потом уже сработает проверка на клиенте, не дающая вводить.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">И кстати, если в поле нельзя ВВЕСТИ с клавиатуры что-то, это еще не значит, что «плохое» значение туда нельзя ВКОПИПАСТИТЬ. Обязательно пробуйте.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">А если говорить про ограничение на длину поля, так это вообще обычно простейший maxlengh, который легко обходится.</p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 24px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Ладно, хватит теории, посмотрим на примерах.</p><ul style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin: 32px 0px; padding-inline-start: 32px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><li style="line-height: 1.5rem; margin: 0px 0px 6px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Типы полей в БД — максимальное число, которое можно туда сохранить или длина поля (в оракл для строки это 5000 символов). При тестировании самой БД это произвол, а теперь это ограничение технологии.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;">Путь к файлу — операционная система указывает допустимость символов или длину пути.</p></li><li style="line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out;"><p style="font-size: 1rem; line-height: 1.5rem; margin: 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, -webkit-text-decoration 0.2s eas]]></description>
<link>http://okiseleva.blogspot.com/2026/06/blog-post.html</link>
<pubDate>Mon, 22 Jun 2026 18:49:24 +0300</pubDate>
</item>
<item>
<title>Находим баги быстрее: умный способ дебага проблем интеграции</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/finding-bugs-faster.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/finding-bugs-faster.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Арун Вишванатан (Arun Vishwanathan)<br /><strong><a href="https://www.ministryoftesting.com/articles/finding-bugs-faster-a-smarter-way-to-debug-integration-failures" mce_href="https://www.ministryoftesting.com/articles/finding-bugs-faster-a-smarter-way-to-debug-integration-failures" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><h1>Проблема: отладка билдов в быстро меняющемся мире</h1>
<p>Современное программное обеспечение быстро меняется. Разработчики постоянно добавляют новые функции и исправляют ошибки, что приводит к частым обновлениям. При всех этих обновлениях что-то иногда ломается, и выяснение, что именно стало причиной проблемы, может превратиться в длительную головную боль.</p>
<p>Представим, что команда обнаружила баг в недавней версии продукта. Где-то по пути что-то пошло не так. Но как понять, когда именно всё начало ломаться?</p>
<p>Можно протестировать каждый билд по очереди, начиная с последней стабильной версии, пока не будет найден первый проблемный. Это прямолинейный подход, и он работает. Но он может занять часы или даже дни, особенно если билды выходят часто. Проверка каждого из них требует времени.</p>
<p>В этой статье представлен более быстрый метод определения точной версии, в которой появились проблемы, с использованием более эффективного подхода к поиску, основанного на параллельном тестировании на нескольких устройствах.</p>]]></description>
<link>https://software-testing.ru/library/testing/test-analysis/4495-finding-bugs-faster-a-smarter</link>
<pubDate>Sun, 21 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Работа с нестабильными тестами в Allure 3</title>
<description><![CDATA[<p>Михаил Ланкин, автор статей команды <a href="https://qatools.ru/?utm_campaign=blog-post&amp;utm_medium=partner&amp;utm_source=softwaretesting&amp;utm_content=link" mce_href="https://qatools.ru/?utm_campaign=blog-post&amp;utm_medium=partner&amp;utm_source=softwaretesting&amp;utm_content=link" target="_blank" style="">ТестОпс
</a><br /><a href="https://habr.com/ru/companies/testops_tms/articles/988980/" mce_href="https://habr.com/ru/companies/testops_tms/articles/988980/" target="_blank" style="">Оригинальная публикация</a></p>
<p>Нестабильные (flaky) тесты создают постоянные трудности для тестировщиков. Такие тесты не отражают состояния тестируемой системы и подрывают доверие к тестовому набору.</p><p>Вооружившись лучшими практиками, нестабильность можно свести к минимуму, но полностью избавиться от неё крайне трудно. Чтобы лучше её контролировать, нужны инструменты, позволяющие выявлять нестабильные тесты — например, Allure Report. В этом руководстве мы посмотрим, как Allure работает с нестабильными тестами:</p><ul><li><p>Исследуем, как устроена история тестов</p></li><li><p>Разберёмся, как история позволяет определять нестабильные тесты</p></li><li><p>Настроим перезапуск тестов</p></li></ul><p>Эту функциональность мы рассмотрим на примере PyTest, но все те же принципы работают и с другими фреймворками.</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-automation/4522-allure-</link>
<pubDate>Thu, 18 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Какие задачи в тестировании пора отдать ИИ, чтобы получить результат, а не новые проблемы?</title>
<description><![CDATA[<p><!-- 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":30214,"width":"325px","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/06/407ba4d8-8b43-4dd9-986b-f0ae0b2eee59-Photoroom_11zon-1.png" alt="407ba4d8-8b43-4dd9-986b-f0ae0b2eee59-Photoroom_11zon-1" class="wp-image-30214" style="width:325px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/06/407ba4d8-8b43-4dd9-986b-f0ae0b2eee59-Photoroom_11zon-1.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/06/407ba4d8-8b43-4dd9-986b-f0ae0b2eee59-Photoroom_11zon-1-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/06/407ba4d8-8b43-4dd9-986b-f0ae0b2eee59-Photoroom_11zon-1-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/06/407ba4d8-8b43-4dd9-986b-f0ae0b2eee59-Photoroom_11zon-1-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></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>Прежде чем поручить задачу модели, мы оцениваем её по двум ключевым параметрам – не по «крутости» модели или хайповости подхода, а по реальному эффекту:</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 --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Мода на инструменты приходит и уходят, а правильные вопросы остаются: вот что действительно важно.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:image {"id":30253,"width":"843px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="1024" height="683" src="https://quality-lab.ru/wp-content/uploads/2026/06/ChatGPT-Image-18-%D0%B8%D1%8E%D0%BD.-2026-%D0%B3.-16_14_49-1-1024x683.png" alt="Матрица принятия решения по привлечению ИИ в QA-задачи" class="wp-image-30253" style="width:843px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/06/ChatGPT-Image-18-июн.-2026-г.-16_14_49-1-1024x683.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/06/ChatGPT-Image-18-июн.-2026-г.-16_14_49-1-300x200.png 300w, https://quality-lab.ru/wp-content/uploads/2026/06/ChatGPT-Image-18-июн.-2026-г.-16_14_49-1-768x512.png 768w, https://quality-lab.ru/wp-content/uploads/2026/06/ChatGPT-Image-18-июн.-2026-г.-16_14_49-1.png 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></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="margin:26px 0; padding:0;">
<svg viewBox="0 0 760 560" width="100%" style="max-width:760px; height:auto; display:block; margin:0 auto;" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,Segoe UI,Roboto,Arial,sans-serif">
<rect x="80" y="20" width="600" height="92" rx="12" fill="#0f7b6c"/>
<circle cx="126" cy="66" r="22" fill="#ffffff"/>
<text x="126" y="73" text-anchor="middle" font-size="22" font-weight="700" fill="#0f7b6c">1</text>
<text x="168" y="56" font-size="17" font-weight="700" fill="#ffffff">Контроль входных данных</text>
<text x="168" y="80" font-size="13.5" fill="#d8efea">Классификация: открытое/внутреннее/персональное. Барьер по 152‑ФЗ.</text>
<text x="168" y="98" font-size="13.5" fill="#d8efea">Персональное и закрытую архитектуру – только в локальный контур.</text>
<text x="380" y="130" text-anchor="middle" font-size="20" fill="#9aa6ad">↓</text>
<rect x="80" y="140" width="600" height="92" rx="12" fill="#1f8f7f"/>
<circle cx="126" cy="186" r="22" fill="#ffffff"/>
<text x="126" y="193" text-anchor="middle" font-size="22" font-weight="700" fill="#1f8f7f">2</text>
<text x="168" y="176" font-size="17" font-weight="700" fill="#ffffff">Контроль среды и модели</text>
<text x="168" y="200" font-size="13.5" fill="#dcf0ec">Изолированный контур для чувствительного. Модель — достаточная,</text>
<text x="168" y="218" font-size="13.5" fill="#dcf0ec">а не самая дорогая. Версии модели и формулировок зафиксированы.</text>
<text x="380" y="250" text-anchor="middle" font-size="20" fill="#9aa6ad">↓</text>
<rect x="80" y="260" width="600" height="92" rx="12" fill="#2f9d8e" />
<circle cx="126" cy="306" r="22" fill="#ffffff"/>
<text x="126" y="313" text-anchor="middle" font-size="22" font-weight="700" fill="#2f9d8e">3</text>
<text x="168" y="296" font-size="17" font-weight="700" fill="#ffffff">Контроль результата </text>
<text x="168" y="320" font-size="13.5" fill="#e1f2ef">Обязательная проверка специалистом. Модель предлагает – </text>
<text x="168" y="338" font-size="13.5" fill="#e1f2ef">человек принимает. Никакого автоприменения в критичных местах.</text>
<text x="380" y="370" text-anchor="middle" font-size="20" fill="#9aa6ad">↓</text>
<rect x="80" y="380" width="600" height="92" rx="12" fill="#46aa9b"/>
<circle cx="126" cy="426" r="22" fill="#ffffff"/>
<text x="126" y="433" text-anchor="middle" font-size="22" font-weight="700" fill="#46aa9b">4</text>
<text x="168" y="416" font-size="17" font-weight="700" fill="#ffffff">Контроль в эксплуатации</text>
<text x="168" y="440" font-size="13.5" fill="#e6f4f1">Метрики: доля валидных артефактов, ложные срабатывания,</text>
<text x="168" y="458" font-size="13.5" fill="#e6f4f1">пропущенные дефекты. Отслеживаем деградацию, готовы откатить.</text>
<text x="380" y="490" text-anchor="middle" font-size="20" fill="#9aa6ad">↓</text>
<rect x="180" y="500" width="400" height="46" rx="23" fill="#16242c"/>
<text x="380" y="528" text-anchor="middle" font-size="16" font-weight="700" fill="#ffffff">Результат, которому можно доверять</text>
</svg></p>
<p style="font-size:14px; color:#7a868d; text-align:center; margin-top:8px;">Задача проходит все четыре этапа. Если не проходит любой из слоёв – к клиенту она не идёт.</p>
</figure>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0">Первый слой проверки – юридический, и его часто недооценивают. Согласно 152‑ФЗ, обработкой персональных данных считается любая операция с ними, включая анализ – неважно, выполняет её человек или алгоритм. Получается, загрузка клиентских данных в стороннюю нейросеть уже считается обработкой со всеми вытекающими последствиями. Поэтому ещё до формулировки первого запроса мы определяем, какие данные допустимо передавать модели и в каком контуре их можно использовать. Остальные три слоя – про среду, про обязательную проверку человеком и про измерение эффекта уже после внедрения.</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><em>Ошибиться не страшно, проверить дёшево. Здесь ИИ работает как добросовестный помощник, а инженер лишь сверяет результат.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<h4 style="font-size:20px; color:#1a2a32; margin:26px 0 8px; font-weight:700;">Подготовка синтетических тестовых данных<br />
    <span style="display:inline-block; font-size:12px; font-weight:700; color:#13654f; background:#d9f0e9; border-radius:12px; padding:2px 10px; vertical-align:middle; margin-left:6px;">риск низкий</span></h3>
<p><!-- /wp:html --></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>
<h4 style="font-size:20px; color:#1a2a32; margin:26px 0 8px; font-weight:700;">Оформление и приведение в порядок баг‑репортов<br />
    <span style="display:inline-block; font-size:12px; font-weight:700; color:#13654f; background:#d9f0e9; border-radius:12px; padding:2px 10px; vertical-align:middle; margin-left:6px;">риск низкий</span></h3>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Инженер нашёл дефект, записал голосовое сообщение и сделал пару снимков экрана. Превратить это в нормальный тикет – с шагами, ожидаемым и фактическим результатом, черновиком критичности и данными об окружении – механическая работа, которую никто не любит. Проверка тут бесплатная: автор видел баг и за пять секунд скажет, исказила ли нейросеть суть или нет. Бонусом получаем единообразие тикетов и то, что обычно забывают приложить: версию сборки, предусловия, шаги до проблемы. Критичность предлагает нейросеть, но финальную метку ставит инженер.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<h4 style="font-size:20px; color:#1a2a32; margin:26px 0 8px; font-weight:700;">Заготовки кода для автотестов<br />
    <span style="display:inline-block; font-size:12px; font-weight:700; color:#8a5a00; background:#fbe9c9; border-radius:12px; padding:2px 10px; vertical-align:middle; margin-left:6px;">риск низкий–средний</span></h3>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Скелеты объектов страниц (шаблон Page Object), фикстуры, фабрики данных, параметризованные таблицы, заготовки клиента к API – всё это скучно писать, но легко проверить: код либо проходит сборку и статический анализ, либо нет. Важно отделять: структуру можно доверить модели, а смысл оставляем за собой. Просьба «напиши заготовку объекта страницы для этого экрана» безопасна, а вот «напиши тесты на оплату» – уже из другой категории.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<h4 style="font-size:20px; color:#1a2a32; margin:26px 0 8px; font-weight:700;">Перекладка форматов и переводы<br />
    <span style="display:inline-block; font-size:12px; font-weight:700; color:#13654f; background:#d9f0e9; border-radius:12px; padding:2px 10px; vertical-align:middle; margin-left:6px;">риск низкий</span></h3>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Чек‑лист – в формализованные сценарии (Gherkin), таблицу решений – в параметризованные кейсы, документацию – с русского на английский для зарубежного заказчика и обратно. Это просто перекладка из формата в формат без потери смысла: проверить можно за минуту – исходник ведь перед глазами.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<h4 style="font-size:20px; color:#1a2a32; margin:26px 0 8px; font-weight:700;">Группировка сбоев и разбор журналов<br />
    <span style="display:inline-block; font-size:12px; font-weight:700; color:#8a5a00; background:#fbe9c9; border-radius:12px; padding:2px 10px; vertical-align:middle; margin-left:6px;">риск низкий–средний</span></h3>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Прогон выдал две сотни ошибок. Раньше инженер вручную разбирался, в чём дело, и видел: на самом деле проблем всего три, просто они повторились в разных тестах. Нейронка же сама группирует похожие сбои: 140 ошибок случились из‑за таймаута на сервере, 50 – потому что сменился локатор, а 10 – это настоящие дефекты. Дальше проверяют выборочно: берут по одному примеру из каждой группы.</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><em>Цена ошибки уже немалая, а на проверку нужно время – вот почему без человека не обойтись. Зато скорость и охват растут так, что отказаться от этого в 2026 году – всё равно что сознательно тормозить развитие.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<h4 style="font-size:20px; color:#1a2a32; margin:26px 0 8px; font-weight:700;">Проектирование тест‑кейсов по требованиям<br />
    <span style="display:inline-block; font-size:12px; font-weight:700; color:#8a5a00; background:#fbe9c9; border-radius:12px; padding:2px 10px; vertical-align:middle; margin-left:6px;">риск средний</span></h3>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Модели передают пользовательскую историю или фрагмент спецификации – на выходе получается структурированный черновик: основной сценарий, граничные значения и негативные проверки, в том числе каверзные. На старте проекта это экономит, по нашим данным, около половины времени на подготовку. Исследования показывают, что генерация кейсов из спецификаций даёт около 87 % валидных кейсов – звучит отлично. Но стоит помнить: оставшиеся 13 % как раз и несут главную опасность.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p>Главная ловушка – «галлюцинация намерения». Если в документации есть пробелы, <span class='font-weight-bold'>ИИ не задаст вопрос и не укажет на проблему – а просто выдумает бизнес‑логику и допишет под неё убедительные сценарии</span>. Был случай: спецификация по скидкам оказалась неполной. Нейросеть  решила, что скидки суммируются, и сгенерировала под это красивые кейсы. А в продукте скидки не суммировались – полчаса ушло на проверку несуществующей логики. <span class='font-weight-bold'>Объём работы можно отдать модели, но контекст и финальное решение должен определять человек.</span></p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:html --></p>
<h4 style="font-size:20px; color:#1a2a32; margin:26px 0 8px; font-weight:700;">Генерация автотестов<br />
    <span style="display:inline-block; font-size:12px; font-weight:700; color:#8a5a00; background:#fbe9c9; border-radius:12px; padding:2px 10px; vertical-align:middle; margin-left:6px;">риск средний</span></h3>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>ИИ преобразует ручные кейсы или спецификацию в заготовки для Playwright, Cypress, pytest – со структурой, шагами и черновиками проверок. Дальше автоматизатор дорабатывает: исправляет локаторы, добавляет осмысленные проверки, устраняет нестабильность.</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":29280,"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="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/03/f2a14c4d-a686-4d38-bb2c-dcfbb6fbca7e-1.png" alt="Автотесты с помощью ИИ" class="wp-image-29280" style="width:282px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/03/f2a14c4d-a686-4d38-bb2c-dcfbb6fbca7e-1.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/03/f2a14c4d-a686-4d38-bb2c-dcfbb6fbca7e-1-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/03/f2a14c4d-a686-4d38-bb2c-dcfbb6fbca7e-1-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/03/f2a14c4d-a686-4d38-bb2c-dcfbb6fbca7e-1-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Тут кроется одна хитрость – видимость покрытия: сгенерированный набор тестов красиво светится зелёным, но если заглянуть в сами проверки, то половина из них сводится к «убедиться, что страница не пустая». Тест проходит всегда – потому что по сути ничего не проверяет. Поэтому в сгенерированных тестах мы сначала смотрим не на сам факт прохождения, а на то, что именно они проверяют.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:html --></p>
<h4 style="font-size:20px; color:#1a2a32; margin:26px 0 8px; font-weight:700;">Самовосстановление локаторов<br />
    <span style="display:inline-block; font-size:12px; font-weight:700; color:#8a5a00; background:#fbe9c9; border-radius:12px; padding:2px 10px; vertical-align:middle; margin-left:6px;">риск средний</span></h3>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Раньше, если на клиентской части меняли идентификатор кнопки, половина тестов сразу переставала работать. Приходилось в спешке всё исправлять. Сейчас всё иначе: когда тест падает, агент анализирует структуру страницы (DOM). Например, видит: идентификатор другой, но кнопка по‑прежнему в блоке оплаты и подписана «Купить» – и тест продолжает работать. Благодаря этому расходы на поддержку снижаются – в нашей практике примерно на 40 %.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Но есть один важный нюанс, о котором редко говорят. Самовосстановление может сыграть злую шутку: оно способно замаскировать настоящий дефект. Допустим, элемент пропал не потому, что его переименовали, а потому что случайно убрали из вёрстки. В таком случае «починенный» тест покажет, что всё в порядке, – и настоящая проблема останется незамеченной. Поэтому агент у нас не вносит правки автоматически. Он лишь предлагает варианты, а человек проверяет и решает, что делать.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<h4 style="font-size:20px; color:#1a2a32; margin:26px 0 8px; font-weight:700;">Регрессия по критичности изменений<br />
    <span style="display:inline-block; font-size:12px; font-weight:700; color:#a02b1c; background:#f7d6d2; border-radius:12px; padding:2px 10px; vertical-align:middle; margin-left:6px;">риск средний–высокий</span></h3>
<p><!-- /wp:html --></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":29275,"width":"200px","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/03/2f17d59d-3773-4be8-bc50-5c51dab23619-edited-free-carve.photos.png" alt="ИИ в тестировании" class="wp-image-29275" style="width:200px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/03/2f17d59d-3773-4be8-bc50-5c51dab23619-edited-free-carve.photos.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/03/2f17d59d-3773-4be8-bc50-5c51dab23619-edited-free-carve.photos-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/03/2f17d59d-3773-4be8-bc50-5c51dab23619-edited-free-carve.photos-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/03/2f17d59d-3773-4be8-bc50-5c51dab23619-edited-free-carve.photos-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:html --></p>
<h4 style="font-size:20px; color:#1a2a32; margin:26px 0 8px; font-weight:700;">Анализ первопричин и сортировка дефектов<br />
    <span style="display:inline-block; font-size:12px; font-weight:700; color:#8a5a00; background:#fbe9c9; border-radius:12px; padding:2px 10px; vertical-align:middle; margin-left:6px;">риск средний</span></h3>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Когда в трекер поступает множество тикетов, человек видит лишь симптомы. ИИ сопоставляет журналы с шагами воспроизведения, группирует похожие дефекты и помогает разобраться в первопричинах. Вместо отчёта «у нас 50 дефектов» руководитель получает чёткую картину: «система деградирует в модуле оплаты из‑за конфликта типов в API – вот пять связанных кейсов». Благодаря этому среднее время локализации дефекта сокращается в два‑три раза. Первопричину предполагает нейронка, а подтверждает – инженер.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<h4 style="font-size:20px; color:#1a2a32; margin:26px 0 8px; font-weight:700;">Контроль изменений в API и поддержка документации<br />
    <span style="display:inline-block; font-size:12px; font-weight:700; color:#8a5a00; background:#fbe9c9; border-radius:12px; padding:2px 10px; vertical-align:middle; margin-left:6px;">риск средний</span></h3>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>По описанию интерфейса (OpenAPI/Swagger) искусственный интеллект формирует проверки запросов и ответов на соответствие контракту. Сюда же относятся тест‑планы и отчёты – из сырых заметок, чек‑листов, идей для исследовательского тестирования. Идеи безопасны: это всего лишь предложения, а не готовые решения. Исполняет и оценивает их человек.</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><em>Либо ошибиться дорого, либо проверить так же тяжело, как сделать самому. В таких случаях ИИ в QA – всего лишь ассистент, а последнее слово всегда за человеком.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Финальная приёмка и решение о выпуске.</span> Это ответственность, а ответственность не делегируется роботу. ИИ готовит сводку, но заключение даёт тестировщик.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Удобство и продуктовое чутьё.</span> искусственный интеллект не скажет: «Этот путь к корзине раздражает» или «Здесь пользователь растеряется» – он не чувствует неудобств. Опаснее всего даже не молчание, а ложная уверенность: получили вывод, что всё в порядке и расслабились. </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Закрытые данные в публичных зарубежных сервисах.</span> Загрузить внутреннюю архитектуру или клиентские данные в публичный иностранный сервис – нарушение 152‑ФЗ. Если данные чувствительные, используйте только корпоративный сервис с хранением в РФ либо локальные модели в своём контуре.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Высокорисковые домены.</span> Платёжные операции, медицина, промышленный софт, где цена сбоя – деньги или жизни. Черновик кейсов можно сгенерировать, но доверять нейросети решение нельзя. </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Стратегия тестирования и оценка продуктовых рисков. </span>Работа с контекстом, которого у нейронки нет: историей проекта, политикой, реальными болевыми точками бизнеса. Шаблонная стратегия выглядит убедительно лишь до первого столкновения с реальностью. </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Глубокая доменная логика на дырявой документации.</span> Чем больше пробелов в описании, тем увереннее ИИ заполнит их правдоподобной ерундой. Здесь она опаснее всего – ошибается очень убедительно. </li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Безопасность как замена аудиту и проверке на проникновение.</span> Первый проход по типовым уязвимостям – пожалуйста. Заключение «защищено» – нет.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0">Общее правило, вытекающее из всего сказанного: <span class='font-weight-bold'>если проверить результат дороже, чем сделать самому,</span> – не передавайте это ИИ. Звучит банально, но это совет, который спасёт от провальных внедрений. </p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></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/outsourcing/" data-type="page" data-id="26">иллюстрирует наш подход</a>: от внутренней обкатки до запуска у клиента.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Классическое нагрузочное тестирование в России обходится дорого: каждый раз, чтобы проверить, выдерживает ли продукт нагрузку, приходится привлекать подрядчика или выделенного инженера. Специалист разворачивает стенд, пишет профили нагрузки, проводит тесты, собирает данные из консоли и ещё день тратит на подготовку понятного отчёта с выводами.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Рассмотрим популярный движок k6: «из коробки» он не предоставляет ни нормального визуального отчёта, ни анализа. Для получения графиков нужно развернуть отдельное хранилище метрик и написать обвязку. По умолчанию доступны лишь числовые данные в консоли.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p>Мы создали поверх k6 переиспользуемую обвязку. Сначала несколько месяцев тестировали её на собственных продуктах, а затем – с согласия клиентов и после анализа их систем – стали предлагать им. Предварительно разбирались, какие данные допустимо использовать.</p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></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> какие конечные точки API задействуются и в каком порядке.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Пороги – это целевые показатели (SLA).</span> Например, если раздел должен открываться за 4 секунды, выставляется соответствующий порог. Прогон покажет, уложились ли в него – а то бывает, что открывается за 12 секунд.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Запуск выполняется одной командой или по событию в конвейере.</span> Прогнали нужным профилем – получили отчёт.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Отчёт формируется автоматически: </span>включает окружение, дату прогона, инструмент, конфигурацию, число запросов и долю успешных, графики пропускной способности и нарастания пользователей, перечень задействованных конечных точек.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Выводы генерирует нейросеть:</span> она анализирует метрики и выдаёт понятные формулировки – где произошла деградация, где достигнут порог, где возникли ошибки сервера. Важный момент для бюджета: для такого анализа не нужна самая дорогая модель – с задачей справится и более простая, с достаточным контекстом.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Переиспользовать решение на новом проекте можно быстро: достаточно поменять базовый адрес и авторизацию через переменные окружения, адаптировать сценарий под свои конечные точки, выставить целевые показатели и, при желании, настроить оформление отчёта под бренд заказчика в конфигурации. День на адаптацию – и дальше нагрузку запускают по кнопке, без привлечения подрядчика каждый раз.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0">По времени разница следующая. <span class='font-weight-bold'>Раньше опытный QA-инженер тратил около двух рабочих дней</span>, чтобы получить осмысленный нагрузочный отчёт с анализом: день – на постановку и сбор данных, ещё день – на анализ и оформление. <span class='font-weight-bold'>С применением ИИ весь цикл (прогон плюс отчёт) укладывается в два часа.</span> Поэтому нагрузку можно проверять не один раз перед большим релизом, а хоть в каждом спринте.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>Честная граница применимости</span><br><br>Для среднего и средне‑крупного веба, <a href="https://quality-lab.ru/blog/mobilnoe-testirovanie-bez-nego-vashe-prilozhenie-teryaet-polzovatelej-i-dengi/" data-type="post" data-id="25647">мобильных приложений</a> и серверных частей обвязка работает отлично: например, портал с требованием «каталог грузится за N секунд» тестируется быстро и эффективно.<br><br>А вот <a href="https://quality-lab.ru/testing-b2b-saas-products/" data-type="page" data-id="29591">сложную систему</a> из десятка подпроектов, тесно связанных с разными платформами и с нетривиальной авторизацией, так просто не протестировать — здесь нужна ручная работа для каждого компонента.<br><br>Поэтому перед запуском мы всегда анализируем стек: на чём построена система, как устроена авторизация и какие элементы действительно стоит нагружать. Цифры в отчёте достоверные (это данные от k6), но пороги задаёт QA-инженер, а выводы ИИ – лишь первый этап анализа, который обязательно подтверждает человек.</pre>
<p><!-- /wp:preformatted --></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>
<pre style="background:#16242c; color:#e6f1ee; border-radius:8px; padding:16px 18px; font-size:14px; line-height:1.6; overflow-x:auto; font-family:ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace; margin:14px 0;">Окупаемость (%) = (Годовая экономия − Годовые затраты на ИИ) / Годовые затраты × 100%

Годовая экономия = (Часы «до» − Часы «после») × Ставка часа × Раз в год

Годовые затраты = Подписка/токены за год
                + Разовая настройка × Ставка (распределённая по числу прогонов)
                + Часы на проверку результата × Ставка × Раз в год
                + Обучение команды</pre>
<p><!-- /wp:html --></p>
<p><!-- wp:paragraph --></p>
<p>Главное, что упускают в красивых презентациях, – скрытые затраты. Их три, и они съедают выгоду:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Время на проверку. </span>Это самая большая статья расходов: ИИ сгенерировала за минуту, а инженер проверял два часа – и эти два часа идут в расчёт.</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:preformatted --></p>
<pre class="wp-block-preformatted">Расчёты по российским ставкам (полная стоимость часа): QA Middle – около 1 200 ₽/ч, AQA – от 1 500 ₽/ч (для senior – 2 500 ₽/ч). <span class='font-weight-bold'>Цифры округлены – можете подставить свои данные.</span></pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Проектирование тест‑кейсов нового модуля: 40 пользовательских историй, всего около 250 кейсов.</span></li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Было:</span> 250 × 15 мин = 62,5 ч × 1 200 ₽ = <span class='font-weight-bold'>75 000 ₽</span> за модуль.<br /><span class='font-weight-bold'>Стало:</span> генерация – около 1 ч, проверка и правки – 250 × 5 мин ≈ 21 ч, плюс час на формулировки, итого ≈ 22 ч × 1 200 ₽ = <span class='font-weight-bold'>26 400 ₽</span>. Затраты на токены – 300–800 ₽.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><em><span class='font-weight-bold'>Экономия:</span> ≈ <span class='font-weight-bold'>48 000 ₽</span> за модуль, сокращение времени на 65%. При восьми модулях в год – <span class='font-weight-bold'>около 384 000 ₽</span>. Учитываем, что 13% кейсов невалидны – именно на них уходит дополнительное время проверки.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true,"start":2} --></p>
<ol start="2" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Цикл нагрузочного тестирования при подготовленной инфраструктуре.</span></li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Было:</span> около 2 рабочих дней (16 ч) на постановку, прогон и анализ × 2 500 ₽ = <span class='font-weight-bold'>40 000 ₽</span> за цикл (каждый раз с нуля).<br /><span class='font-weight-bold'>Стало:</span> около 2 ч на прогон с отчётом × 2 500 ₽ = <span class='font-weight-bold'>5 000 ₽</span>. Анализ от простой модели обходится почти бесплатно.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><em><span class='font-weight-bold'>Экономия: ≈ 35 000 ₽</span> за цикл. При тестировании раз в спринт (24 раза в год) – <span class='font-weight-bold'>около 840 000 ₽</span>. Минус разовая адаптация под проект – примерно день работы (20 000 ₽). Окупаемость – в первом квартале.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true,"start":3} --></p>
<ol start="3" class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Поддержка автотестов (самовосстановление локаторов), набор – около 800 тестов.</span></li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Было:</span> примерно 15 ч/спринт на починку локаторов и устранение нестабильности × 24 спринта = 360 ч/год × 1 500 ₽ = <span class='font-weight-bold'>540 000 ₽</span>.<br /><span class='font-weight-bold'>Стало:</span> самовосстановление сокращает ручную починку на ~40%.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><em><span class='font-weight-bold'>Экономия:</span></em> около <span class='font-weight-bold'>216 000 ₽/год</span>. Затраты – инфраструктура агента и проверка предложенных правок.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:image {"id":30265,"sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="577" src="https://quality-lab.ru/wp-content/uploads/2026/06/image-3-1_11zon-1024x577.png" alt="ии для тестирования" class="wp-image-30265" srcset="https://quality-lab.ru/wp-content/uploads/2026/06/image-3-1_11zon-1024x577.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/06/image-3-1_11zon-300x169.png 300w, https://quality-lab.ru/wp-content/uploads/2026/06/image-3-1_11zon-768x432.png 768w, https://quality-lab.ru/wp-content/uploads/2026/06/image-3-1_11zon-1536x865.png 1536w, https://quality-lab.ru/wp-content/uploads/2026/06/image-3-1_11zon-2048x1153.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">В первых двух примерах деньги – лишь половина. Вторая половина в том, что джун не выгорает на двухсотом однотипном кейсе, а нагрузочное тестирование перестаёт быть пугающим – его можно проводить чаще. Узкое место выявляется в спринте, а не за ночь до релиза.</pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Сводная таблица по передаче QA-задач нейросетям</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:html --></p>
<div style="overflow-x:auto; margin:14px 0;">
<table style="border-collapse:collapse; width:100%; font-size:15px;">
<thead>
<tr style="background:#16242c; color:#ffffff;">
<th style="text-align:left; padding:10px 12px; border:1px solid #16242c;">Задача</th>
<th style="text-align:left; padding:10px 12px; border:1px solid #16242c;">Режим</th>
<th style="text-align:left; padding:10px 12px; border:1px solid #16242c;">Типовой эффект</th>
<th style="text-align:left; padding:10px 12px; border:1px solid #16242c;">Риск</th>
<th style="text-align:left; padding:10px 12px; border:1px solid #16242c;">Слои контроля</th>
</tr>
</thead>
<tbody>
<tr style="background:#f5f9f8;">
<td style="padding:9px 12px; border:1px solid #dde4e6;">Синтетические данные</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Передать</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Часы в минуты, без риска утечки</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;"><span style="color:#13654f; font-weight:700;">низкий</span></td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">1, 3</td>
</tr>
<tr>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Оформление баг‑репортов</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Передать</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Единообразие, минус рутина</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;"><span style="color:#13654f; font-weight:700;">низкий</span></td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">3</td>
</tr>
<tr style="background:#f5f9f8;">
<td style="padding:9px 12px; border:1px solid #dde4e6;">Заготовки автотестов</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Передать</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Минус ручная рутина</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;"><span style="color:#8a5a00; font-weight:700;">низкий/средний</span></td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">2, 3</td>
</tr>
<tr>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Группировка сбоев и журналов</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Передать</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Минус часы анализа</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;"><span style="color:#8a5a00; font-weight:700;">низкий/средний</span></td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">3</td>
</tr>
<tr style="background:#f5f9f8;">
<td style="padding:9px 12px; border:1px solid #dde4e6;">Проектирование тест‑кейсов</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Ускорить</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">−50–60% фазы подготовки</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;"><span style="color:#8a5a00; font-weight:700;">средний</span></td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">3, 4</td>
</tr>
<tr>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Генерация автотестов</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Ускорить</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Меньше ручного написания</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;"><span style="color:#8a5a00; font-weight:700;">средний</span></td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">3, 4</td>
</tr>
<tr style="background:#f5f9f8;">
<td style="padding:9px 12px; border:1px solid #dde4e6;">Самовосстановление локаторов</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Ускорить</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">−40% поддержки</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;"><span style="color:#8a5a00; font-weight:700;">средний</span></td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">3</td>
</tr>
<tr>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Регрессия по критичности изменений</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Ускорить</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Заключение за минуты</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;"><span style="color:#a02b1c; font-weight:700;">средний/высокий</span></td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">3, 4</td>
</tr>
<tr style="background:#f5f9f8;">
<td style="padding:9px 12px; border:1px solid #dde4e6;">Анализ первопричин</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Ускорить</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Время локализации меньше в 2–3 раза</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;"><span style="color:#8a5a00; font-weight:700;">средний</span></td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">3</td>
</tr>
<tr>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Нагрузочное (k6 + анализ модели)</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Ускорить</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">2 дня → 2 часа за цикл</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;"><span style="color:#8a5a00; font-weight:700;">средний</span></td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">1, 3, 4</td>
</tr>
<tr style="background:#f5f9f8;">
<td style="padding:9px 12px; border:1px solid #dde4e6;">Приёмка или решение о выпуске</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Избегать</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">—</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;"><span style="color:#a02b1c; font-weight:700;">высокий</span></td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">только человек</td>
</tr>
<tr>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Удобство, продуктовое чутьё</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Избегать</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">—</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;"><span style="color:#a02b1c; font-weight:700;">высокий</span></td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">только человек</td>
</tr>
<tr style="background:#f5f9f8;">
<td style="padding:9px 12px; border:1px solid #dde4e6;">Закрытые данные в публичный сервис</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Избегать</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">—</td>
<td style="padding:9px 12px; border:1px solid #dde4e6;"><span style="color:#a02b1c; font-weight:700;">высокий</span></td>
<td style="padding:9px 12px; border:1px solid #dde4e6;">барьер на слое 1</td>
</tr>
<tr>
<td style="padding:9px 12px; border:1px solid #dde4e6;">Платежи/медицина/ промышленность</td>
<td style=]]></description>
<link>https://quality-lab.ru/blog/kakie-zadachi-v-testirovanii-pora-otdat-ii-chtoby-poluchit-rezultat-a-ne-novye-problemy/</link>
<pubDate>Thu, 18 Jun 2026 18:09:03 +0300</pubDate>
</item>
<item>
<title>Ломаем автопилот: как я перестал тестировать механически</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/breaking-the-autopilot.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/breaking-the-autopilot.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Ужвал Кумар Сингх (Ujjwal Kumar Singh)<br /><strong><a href="https://www.ministryoftesting.com/articles/breaking-the-autopilot-how-i-stopped-testing-software-like-a-machine" mce_href="https://www.ministryoftesting.com/articles/breaking-the-autopilot-how-i-stopped-testing-software-like-a-machine" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><h1>Сигнал к пробуждению</h1>
<p>Я занимаюсь тестированием программного обеспечения уже три года. Тестировал разные типы приложений, следовал всем профессиональным практикам, выполнял тест-кейсы и отмечал все пункты.</p>
<p>Но иногда я не думал о том, что делаю. Я просто механически проходил шаги, выполняя тесты как машина. И именно так пропустил критический баг, который заблокировал доступ к платформе как новым, так и существующим пользователям. Этот баг попал в продакшен, и по мере развития ситуации стало понятно, что процессом тестирования и выбранными стратегиями недовольны. Через пару дней почта каждого члена команды взорвалась жалобами клиентов, и менеджер посмотрел тем самым взглядом. Все знают этот взгляд. Он не злой. Просто… разочарованный.</p>
<p>Следующие несколько дней я прокручивал всё это в голове, пытаясь понять, где ошибся. Все сценарии были протестированы правильно, все шаги выполнены. И всё же я полностью упустил, как реальный пользователь мог бы взаимодействовать с системой.</p>
<p>Тогда ко мне пришло осознание: тестирование велось мной механически. Но программное обеспечение создаётся для людей.</p>]]></description>
<link>https://software-testing.ru/library/around-testing/processes/4496-breaking-the-autopilot</link>
<pubDate>Tue, 16 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Как начать тестировать внутренние покупки (In-App Purchases) на Android</title>
<description><![CDATA[<p>Автор: Павлович Евгений</p>
<p>Эта статья основана на моем опыте и, надеюсь, поможет быстрее стартовать коллегам в ручном тестировании внутренних покупок в  Android-приложениях.  Это не исчерпывающее руководство, просто хочется дать стартовые инструкции, чтобы можно было увереннее начать. </p><p>IAP - важный элемент монетизации мобильных приложений. К примеру, частый сценарий, предложение подписки через paywall. Корректная работа этого механизма критична как для бизнеса, так и для пользовательского опыта.</p>]]></description>
<link>https://software-testing.ru/library/testing/mobile-testing/4520-in-app-purchases</link>
<pubDate>Sun, 14 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Готова ли ваша IT-инфраструктура к внедрению цифрового рубля?</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p>Мы много работаем с финтехом, ритейлом и компаниями из смежных сфер – то есть как раз с теми, кого цифровой рубль затрагивает сильнее всего. Поэтому подготовку начали ещё в начале 2026 года, понимая, что июль и август будут авральными. Дедлайн внедрения – 1 сентября 2026 года, а подключение к платформе цифрового рубля – это не просто «прикрутить ещё одну кнопку оплаты».</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>И вот тут важная штука про то, как устроена «Лаборатория Качества». Казалось бы, мы просто тестировщики: дайте требования – проверим по требованиям. Но это не наш подход. Чтобы клиенты получили действительно топовое тестирование, а появление цифрового рубля не зааффектило их бизнес (а в идеале – помогло), мы за это полугодие вынесли мозг всем знакомым финтех-коллегам, сходили даже на вебинары для бухгалтеров, перечитали законы и стандарты Банка России и собрали внушительную методологическую базу.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30172,"width":"261px","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/06/586450d4-27b0-4752-a37b-8559bb1df99f-Photoroom_11zon.png" alt="Цифровой рубль" class="wp-image-30172" style="width:261px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/06/586450d4-27b0-4752-a37b-8559bb1df99f-Photoroom_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/06/586450d4-27b0-4752-a37b-8559bb1df99f-Photoroom_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/06/586450d4-27b0-4752-a37b-8559bb1df99f-Photoroom_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/06/586450d4-27b0-4752-a37b-8559bb1df99f-Photoroom_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Всю методологию мы, конечно, не раскроем. Но в этой статье – практическая выжимка, которая будет особенно полезна CEO, руководителям продуктов и разработки. Она поможет понять, что и как нужно протестировать перед запуском в прод. Поехали!</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Почему стандартного набора проверок для цифрового рубля недостаточно?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Цифровой рубль – третья форма национальной валюты (помимо наличной и безналичной). Его эмитент и оператор платформы – Банк России. На первый взгляд может показаться, что это просто добавление ещё одного способа оплаты, но для команды разработки ситуация выглядит иначе – и вот почему.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></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> С помощью смарт‑контрактов можно заключать самоисполняемые сделки и ограничивать использование средств определёнными целями. Это принципиально новые сценарии, где нужно тестировать <em>не только то, что должно сработать, но и то, что работать не должно.</em></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Плотный регуляторный контур.</span> 115‑ФЗ, идентификация через ЕСИА, электронная подпись, банковская тайна, лимиты и обязательное право выбора способа оплаты. Из‑за этого к обычному функциональному тестированию добавляется обязательный этап – комплаенс‑тестирование.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Тест‑базис постоянно меняется.</span> платформа развивается, стандарты регулярно обновляются. Ключевые изменения вступают в силу 1 июля 2026 года – буквально накануне дедлайна. То есть вы стабилизируете релиз против движущейся мишени.</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":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0">Если коротко: цифровой рубль превращает простую проверку функций в управление расчётными и регуляторными рисками. А это совсем другие объём и глубина тестирования.</p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Какие требования ЦБ нужно проверить до запуска цифрового рубля?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30173,"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="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/06/1016190e-72dc-4f5d-a0d8-f592ec1e5563-Photoroom_11zon.png" alt="Цифровой рубль требования" class="wp-image-30173" style="width:282px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/06/1016190e-72dc-4f5d-a0d8-f592ec1e5563-Photoroom_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/06/1016190e-72dc-4f5d-a0d8-f592ec1e5563-Photoroom_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/06/1016190e-72dc-4f5d-a0d8-f592ec1e5563-Photoroom_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/06/1016190e-72dc-4f5d-a0d8-f592ec1e5563-Photoroom_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Прежде чем составлять тест‑кейсы, зафиксируйте тест‑базис. В случае с цифровым рублём это не только ваше внутреннее ТЗ, но и пакет стандартов платформы от Банка России – именно по этим документам вы проверяете соответствие. Они особенно важны для тех, кто запускается в первой волне.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:table {"align":"center"} --></p>
<figure class="wp-block-table aligncenter">
<table class="has-fixed-layout">
<tbody>
<tr>
<td class="has-text-align-left" data-align="left"><span class='font-weight-bold'>Документ</span></td>
<td class="has-text-align-left" data-align="left"><span class='font-weight-bold'>Зачем он тестировщику</span></td>
</tr>
<tr>
<td class="has-text-align-left" data-align="left">«Требования операционно-технологического взаимодействия на платформе цифрового рубля» (актуальная редакция применяется с 01.07.2026)</td>
<td class="has-text-align-left" data-align="left">Главный технический контракт интеграции: как ваш контур общается с платформой. Базис интеграционных и сверочных тестов.</td>
</tr>
<tr>
<td class="has-text-align-left" data-align="left">«Альбомы распоряжений и сообщений»</td>
<td class="has-text-align-left" data-align="left">Форматы и структура сообщений/распоряжений. Из них растут позитивные, негативные и граничные кейсы для каждого типа операции.</td>
</tr>
<tr>
<td class="has-text-align-left" data-align="left">«Спецификация на программный модуль»</td>
<td class="has-text-align-left" data-align="left">Требования к программному модулю участника. Важно для проверки совместимости и корректной обработки операций.</td>
</tr>
<tr>
<td class="has-text-align-left" data-align="left">«Порядок подключения участника платформы»</td>
<td class="has-text-align-left" data-align="left">Регламент подключения. Влияет на сценарии онбординга, выдачи доступа, приостановки и возобновления.</td>
</tr>
<tr>
<td class="has-text-align-left" data-align="left">«Требования и рекомендации к пользовательским интерфейсам…» (актуальная версия – с 01.07.2026)</td>
<td class="has-text-align-left" data-align="left">Как должны выглядеть и вести себя клиентские экраны операций. Базис для юзабилити- и комплаенс-проверок (включая право выбора способа оплаты).</td>
</tr>
<tr>
<td class="has-text-align-left" data-align="left">«Порядок оценки влияния клиентского приложения на криптографические средства» (опубликован в мае 2026)</td>
<td class="has-text-align-left" data-align="left">Прямо касается ИБ-тестирования: клиентское приложение не должно нарушать требования к встроенным СКЗИ.</td>
</tr>
<tr>
<td class="has-text-align-left" data-align="left">Тарифы оператора платформы</td>
<td class="has-text-align-left" data-align="left">Нужны для проверки корректности расчёта и удержания комиссий (см. раздел про комплаенс).</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0">Главный подводный камень – версионирование стандартов. Зафиксируйте в стратегии тестирования, по каким именно редакциям (с какими датами вступления в силу) вы проверяетесь, и предусмотрите перепрогон при их обновлении. Иначе вы пройдёте сертификацию по старой версии, а в прод выйдете уже с новой.</p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></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">9 аспектов тестирования при подготовке к внедрению цифрового рубля</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"width":"33.33%"} --></p>
<div class="wp-block-column" style="flex-basis:33.33%"><!-- wp:image {"id":30175,"width":"221px","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/06/fd2f9216-bb6d-4b67-957f-ec93a1d410b1-Photoroom_11zon.png" alt="Переход на цифровой рубль" class="wp-image-30175" style="width:221px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/06/fd2f9216-bb6d-4b67-957f-ec93a1d410b1-Photoroom_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/06/fd2f9216-bb6d-4b67-957f-ec93a1d410b1-Photoroom_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/06/fd2f9216-bb6d-4b67-957f-ec93a1d410b1-Photoroom_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/06/fd2f9216-bb6d-4b67-957f-ec93a1d410b1-Photoroom_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center","width":"66.66%"} --></p>
<div class="wp-block-column is-vertically-aligned-center" style="flex-basis:66.66%"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">А теперь разберём по слоям, что тестировать, как мы это делаем методологически, и на какие специфические грабли наступают компании чаще всего.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">1. Функциональное тестирование операций</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Самый понятный слой – и потому его часто недооценивают. Проверять, открывается ли кошелёк и проходит ли перевод, – это не покрытие, а разминка. Полный жизненный цикл операции с цифровым рублём охватывает открытие и закрытие кошелька, пополнение с безналичного счёта, переводы между физлицами (C2C), оплату в пользу бизнеса (C2B), расчёты между юрлицами (B2B), оплату по универсальному QR‑коду, а также возвраты, частичные возвраты и отмены операций.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Методология</h4>
<p><!-- /wp:heading --></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>Для каждого типа операций – будь то C2C, C2B, B2B или возвраты – прописать позитивные, негативные и граничные сценарии. Опираться на альбомы сообщений ЦБ.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Важно не просто проверять, что отображается на экране, а убедиться в согласованности трёх элементов: данных, доступных клиенту, информации в вашей системе и подтверждения от платформы.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Отдельно протестировать ситуации, когда операция прерывается на полпути – например, если связь оборвалась между подтверждением и исполнением. В таких случаях нужно чётко понимать, как система обрабатывает «зависшие» деньги.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Подводные камни и рекомендации</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Возвраты – это не просто обратный перевод.</span> Нужно отдельно проработать разные сценарии: частичный возврат, возврат после смены статуса или возврат по операции с истёкшим контекстом. Не стоит рассчитывать, что они будут работать по той же логике – пропишите каждый случай явно.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Округление и копейки.</span> Любые расчёты – будь то комиссия, частичный возврат или дробление суммы – могут привести к расхождениям. Тестируйте граничные значения и сверяйте итоговые суммы с данными реестра.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Идемпотентность с точки зрения пользователя.</span> Если человек случайно дважды нажмёт на кнопку, обновит страницу или отправит запрос повторно из‑за таймаута, это не должно приводить к созданию второй операции. Такой сценарий нужно проверять как обычную функциональность, а не только с технической стороны.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">2. Тестирование смарт-контрактов и «окрашенных» средств</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":4} --></p>
<h4 class="wp-block-heading">Методология</h4>
<p><!-- /wp:heading --></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:heading {"level":4} --></p>
<h4 class="wp-block-heading">Подводные камни и рекомендации</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Самый дорогой баг в этой системе – ложное исполнение: </span>когда деньги уходят, хотя условие не выполнено. Это не просто мелкий недочёт – это серьёзный финансовый инцидент. Поэтому негативные сценарии стоит проверять даже тщательнее, чем позитивные.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Учитывайте фактор времени. </span>В сделках с дедлайнами, отсрочками и разными периодами нужно специально управлять временем на тестовом стенде – например, подменять время или ускорять таймеры. Иначе просто не получится полноценно проверить, как работает истечение срока.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Окрашивание средств – это не обычный перевод. </span>Важно убедиться, что ограничения по целевому использованию сохраняются на всех этапах цепочки операций и не сбрасываются после первой транзакции.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">3. Интеграционное тестирование</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Здесь обычно и возникают основные сложности. У вас как минимум четыре ключевых шва: ваш контур и платформа ЦБ, ваш контур и НСПК/СБП с универсальным платёжным QR‑кодом, клиентское приложение и ваш бэкенд, а также касса или терминал и эквайринг.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Каждый такой стык – это отдельная интеграция, у которой свои версии, таймауты и форматы сообщений. Из‑за этого легко появляются расхождения и ошибки: то формат не совпадает, то время ожидания истекает раньше нужного, то версии систем не согласуются между собой. Важно тщательно проверять взаимодействие на каждом этапе.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Методология</h4>
<p><!-- /wp:heading --></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>Прогонять сценарии «по шву» и сквозные (е2е), отдельно проверяя асинхронные статусы, таймауты, ретраи и идемпотентность.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Для ритейла нужен отдельный блок проверок: взаимодействие кассы, эквайринга, универсального QR‑кода и фискализации чека (ККТ). При оплате цифровым рублём продавец обязан использовать ККТ как обычно, поэтому важно проверять чек и расчёт вместе – как единую цепочку операций.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Подводные камни и рекомендации</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Недоступность платформы – это штатный сценарий.</span> Тестируйте поведение при таймаутах и отказах смежной системы: что видит клиент, что попадает в очередь, как потом досверяется.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Универсальный QR обязан давать выбор.</span> После сканирования пользователь должен получить варианты: СБП, сервис банка или цифровой рубль. Проверьте, что выбор действительно работает и ни один из способов не выбирается автоматически в обход правил.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Зависимость от готовности банка.</span> Торговая компания не сможет принимать цифровой рубль, пока её банк‑эквайер не обеспечит техническую поддержку этой функции. Имейте это в виду при планировании интеграционного тестирования: возможно, тестовый контур банка будет готов позже вашего.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Не тестируйте только успешный сценарий по сети.</span> Самые дорогие дефекты живут в обрывах, частичных ответах и рассинхронах.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">4. Тестирование сверки и расчётов (реконсиляция)</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Этот слой для обычного продукта почти не важен, а для цифрового рубля – критически необходим. Поскольку деньги учитываются в реестре ЦБ, а ваш контур лишь обрабатывает распоряжения, он должен полностью совпадать с реестром оператора. Любое расхождение может привести к тому, что деньги реального клиента окажутся не там, где нужно.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Методология</h4>
<p><!-- /wp:heading --></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:heading {"level":4} --></p>
<h4 class="wp-block-heading">Подводные камни и рекомендации</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>«У нас же всё прошло» – самообман.</span> Операция может пройти у вас и не дойти до платформы (или наоборот). Без сверки вы узнаете об этом от клиента, а это худший канал обратной связи.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Главный кошмар – двойное списание.</span> Сценарии ретраев и параллельных запросов проверяйте до прода, а не после первой жалобы.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Возвраты и частичные операции усложняют сверку.</span> Убедитесь, что система корректно учитывает и такие случаи, а не только полноценные платежи.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">5. Нагрузочное и стресс-тестирование</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Этот вопрос особенно актуален для ритейла и электронной коммерции. Когда вы добавляете оплату через универсальный QR‑код и цифровой рубль, приходится вносить изменения в код – причём именно в той части системы, где и так максимальная нагрузка. А если площадка упадёт во время распродажи, это приведёт к прямой потере выручки и удару по репутации.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Методология</h4>
<p><!-- /wp:heading --></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>Совместно с DevOps искать узкие места: БД, очереди, внешние интеграции, фискализация – и проверять их под нагрузкой по отдельности.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Использовать реалистичную гео-распределённую нагрузку. Мы, например, генерируем нагрузку из 40 регионов России без симуляции присутствия – так профиль ближе к реальному наплыву покупателей.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Подводные камни и рекомендации</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>«Прошлый год пережили» – ещё не гарантия, что справимся в новом.</span> Новый платёжный путь и рост трафика меняют картину. Нужен свежий замер запаса прочности, а не воздушный замок на воспоминаниях.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Простая арифметика для финдиректора.</span> Один час простоя в пик почти всегда стоит дороже годового бюджета на нагрузочное тестирование. Это не запугивание, это сравнение двух чисел.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Интеграции под нагрузкой ведут себя иначе.</span> Система может отлично работать с единичным запросом – и дать сбой при тысяче одновременных. Поэтому тестируйте швы компонентов именно в пиковых условиях.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">6. Тестирование информационной безопасности</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Расчёты цифровым рублём опираются на электронную подпись и сертифицированные криптосредства. При этом контроль за операциями становится строже: меры против отмывания денег распространяются и на цифровой рубль, а Росфинмониторинг получает прямой доступ к данным об операциях. Поэтому тестирование информационной безопасности здесь нельзя оставлять на последний этап – оно должно быть в приоритете.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Методология</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li>Проверить работу с ЭП и управление ключами/сертификатами: их выпуск, использование, отзыв, истечение срока действия, а также поведение системы при невалидной подписи.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Оценить влияние клиентского приложения на встроенные криптосредства – по соответствующему стандарту платформы: приложение не должно нарушать требования к СКЗИ.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Проверять целостность смарт-контрактов и права доступа к их запуску – ЦБ прямо называет это приоритетом ИБ.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Протестируйте систему на устойчивость к мошенническим социально‑инженерным атакам: например, к подмене реквизитов, навязыванию перевода или попыткам выполнить операцию без должной авторизации.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Подводные камни и рекомендации</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Соц.инженерия мигрирует на новый инструмент.</span> Как только появляется новый способ перевести деньги, мошенники придумывают способ их забрать. Сценарии «жертва сама подтверждает операцию» нужно отрабатывать заранее.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Криптомодуль – это не «чёрный ящик, а часть системы.</span> Важно проверять, как именно ваше приложение взаимодействует с ним, а не просто отмечать факт подключения СКЗИ.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>ИБ и комплаенс пересекаются.</span> Ряд проверок (идентификация, управление доступом и аудит операций) – находится на их стыке. Не стоит распределять эти задачи между разными командами так, чтобы зона взаимодействия осталась без ответственного.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">7. Комплаенс-тестирование</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Это тот самый слой, который традиционно «не входит в QA», пока не клюнет жареный петух. Мы недавно <a href="https://quality-lab.ru/blog/a-vashi-testirovshhiki-zashhishhayut-vash-produkt-i-kompaniyu-ot-millionnyx-shtrafov/">подробно писали про комплаенс-тестирование</a> и про заблуждение о том, что это не вопрос QA-инженеров. Цифровой рубль – прекрасный пример: регуляции усложняются, и рядом с функциональным тестированием обязательным становится именно комплаенс.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Методология</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li>Идентификация и доступ: открытие кошелька возможно только после идентификации по 115-ФЗ, при наличии учётной записи в ЕСИА и ключа электронной подписи. Тестируем позитивные и негативные ветки (нет идентификации, нет ЕСИА, невалидная подпись).</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Лимиты: на период пилота действует лимит пополнения кошелька физлица – 300 000 ₽ в месяц. Заводим граничные кейсы: 0, ровно лимит, лимит + копейка, исчерпание лимита частями из разных источников.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Право выбора способа оплаты при сканировании универсального QR: проверяем, что выбор реально доступен, ничто не «предпрожато», нет тёмных паттернов, скрывающих опции.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Тарифы: корректность расчёта и удержания комиссий – приём оплаты бизнесом (C2B) по утверждённому тарифу 0,3% от суммы, но не более 1 500 ₽; переводы между юрлицами (B2B) – фиксированно 15 ₽. Проверяем округление, лимит комиссии, кто и сколько платит.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Персональные данные и банковская тайна: режим конфиденциальности операций, корректный отзыв согласия (а не заглушка, которая ставит флаг «удалено», оставляя данные на месте), минимизация собираемых данных – это 152-ФЗ.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Фискализация: при оплате цифровым рублём продавец обязан применять ККТ в обычном порядке – проверяем выдачу корректного чека.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Подводные камни и рекомендации</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Цена комплаенс-бага другая.</span> Функциональный дефект стоит репутации и нервов. Комплаенс-ошибка в расчётах цифровым рублём – это предписания, штрафы и вопросы к самой возможности участвовать в платформе. Это блокер, рядом с которым меркнет большинство багов в логике.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Функция «Удалить аккаунт» должна действительно удалять.</span> Классическая ловушка: кнопка есть, а данные остаются. Проверяйте поведение системы, а не наличие текста про политику конфиденциальности.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Тёмные паттерны прилетают на ровном месте.</span> Например, автоматически выбранный способ оплаты или скрытая опция способны привести к претензиям со стороны потребителей из‑за нарушения их прав. Заранее проверяйте, чтобы интерфейс не вводил пользователей в заблуждение.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">8. Тестирование офлайн-режима</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Одно из обещанных преимуществ цифрового рубля – возможность оплачивать покупки без интернета, что особенно важно для отдалённых районов. Технология пока развивается, поэтому к ней предъявляют повышенные требования по безопасности. Офлайн‑платёж по сути означает отложенную синхронизацию данных, а она, в свою очередь, может привести к конфликтам, дублированию операций и спорным ситуациям.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Методология</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li>Главный класс сценариев – защита от двойного списания: одни и те же средства не должны быть потрачены дважды в офлайне до синхронизации.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Тестировать синхронизацию постфактум: восстановление связи, разрешение конфликтов, порядок применения операций.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Проверять граничные состояния устройства: разряд, потеря данных, рассинхрон часов, частичная синхронизация.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Подводные камни и рекомендации</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Конфликт синхронизации – норма, а не исключение.</span> Если произошли две офлайн‑операции, а потом обе дошли до системы, результат должен быть предсказуемым. Иначе на кассе возникнет спор с клиентом.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Не стоит запускать офлайн‑режим только потому, что такая возможность прописана в стандарте.</span> Если фича сырая, лучше явный отказ, чем тихий дубль списания.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">9. Регрессионное тестирование и автоматизация</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Расчётный контур меняется часто, а ломаться ему нельзя. Без стабильного автоматизированного регресса каждый релиз превращается в лотерею «что отвалилось в этот раз». А перед дедлайном такие проблемы обходятся особенно дорого.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Методология</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li>Выделить критический путь расчётов (открытие кошелька, основные типы операций, оплата по QR, возвраты, сверка) и закрыть его автотестами в первую очередь.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Прогонять регресс автоматически на каждом релизе расчётного контура, а не от случая к случаю.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Следите за стабильностью набора тестов: «мигающие» тесты обесценивают весь регресс, потому что им перестают верить.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Привязывать автотесты к версиям стандартов, чтобы при обновлении контракта быстро видеть, что именно поехало.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Подводные камни и рекомендации</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Нестабильный регресс хуже его отсутствия.</span> Если тесты постоянно дают разные результаты, команда начинает игнорировать их сбои – и может пропустить реальные ошибки.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9"><span class='font-weight-bold'>Автоматизация – это не «нанять джуна на месяц».</span> Для тестирования расчётов под нагрузкой и интеграций нужны проверенные фреймворки и специалисты с опытом их внедрения.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:separator --></p>
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Итоговая карта рисков перед запуском цифрового рубля</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"width":"33.33%"} --></p>
<div class="wp-block-column" style="flex-basis:33.33%"><!-- wp:image {"id":30171,"width":"197px","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/06/93a7f7d6-ccc8-4413-b536-4b5610bc8a20-Photoroom_11zon.png" alt="Технологические процессы участника платформы цифрового рубля" class="wp-image-30171" style="width:197px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/06/93a7f7d6-ccc8-4413-b536-4b5610bc8a20-Photoroom_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/06/93a7f7d6-ccc8-4413-b536-4b5610bc8a20-Photoroom_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/06/93a7f7d6-ccc8-4413-b536-4b5610bc8a20-Photoroom_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/06/93a7f7d6-ccc8-4413-b536-4b5610bc8a20-Photoroom_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center","width":"66.66%"} --></p>
<div class="wp-block-column is-vertically-aligned-center" style="flex-basis:66.66%"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Чтобы систематизировать всё, что мы рассказали, используйте итоговую таблицу. Её удобно показать на синке с разработчиками и DevOps – и честно отметить, какие участки системы надёжно покрыты тестированием, а какие требуют доработки.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:table {"align":"center"} --></p>
<figure class="wp-block-table aligncenter">
<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>Ложное исполнение сделки &#8212; это финансовый инцидент</td>
<td>Финтеху, B2B, госконтрактам</td>
</tr>
<tr>
<td>Интеграционное</td>
<td>Хрупкие стыки «сыплются» в пик, каскадные отказы</td>
<td>Банкам, ритейлу</td>
</tr>
<tr>
<td>Сверка, реконсиляция</td>
<td>Расхождения с реестром ЦБ, двойные списания</td>
<td>Банкам</td>
</tr>
<tr>
<td>Нагрузочное</td>
<td>Падение площадки в распродажу &#8212; это потеря выручки</td>
<td>Ритейлу, e-commerce</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>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></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/qa-audit/">аудит QA-системы</a>, картина почти всегда одна: команда сильная, но перегруженная. Регресс нестабилен, автоматизаторов не хватает, а узкие компетенции – нагрузка и информационная безопасность – есть в единственном экземпляре, который вот-вот выгорит. И всё это накладывается на дефицит и дороговизну инженеров: сильный QA в Москве – это порядка 190 000 ₽ в месяц, и таких нужно несколько, причём прямо сейчас, под разовый пик перед 1 сентября, а не в штат на годы.</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>Мы её не заменяем, а подключаемся в нужный период. Закрываем пики и редкие компетенции – нагрузку, ИБ, автоматизацию. Прозрачная смета и SLA вместо непредсказуемого найма.</td>
</tr>
<tr>
<td>«Внешние не разберутся в нашей архитектуре»</td>
<td>Быстро погружаемся через обратный инжиниринг, есть опыт фреймворков под highload, в штате – один из ведущих в РФ специалистов по Selenium.</td>
</tr>
<tr>
<td>«Боюсь потерять контроль над качеством»</td>
<td>Работаем на ваших процессах и под вашим управлением в рамках <a href="https://quality-lab.ru/outstaff/">аутстаффа</a>. Подробная отчётность, быстрый онбординг, при желании – рост зрелости через консалтинг и обучение.</td>
</tr>
<tr>
<td>«Нужна предсказуемость бюджета»</td>
<td>Распределённая команда обходится <a href="https://quality-lab.ru/blog/shtat-gibrid-ili-autsors-testirovaniya-chestnyj-razbor-ekonomiki-qa-komand-v-2026/">дешевле</a> московского найма, а смета и сроки фиксируются заранее. Вы платите за закрытый риск, а не за раздувание штата.</td>
</tr>
</tbody>
<]]></description>
<link>https://quality-lab.ru/blog/gotova-li-vasha-qa-sistema-k-vnedreniyu-cifrovogo-rublya/</link>
<pubDate>Wed, 10 Jun 2026 16:50:12 +0300</pubDate>
</item>
<item>
<title>Руководство по имитаторам для тестировщиков</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/guide-to-the-art-of-mocking.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/guide-to-the-art-of-mocking.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Штефан Дирнштофер (Stefan Dirnstorfer)<br /><strong><a href="https://www.ministryoftesting.com/articles/a-software-tester-s-guide-to-the-art-of-mocking" mce_href="https://www.ministryoftesting.com/articles/a-software-tester-s-guide-to-the-art-of-mocking" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><p>Моделирование реалистичных сценариев, в которых система может продемонстрировать свою устойчивость, — задача непростая. Но всё становится проще при правильном планировании и чётком понимании доступных вариантов, их стоимости и ограничений.</p>
<p>В этой статье описывается создание тестовых сценариев, которые могут поставить систему под угрозу в продакшене. Приходилось ли вам сталкиваться с дефектом, который сложно воспроизвести в тестовой среде? Если да, то, возможно, в этой статье вы найдёте идеи, которые помогут вам в этом.</p>
<p>Простые тестовые сценарии можно создать, выбрав конкретные входные значения. Однако сложные сценарии требуют тщательной оркестрации множества компонентов. Это может включать использование реалистичных данных, а также управление некорректно работающими компонентами, задержками и замедлениями. Когда все эти приёмы правильно комбинируются, вы можете воспроизвести условия, в которых ваше программное обеспечение показывает свою истинную силу.</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-tools/4492-a-software-tester-s-guide-to-the-art-of-mocking</link>
<pubDate>Tue, 09 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Археология автотестирования: SUnit, прародитель JUnit</title>
<description><![CDATA[<p>Михаил Ланкин, автор статей команды <a href="https://qatools.ru/?utm_campaign=blog-post&amp;utm_medium=partner&amp;utm_source=softwaretesting&amp;utm_content=link" mce_href="https://qatools.ru/?utm_campaign=blog-post&amp;utm_medium=partner&amp;utm_source=softwaretesting&amp;utm_content=link" target="_blank" style="">ТестОпс</a><br /><a href="https://habr.com/ru/companies/testops_tms/articles/979700/" mce_href="https://habr.com/ru/companies/testops_tms/articles/979700/" target="_blank" style="">Оригинальная публикация</a></p>
<p>Меня зовут Михаил, я технический автор, работаю с инструментами тестирования в команде ТестОпс. В какой-то момент мне стало интересно — а как получила распространение мысль о том, что разработчикам тоже надо писать тесты?</p><p>У меня было смутное представление о некотором тёмном «раньше», и условно-ограниченно-просвещённом «сейчас», когда мысль о том, что тестирование не должно жить отдельно от разработки, кажется, стала нормальной.</p><p>Мостик между этими двумя мирами — автотесты, они нужны и тестированию, и разработке. Фреймворк JUnit сознательно писали как можно более простым — <a href="https://sources.debian.org/data/main/j/junit4/4.10-3/doc/cookstour/cookstour.htm" mce_href="https://sources.debian.org/data/main/j/junit4/4.10-3/doc/cookstour/cookstour.htm" target="_blank">в первую очередь для того</a>, чтобы сделать его повседневным инструментом для разработчиков. Люди, <a href="https://habr.com/ru/companies/jugru/articles/580976/" mce_href="https://habr.com/ru/companies/jugru/articles/580976/">работавшие с первыми фреймворками автотестирования</a>, стали также авторами подходов экстремального программирования (XP) и разработки через тестирование (TDD) — т. е. подходов, настаивающих на том, что тестирование — это не «обязаловка», а интегральная часть разработки.</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-automation/4521-sunit</link>
<pubDate>Sun, 07 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Software Engineering Happiness Index 2025</title>
<description><![CDATA[<p><span style="font-size: medium;">&nbsp;</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZRReF_MU6HE1Ws2Ypvr8kjJnaK_Li1qn0JgEJ0B7u761D-UVUw0_S_uohGCi6-b7ce5Dg68812j-xml3hu66K2VFuworn0HxShgHac_6hXkwNfqOJDPzU9TKi5mLLg1yQp1kLH70sXMte0ZVUZOtTg6ELHaod4UsVoZPGBt_v2J-T1JP7X8oRsZwsV6sJ/s1254/ChatGPT%20Image%207%20%D0%B8%D1%8E%D0%BD.%202026%20%D0%B3.,%2006_28_56.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-size: medium;"><img border="0" data-original-height="1254" data-original-width="1254" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZRReF_MU6HE1Ws2Ypvr8kjJnaK_Li1qn0JgEJ0B7u761D-UVUw0_S_uohGCi6-b7ce5Dg68812j-xml3hu66K2VFuworn0HxShgHac_6hXkwNfqOJDPzU9TKi5mLLg1yQp1kLH70sXMte0ZVUZOtTg6ELHaod4UsVoZPGBt_v2J-T1JP7X8oRsZwsV6sJ/s320/ChatGPT%20Image%207%20%D0%B8%D1%8E%D0%BD.%202026%20%D0%B3.,%2006_28_56.png" width="320" /></span></a></div><p></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">"Лучше поздно, чем как тогда"</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">В конце 2024 и в конце 2025 я проводила небольшое исследование на предмет удовлетворенностью работой. И все руки не доходили оформить результат. Но наконец-то таки дошли. Вот <span class="s1" style="color: #1f6bc0;">тут</span><span class="Apple-converted-space">&nbsp; </span>по ссылке можно посмотреть/скачать небольшую инфографику.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Исследование состоит из вопросов:</span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">- Я знаю и понимаю цели моей компании.</span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">- У меня есть все необходимые ресурсы для достижения рабочих целей.</span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">- Я чувствую поддержку от коллег и руководителя.</span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">- Я удовлетворен(-а) своей работой ("я счастлив")</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Это упрощенный вариант, конечно же на нашу удовлетворенность работой влияет гораздо больше факторов. Но задача была дать быстрый инструмент рефлексии.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Если коротко - основное влияние на удовлетворенность дает знание целей компании, которое поддерживается ресурсами и поддержкой.<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Давайте углубим эти четыре вопроса, каким образом можно на них опереться для определения ближайших шагов для себя.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;"><b>Цели компании</b><b></b></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Может быть такое, что<span class="Apple-converted-space">&nbsp; </span>мое внимание меня подвело и я просто "пропустил мимо ушей". Определенно может. Вне зависимости от занимаемой позиции. На работе мы все взрослые люди, это не детский сад и не школа. Никто не обязан все разжовывать, класть нам в рот, да и еще помогать проглотить.<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Если вы руководитель, то с вас спрос вдвойне. Помним волшебную<span class="Apple-converted-space">&nbsp; </span>фразу "никто не живет в моей голове". То, что кажется очевидным и понятным вам, может быть совсем не очевидным для сотрудников. Каскадирование целей и донесение их до команды - одна из основных ваших задач.<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Итого:<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">- как сотрудник: задать вопрос руководителю.</span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">- как руководитель: определять цели команды и как они соотносятся с целями компании.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Вне зависимости от выполняемой роли - понимать свои профессиональные цели, и если это никак не бьется с целями команды и компании - делать выводы, и никого не винить. Так бывает. А если соотносится - выжимать из этого синергетический максимум, делать win-win масштабным и кайфовать.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;"><b>Ресурсы</b><b></b></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Задача руководителя - организовывать работу и в частности обеспечить необходимыми ресурсами сотрудников, банально убеждаться, что для поставленных задач у сотрудников есть все необходимое.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Задача профессионала - решать поставленные задачи. Если чего-то не хватает, о "чудо" - сказать об этом, а не ждать пока тебя спросят, что с задачей.<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;"><b>Поддержка</b><b></b></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Для меня это больше про "blameless culture": если что-то пошло не так, что-то не получилось, то идет проработка как так получилось и что нужно изменить в процессах, в работе, чтобы больше не повторять ошибок, а не поиск конкретного человека, которого во всем обвинят.<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Что если в работе встретилась какая-то преграда, человека не оставят один на один. Опять же не забываем просить о помощи, если она нужна.<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">А руководителю важно контролировать исполнение задач так, чтобы все шло к успеху.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;"><b>Удовлетворенность работой</b><b></b></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Как ни крути, работа занимает существенное время в нашей жизни. Да, у нас у всех разные потребности в части работы, разные желания того, как должна выглядеть наша работа. Вне зависимости от того, чего именно каждому из нас хочется от работы (или чего точно не хочется) - эмоционально чувствовать, что работа "в кайф", ну или хотя бы "не бесит" очень помогает по жизни идти более уверенным шагом.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span class="Apple-converted-space"><span style="font-size: medium;">&nbsp;</span></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;"><b>В заключении</b>: если что-то раздражает нас в других - скорее всего это бесит нас в нас же самих. Важно понимать, чего мы хотим, и видеть все возможности вокруг. Злиться и быть недовольным - нормально, раствориться в этом - нет.<span class="Apple-converted-space">&nbsp;</span></span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Отвечаем за себя во всех аспектах своей жизни и не забываем коммуницировать, а не надеяться на "это и так понятно", и не ждем, что нас должны понять здесь и сейчас, просто потому что мы что-то сказали. Донесение информации так, чтобы нас поняли - один из критериев профессиональности.</span></p><p class="p2" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 15px;"><span style="font-size: medium;"><br /></span></p><p class="p1" style="font-family: &quot;Helvetica Neue&quot;; font-feature-settings: normal; font-kerning: auto; font-language-override: normal; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: medium;">Интересной работы! С удовольствием в пятницу вечером отправляться в выходных, и с удовольствием в понедельник идти работать так как нравится вам!</span></p><p><span style="font-size: medium;"><br /><br /><br /></span><br /></p>]]></description>
<link>http://sqalife.blogspot.com/2026/06/software-engineering-happiness-index.html</link>
<pubDate>Sun, 07 Jun 2026 06:32:17 +0300</pubDate>
</item>
<item>
<title>Бюджетное тестирование облачных приложений: Testcontainers и LocalStack</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/testcontainers-and-localstack/testcontainers-and-localstack1.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/testcontainers-and-localstack/testcontainers-and-localstack1.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Фернандо Тексейра (Fernando Teixeira)<br /><strong><a href="https://www.ministryoftesting.com/articles/testing-cloud-applications-without-breaking-the-bank-testcontainers-and-localstack" mce_href="https://www.ministryoftesting.com/articles/testing-cloud-applications-without-breaking-the-bank-testcontainers-and-localstack" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><h1>Облачные приложения: текущая ситуация</h1>
<p>В наши дни многие корпоративные приложения работают в облаке и используют множество сервисов, доступных через облачных провайдеров. По состоянию на 2024 год 94 процента компаний по всему миру <a href="https://edgedelta.com/company/blog/how-many-companies-use-cloud-computing-in-2024" mce_href="https://edgedelta.com/company/blog/how-many-companies-use-cloud-computing-in-2024">в той или иной степени внедрили облачные вычисления</a>. Эти облачные сервисы включают виртуальные машины, файловые хранилища, очереди сообщений, базы данных, мониторинг, логирование, инструменты безопасности и многое другое.</p>
<p>Сегодня вы можете построить приложение, на 100 процентов работающее в облаке. Наиболее популярны сейчас облачные провайдеры AWS, Google Cloud и Azure. Именно эти трое во многом обеспечивают работу большинства облачных приложений. В 2023 году <a href="https://www.statista.com/statistics/1114926/enterprise-spending-cloud-and-data-centers/" mce_href="https://www.statista.com/statistics/1114926/enterprise-spending-cloud-and-data-centers/">компании потратили примерно 270 миллиардов долларов США на облачную инфраструктуру</a> — на 45 миллиардов больше, чем годом ранее.</p>
<p>Большинство облачных провайдеров взимают плату в зависимости от объёма использования сервисов. Чем больше вы используете сервисы провайдера, тем серьезнее будет счёт в конце месяца. Как правило, провайдеры всё ещё предлагают бесплатный тариф, но при превышении определённого лимита вам всё равно придётся платить. Проблема в том, что многие компании сильно зависят от этих сервисов и активно их используют, из-за чего сложно оставаться в рамках лимитов. <a href="https://www.g2.com/articles/cloud-cost-management-statistics" mce_href="https://www.g2.com/articles/cloud-cost-management-statistics">49 процентов компаний испытывают трудности с контролем затрат на облако, а 33 процента превышают бюджет на облако на 40 процентов</a>.</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-automation/4494-testcontainers-and-localstack</link>
<pubDate>Wed, 03 Jun 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>От вебинаров до биллинга: что нужно тестировать в EdTech на самом деле</title>
<description><![CDATA[<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":30088,"width":"334px","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/06/19b19624-525e-49c4-a51f-1f094dee5484-Photoroom_11zon.png" alt="Тестирование образовательных платформ" class="wp-image-30088" style="width:334px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/06/19b19624-525e-49c4-a51f-1f094dee5484-Photoroom_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/06/19b19624-525e-49c4-a51f-1f094dee5484-Photoroom_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/06/19b19624-525e-49c4-a51f-1f094dee5484-Photoroom_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/06/19b19624-525e-49c4-a51f-1f094dee5484-Photoroom_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted {"fontSize":"small"} --></p>
<pre class="wp-block-preformatted has-small-font-size">Если вы руководите EdTech‑продуктом, статья даст вам понимание, что и как обязательно нужно тестировать, на каких этапах и какие вопросы задавать своему QA (внутреннему или внешнему). 90% материала посвящено российскому рынку и реалиям, 10% – интересным кейсам от Coursera, Duolingo и других международных компаний.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>В среднестатистической российской онлайн‑школе «всё хорошо с QA» выглядит так: регресс зелёный, баги в Jira закрыты, тестировщик подтвердил готовность релиза. Накатывается новая фича – скажем, новый формат вебинара или групповой проверки домашек. <span class='font-weight-bold'>И вот в 19:55 в чате поддержки появляется первое сообщение: «У меня не открывается урок». Через минуту – уже 12 таких сообщений, через пять минут – 200. К 20:15 вебинар так и не запустился: на платформе по‑прежнему белый экран. </span>Начинается суматоха: методист тегает продакта, продакт – CTO, CTO – разработчика, разработчик – тестировщика. <span class='font-weight-bold'>Все в панике, но финансовые и репутационные потери уже не исправить.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Мы много лет помогаем компаниям из мира цифровых образовательных технологий выстраивать QA и не раз сталкивались с историями разного уровня фатальности. <span class='font-weight-bold'>Почти всегда проблема не в конкретных тестировщиках, а в самой системе</span>. Дело в том, что <span class='font-weight-bold'>EdTech тестируют как обычное веб‑приложение, не учитывая сложность продукта, специфическую нагрузку, особое поведение пользователей и серьезность последствий ошибок.</span> Если бы об этом писали в учебниках для джунов, мы бы не разгребали ситуации, где школа на 10 тысяч активных учеников живёт без автотестов, а единственный QA – методист, который тестирует как может в свободное от основной работы время (невыдуманные истории из практики коллег, увы).</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Чем EdTech отличается от «просто веба» с точки зрения тестирования?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'><em>Когда говоришь собственникам: «У вас не просто сайт с курсами, видео и оплатой», – они всегда смотрят с легким недоумением, искренне не понимая, зачем выделять отдельный QA‑подход для EdTech. Но на это есть 5 веских причин.</em></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'>Нагрузка в EdTech неравномерная. </span>У обычного интернет‑магазина пиковые часы – это, условно, вечер и выходные, с предсказуемым ростом в дни акций. У EdTech пик приходится на конкретные даты и время. К примеру, 19:00 МСК, понедельник, старт вебинара – на платформе одновременно оказываются 8 000 пользователей. К 19:01 их уже 11 000, к 19:03 – 14 000, и треть из них видит сообщение «Ой, что‑то пошло не так». Это не просто высокая нагрузка, а резкий удар. Если вы не тестируете систему именно так – с пиковыми всплесками и стремительным нарастанием числа пользователей, – вы не проверяете нагрузку по‑настоящему.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Особенная аудитория c нестандартным поведением, к тому же, довольно часто далёкая от IT. </span>В большинстве школ это: родители школьников (нервничают); сами школьники (легко отвлекаются); взрослые, проходящие переквалификацию (стесняются обращаться в поддержку и просто уходят). Любая ошибка здесь – не просто запись в системе отслеживания багов, а фраза «Всё тупит, я не буду здесь заниматься». Конверсия в обучение – критически важная метрика, и страдает она не из‑за громких сбоев, а из‑за банальных проблем с юзабилити. Поэтому тестировать пользовательский интерфейс в современных образовательных технологиях нужно обязательно.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>EdTech‑продукт – это целая экосистема: </span>лендинг, личные кабинеты ученика и родителя, кабинеты методиста и преподавателя, админ‑панель, CRM, биллинг, интеграции с эквайрингом, мессенджерами и видеоплатформой, мобильное приложение, иногда desktop‑плеер для скачанных уроков или даже отдельный класс с интерактивной доской. Всё это должно работать без сбоев. Стандартное функциональное тестирование веб‑приложения здесь не поможет, так как у вас не одно приложение, а сложная взаимосвязанная система.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Контент – это часть продукта.</span> В обычном SaaS пользователь сам вводит данные, и QA их не затрагивает. В EdTech контент – это база: видео, тексты, тесты, интерактивные задания и тренажёры. Каждый новый курс – это новый набор данных, который должен корректно отображаться, воспроизводиться и оцениваться. Когда методисты сообщают: «Мы загрузили 12 модулей нового курса», – для QA это сигнал к регрессионному тестированию. Например, в одном из модулей может оказаться видео с нестандартной кодировкой, которое не загрузится на старом Android‑планшете.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Цена ошибки в EdTech измеряется не деньгами.</span> В финтехе ошибка грозит потерей средств клиента и комплаенс‑рисками, а в EdTech – пропущенным уроком перед ЕГЭ. Деньги можно вернуть, но упущенное занятие за две недели до экзамена (и доверие к вам) – нет. Поэтому критичность дефектов нужно оценивать в категориях обучения, а не просто в функциональности.</li>
<p><!-- /wp:list-item --></ol>
<p><!-- /wp:list --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Раз уж заговорили о критичности – забудьте про разделение «бизнес-критичный, не критичный, минорный». В тестировании EdTech-решений мы обычно настаиваем на трёх осях: критичность для обучения (срывает ли это занятие?), массовость (один пользователь или 30%?), обратимость (можем ли мы откатить эффект?).</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:image {"id":30087,"width":"272px","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/06/10e698ce-1770-49f3-bbb9-1327142fba84-Photoroom_11zon.png" alt="Тестирование образовательных платформ" class="wp-image-30087" style="width:272px;height:auto" title="Тестирование образовательных платформ" srcset="https://quality-lab.ru/wp-content/uploads/2026/06/10e698ce-1770-49f3-bbb9-1327142fba84-Photoroom_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/06/10e698ce-1770-49f3-bbb9-1327142fba84-Photoroom_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/06/10e698ce-1770-49f3-bbb9-1327142fba84-Photoroom_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/06/10e698ce-1770-49f3-bbb9-1327142fba84-Photoroom_11zon-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 {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0">На пересечении этих осей легко договариваться с разработкой о приоритетах. <span class='font-weight-bold'>«У нас P1, всё критично»</span> – это разговор ни о чём<span class='font-weight-bold'>. «Это срывает занятие у 30% активной аудитории и при этом необратимо»</span> – уже конкретная проблема.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">7 контуров качества EdTech платформ</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><em><span class='font-weight-bold'>Когда речь идет о тестировании образовательных сервисов, многие представляют себе регресс, проверку форм и пару нагрузочных тестов перед запуском. На практике этого недостаточно. Пользователям всё равно, где произошел сбой – если они решат, что продукт сырой, то уйдут к конкурентам. Чтобы этого не случилось, нужно внедрить зрелую стратегия тестирования, которая покроет 7 контуров качества.</span></em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Контур №1. Видео и стриминг: главный источник критических сбоев в EdTech </h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Видео – это сердце большинства EdTech проектов. Записанные уроки, живые вебинары, гибридные форматы. И если видеоматериалы недоступны, то бизнес стоит. Вот распространённые ошибки.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Тестируют видео не на тех файлах.</span> Команда QA проверяет плеер на стенде – с «эталонным» видеофайлом, который, разумеется, воспроизводится без проблем. Но в прод курсы загружают методисты и тренеры: файлы отличаются кодеками, частотой кадров и структурой. Эту вариативность часто не учитывают. Решение простое, хоть и трудоемкое: создать тестовую библиотеку из 30–50 реальных файлов из продакшена&nbsp; – из разных эпох и от всех подрядчиков. Каждый релиз плеера или транскодера нужно прогонять через всю библиотеку.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Игнорируют реалии российского рынка. </span>С 2022 года стриминг в РФ работает в особых условиях: часть международных контент‑провайдеров недоступна или функционирует нестабильно. Многие пользователи в регионах пользуются 3G – например, у условного «Б‑оператора» скорость в лучшем случае достигает 2 Мбит/с. Если тестировать только на офисном гигабитном соединении, картина будет нереалистичной. Обязательно проводите throttling‑тесты – искусственно ограничивайте полосу пропускания. Проверьте три сценария: «плохой 3G», «средний 4G» и «хороший Wi‑Fi». Так вы поймёте, как работает адаптивный битрейт, что показывает плеер при падении скорости и корректно ли возобновляется воспроизведение.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Не проверяют длительные сценарии. </span>Урок может длиться 45 минут, вебинар – 90 минут или даже два часа. Часто тестировщик убеждается, что видео запускается, и считает задачу выполненной. Но важно оставлять стрим на длительное время. Например, у одного из клиентов мы обнаружили проблему: через 57 минут просмотра в Safari звук рассинхронизировался с картинкой на 2–3 секунды – из‑за этого пользователь не понимал, что говорит лектор.</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":30090,"width":"233px","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/06/3e589c44-9459-4851-bc60-77bb7c2513c4-Photoroom_11zon.png" alt="Тестирование EdTech проектов" class="wp-image-30090" style="width:233px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/06/3e589c44-9459-4851-bc60-77bb7c2513c4-Photoroom_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/06/3e589c44-9459-4851-bc60-77bb7c2513c4-Photoroom_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/06/3e589c44-9459-4851-bc60-77bb7c2513c4-Photoroom_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/06/3e589c44-9459-4851-bc60-77bb7c2513c4-Photoroom_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Совет для CTO: попросите QA-команду показать вам матрицу «устройство × браузер × сеть × длительность» для видео. Если у них нет такой матрицы или она содержит меньше 15 комбинаций – у вас нет тестирования видео. У вас есть надежда (или вера?), что оно работает.<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">Контур №2. Тестирование производительности: выдержит ли платформа реальный учебный процесс</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Большинство EdTech компаний к которым мы приходим, уже имеют какой‑никакой опыт нагрузочного тестирования – обычно это разовый прогон в JMeter перед крупным запуском. Но такой подход редко отражает реальную картину работы продукта. Почему?</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Профиль нагрузки EdTech‑платформы специфичен, и его нужно тщательно проектировать. Мы выделяем <span class='font-weight-bold'>четыре типа всплесков</span> – каждый требует отдельного тестирования.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:table {"hasFixedLayout":false} --></p>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>Тип всплеска</th>
<th>Что происходит</th>
<th>Что особенно нагружается</th>
</tr>
</thead>
<tbody>
<tr>
<td>Старт вебинара</td>
<td>За 2–3 минуты заходит вся аудитория курса</td>
<td>Авторизация, коннекты, видеопоток</td>
</tr>
<tr>
<td>Дедлайн домашки</td>
<td>За час до 23:59 – массовая отправка работ, загрузка файлов</td>
<td>Хранилище, обработка заданий, очереди проверки</td>
</tr>
<tr>
<td>Запуск курса, распродажа</td>
<td>Пик регистраций и оплат за 1–2 часа</td>
<td>Биллинг, эквайринг, очереди писем, активация доступа</td>
</tr>
<tr>
<td>Массовая рассылка</td>
<td>Письмо «урок через 15 минут» – за минуту входят 10–20 тысяч</td>
<td>Балансировщики, кеш, базы данных</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph --></p>
<p>Сценарий должен повторять реальное поведение пользователей. Например: «4 000 пользователей заходят в личный кабинет, нажимают кнопку „Войти в вебинар“, переходят на страницу плеера, плеер устанавливает WebSocket‑коннект, открывается чат, начинается видеопоток, а через 12 минут 800 человек одновременно открывают вкладку с заданием». Создать такой тест непросто – это кропотливая, методичная работа.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Отдельно стоит упомянуть <span class='font-weight-bold'>chaos‑тестирование</span>. В классическом варианте оно подразумевает намеренный вывод из строя отдельных частей инфраструктуры, чтобы проверить устойчивость системы. В EdTech я предпочитаю более мягкий подход – так называемые деградационные тесты.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Что будет, если контент‑провайдер отключится в ключевой момент? Или если эквайринг начнёт тормозить и задерживать платежи – скажем, обработка вместо привычных 2 секунд займет целых 8? А если сервис рассылок выйдет из строя и не отправит пользователям уведомления о начале вебинара?</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">У зрелых продуктов должны быть заранее проработанные и протестированные сценарии реагирования на такие ситуации. Это гораздо лучше, чем в момент сбоя метаться по чатам, в панике успокаивать пользователей и создавать колоссальную нагрузку на отдел продаж и техподдержку.</pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Контур №3. Платежи, доступы и возвраты: самая чувствительная зона EdTech</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Разберём одну из самых проблемных областей – <span class='font-weight-bold'>биллинг в EdTech</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:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Двойная оплата. </span>Пользователь случайно нажимает «Оплатить» дважды и получает два списания. Хотя кейс кажется надуманным, по статистике на такие операции приходится 0,3–1,5% всех оплат в любой школе. Важно проверить, возвращает ли система деньги автоматически и отображается ли эта операция в интерфейсе администратора.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Оплата с задержкой. </span>Эквайринг работает медленно, пользователь решает, что платёж не прошёл, и повторяет попытку – в итоге средства списываются&nbsp; несколько раз.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Промокод плюс рассрочка. </span>Любимая комбинация, которую все забывают тестировать. Особенно если рассрочка через банк-партнёра. В нашей практике был случай,&nbsp; когда промокод 50% применялся к каждому платежу рассрочки отдельно, и человек платил половину суммы дважды по графику. Это вызвало серьезные проблемы в бухгалтерии.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Возврат за частично оплаченный курс. </span>Если ученик прошёл 3 из 10 модулей и запросил возврат, нужно убедиться, что сумма соответствует оферте, а запись о возврате есть в CRM и 1С.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Подписочная модель и отмены</span>. Если у вас подписка на доступ к контенту – что происходит при отмене? Доступ блокируется сразу или после завершения оплаченного периода? Что происходит с контентом, скачанным через мобильное приложение?&nbsp;</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Разные способы оплаты</span> (СБП, карты, остатки Apple Pay в РФ и др.) имеют свои нюансы – коды ошибок, поведение при таймауте, комиссии. Для каждого канала нужен отдельный набор тестов.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Если биллинг покрыт автотестами <span class='font-weight-bold'>меньше чем на 90%</span>, <span class='font-weight-bold'>то вы серьезно рискуете</span>. В EdTech автоматизация не опция, а необходимость: ручной прогон занимает около 16 часов, требует тестовых карт и согласования с эквайрингом. Проводить его перед каждым релизом практически нереально.</pre>
<p><!-- /wp:preformatted --></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":30089,"width":"284px","height":"auto","sizeSlug":"full","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/06/347d6b19-1397-4458-b62d-343846fbbf12-Photoroom_11zon.png" alt="Тестирование EdTech приложений" class="wp-image-30089" style="width:284px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/06/347d6b19-1397-4458-b62d-343846fbbf12-Photoroom_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/06/347d6b19-1397-4458-b62d-343846fbbf12-Photoroom_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/06/347d6b19-1397-4458-b62d-343846fbbf12-Photoroom_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/06/347d6b19-1397-4458-b62d-343846fbbf12-Photoroom_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></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">Доля мобильного трафика<sup data-fn="5e9d067a-39bf-4fc3-8649-8465f7fea9e1" class="fn"><a href="https://quality-lab.ru#5e9d067a-39bf-4fc3-8649-8465f7fea9e1" id="5e9d067a-39bf-4fc3-8649-8465f7fea9e1-link">1</a></sup> в российских EdTech-продуктах варьируется от <span class='font-weight-bold'>50 до 80%</span> в зависимости от ниши. Школьные платформы — мобилки <span class='font-weight-bold'>65–75%</span>. Платформы для взрослых (профессиональное обучение) — <span class='font-weight-bold'>50–60%</span>. Подготовка к ЕГЭ — <span class='font-weight-bold'>почти 80% мобилки в вечерние часы</span>. И при этом регулярно видим команды, где приложение тестируется «по остаточному принципу» — после того как закончили с вебом.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading {"level":4} --></p>
<h4 class="wp-block-heading">Что специфично для EdTech приложений в России?</h4>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Разнообразие устройств заметно шире, чем в Европе.</span> Там достаточно протестировать приложение на паре флагманских iPhone и трёх моделях Android, а у нас приходится учитывать старые Honor и Xiaomi, бюджетные Realme, а также российские планшеты на нестандартных сборках Android (например, поставленные в школы по госконтракту). Многие из этих устройств работают на прошлогодних версиях ОС без последних обновлений сервисов Google – и это тоже влияет на работу приложения. Если не тестировать на матрице <span class='font-weight-bold'>хотя бы из 12–15 реальных устройств</span> (от премиальных до бюджетных), часть пользователей будет сталкиваться с ошибками. Они вряд ли обратятся в поддержку – скорее просто уйдут или оставят негативный отзыв, что в перспективе снизит приток клиентов.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>RuStore и альтернативные сторы. </span>Некоторая часть аудитории не может скачать приложение из Google Play и использует RuStore, AppGallery или устанавливает APK‑файл напрямую. Версия для RuStore порой отличается от Play‑версии – например, может не поддерживать Firebase push‑уведомления и использовать собственные аналоги. Поэтому <span class='font-weight-bold'>важно тестировать каждую сборку отдельно, включая сценарий прямой установки APK</span>: там могут быть особенности с разрешениями и поведением приложения.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Офлайн-режим.</span> Если платформа позволяет скачивать уроки для офлайн‑просмотра, то нужен отдельный блок тестирования. Сценарий «скачал &#8212; сеть пропала &#8212; продолжаю смотреть &#8212; сеть вернулась &#8212; прогресс синхронизировался» имеет множество вариантов развития – и любой из них может дать сбой без систематической проверки. Например, бывает так: пользователь скачал урок, школа отозвала доступ из‑за неуплаты, но видео продолжает воспроизводиться с устройства. Мы сталкивались с таким багом в трёх школах – в одной он оставался нерешенным два года.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Push-уведомления.</span> В EdTech это конверсионный инструмент: «Ваш урок через 15 минут», «Не забудьте сдать домашку», «Преподаватель проверил работу». Если уведомления не доходят, то снижается удержание аудитории. <span class='font-weight-bold'>Тестировать их непросто: нужны реальные устройства и сертификаты APNS/FCM, а также проверка на сотнях уведомлений за раз.</span> Особенно важно тестировать на разных брендах – Huawei, Xiaomi и Samsung по‑разному управляют фоновыми процессами, из‑за чего уведомления могут не приходить, если система принудительно выгрузила приложение.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Контур №5. ПДн, права доступа и безопасность: базовый минимум для EdTech </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">EdTech‑школы работают с персональными данными несовершеннолетних, а значит, подпадают под особо строгий регуляторный режим. Вот что советует проверять наш ведущий тестировщик с 13‑летним опытом и бывший практикующий юрист.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":30092,"width":"209px","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/06/7bc570cb-5491-403f-bced-e28e58967a8e-Photoroom_11zon.png" alt="QA EdTech проектов" class="wp-image-30092" style="width:209px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/06/7bc570cb-5491-403f-bced-e28e58967a8e-Photoroom_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/06/7bc570cb-5491-403f-bced-e28e58967a8e-Photoroom_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/06/7bc570cb-5491-403f-bced-e28e58967a8e-Photoroom_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/06/7bc570cb-5491-403f-bced-e28e58967a8e-Photoroom_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></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>Следует подтвердить локализацию серверов. Хотя это инфраструктурный вопрос, QA‑команда должна в рамках регрессионного тестирования убедиться, что все чувствительные данные обрабатываются на серверах в РФ.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Контроль доступов внутри платформы. Например, может ли преподаватель курса А получить доступ к данным ученика из курса B, к которому не имеет отношения? Тест на «горизонтальную эскалацию прав» обязателен: он выявляет риски несанкционированного доступа.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Важно проверить безопасность для неавторизованных пользователей. Может ли гость по прямой ссылке открыть чужой урок, профиль или переписку в чате? Такие уязвимости нередко встречаются – хотя их редко ищут целенаправленно.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Всё это не полноценный пентест, а базовый набор проверок, который нужно выполнять при каждой регрессии. При этом полноценный пентест тоже необходим – для зрелой платформы его стоит проводить хотя бы раз в год.</pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Вопросы безопасности и соответствия требованиям законодательства настолько объемны, что заслуживают отдельного разговора. В конце статьи мы дадим ссылку на подробный материал о комплаенс-тестировании.</span></p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Контур №6. Интерфейс глазами ученика, а не разработчика</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":30091,"width":"270px","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/06/6c586696-a9ca-4046-8b12-e3c4b0543a39-Photoroom_11zon.png" alt="QA EdTech проектов" class="wp-image-30091" style="width:270px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/06/6c586696-a9ca-4046-8b12-e3c4b0543a39-Photoroom_11zon.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/06/6c586696-a9ca-4046-8b12-e3c4b0543a39-Photoroom_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/06/6c586696-a9ca-4046-8b12-e3c4b0543a39-Photoroom_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/06/6c586696-a9ca-4046-8b12-e3c4b0543a39-Photoroom_11zon-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"verticalAlignment":"center"} --></p>
<div class="wp-block-column is-vertically-aligned-center"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">В EdTech почти не тестируют одну очень важную вещь – «обучаемость» интерфейса, то есть его способность помочь ученику получить нужные знания. Это зона на стыке QA, UX‑исследований и педдизайна. </pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Вот сценарии, которые мы обычно просим команду протестировать вживую, на реальных представителях ЦА.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Первая сессия нового ученика.</span> Зарегистрировался, оплатил, зашёл – может ли он за 5 минут найти своё первое занятие и начать учиться? Сколько раз перешёл по интерфейсу впустую? Где запнулся?</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Возврат после паузы.</span> Если ученик не заходил на платформу две недели, система должна помочь ему сориентироваться – подсказать, на чём он остановился.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Сдача домашки.</span> Сколько шагов требуется, видно ли, что работа отправлена, приходит ли подтверждение?&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Запрос помощи.</span> Ученик не понял тему – как он может задать вопрос преподавателю, методисту, поддержке? Сколько кликов до результата?</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Сценарий «родитель проверяет ребёнка».</span> Может ли родитель за две минуты увидеть прогресс, посещения, оценки?</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Маленькая ремарка. Юзабилити-тестирование на сотрудниках школы – это самообман. Они знают продукт, помнят, куда нажимать, и не споткнутся там, где реальный человек. Найдите 5–7 представителей целевой аудитории, попросите их выполнить ваши сценарии вслух и запишите. Это даст вам данных больше, чем три месяца внутренних обсуждений.</pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>О том, как проводить юзабилити-тестирование, находить реальные барьеры и превращать пользовательский опыт в конкурентное преимущество, мы подробно рассказали в отдельном материале. Ссылку на статью оставим в конце.&nbsp;</span></p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Контур №7. Контент как часть продукта: почему его тоже нужно тестировать </h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Контент в EdTech – часть продукта, а его публикация равнозначна релизу. С точки зрения управления качеством каждый новый курс должен проходить приемочное регрессионное тестирование перед запуском.</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 --></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:preformatted --></p>
<pre class="wp-block-preformatted">В половине школ, с которыми мы начинали работать, такого тестирования не было. Методисты сами собирали курс, сами его проверяли – и сразу запускали в прод. В результате первая когорта учеников обнаруживала 20–30 проблем, которые приходилось устранять уже «на живых людях». Это не самый профессиональный подход. При этом исправить ситуацию несложно: <span class='font-weight-bold'>достаточно разработать чёткий чек‑лист и выделить ответственного, который будет прогонять его перед публикацией каждого курса</span>.</pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Что должно быть в зрелой QA-стратегии EdTech-платформы?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Соберем теперь все вышесказанное в <span class='font-weight-bold'>чек-лист для CTO или CEO</span>. Если вы можете уверенно поставить галочку напротив каждого пункта – поздравляем, у вас есть система. Если нет – вы нашли точки роста.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">На уровне процессов</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Описана матрица критичности дефектов с осями «обучение/массовость/обратимость».</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Есть документированная стратегия тестирования с прописанными контурами (видео, нагрузка, биллинг, мобилка, безопасность, юзабилити, контент).</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Каждый релиз проходит регрессию по чек-листу всех 7 контуров.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Перед публикацией каждого нового курса проходит приемочный регресс контента.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Команда QA участвует в продуктовых обсуждениях ещё до того, как начинают писать технические спецификации.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">На уровне инструментов</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Автотесты для биллинга – обязательны, особенно для критических сценариев.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Автотесты на основные пользовательские пути (вход, начало урока, сдача домашки).</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Нагрузочные тесты должны учитывать реальный профиль нагрузки – а не просто «1000 пользователей на главной».&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Для мобильного тестирования нужна матрица из минимум 12–15 моделей устройств.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Регулярные throttling-прогоны на медленных сетях.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Тестовая библиотека видео из реального продакшена.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">На уровне команды</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>В команде есть специалист или группа, отвечающая за автоматизацию тестирования.&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>В команде есть человек, отвечающий за нагрузочное тестирование (либо это умеет основной QA).</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>QA-команда умеет тестировать мобильные приложения, а не только веб и отдает приоритет тестированию той платформы, которая популярна среди вашей аудитории.</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">Собственная команда или аутсорс: что выбрать EdTech-компании?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Мы бы соврали, если бы сказали, что аутсорс – всегда лучший вариант. Это не так. У in‑house‑команды есть весомые преимущества: глубокое понимание контекста, постоянная связь с разработчиками, накопленные знания о продукте и единая корпоративная культура. Если в разработке задействовано более 200 человек, а продукт уже стабилен, то собственная QA‑команда – логичный выбор. Мы не затрагиваем экономический аспект: в 2026 году он заметно изменился, и мы сами часть административных процессов ради экономии отдали на аутсорс профессионалам. Но это тема для отдельной статьи.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>При этом, в EdTech есть ряд ситуаций, где аутсорс работает реально лучше.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Ситуация 1. </span><span class='font-weight-bold'>Быстрый рост школы при нехватке QA‑специалистов.</span> Типичная картина: 30 разработчиков и всего 2 тестировщика, которые не справляются с нагрузкой. Нанять ещё 5 человек – это 2–3 месяца на поиск и адаптацию плюс риск, что не все приживутся. Аутсорс решает проблему за 1–2 недели – не как постоянное решение, а как временная мера, пока формируется своя команда.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Ситуация 2. Нужны редкие компетенции.</span> Нагрузочное тестирование. Безопасность. Автоматизация мобилки. Каждая из этих компетенций требует одного-двух узкоспециализированных спецов. Содержать в штате трёх инженеров под три направления, если они нужны не на 100% времени – дорого. Аутсорс под конкретное направление обходится в разы дешевле.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Ситуация 3. Пиковая нагрузка на тестирование.</span> Перед началом учебного года, запуском нового курса или редизайном объем тестирования возрастает в 3–5 раз на 1–2 месяца. In‑house‑команда в такие периоды перегружена, а потом простаивает. Аутсорс позволяет гибко масштабировать ресурсы под текущие задачи.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Ситуация 4. Нужен взгляд со стороны. </span>Когда команда долго работает с продуктом, она может не замечать очевидных проблем. Внешний QA‑специалист подходит к тестированию непредвзято и выявляет то, что для внутренних сотрудников стало «нормой». Это особенно важно при аудите процессов и подготовке к масштабированию.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Ситуация 5. Юзабилити-исследования.</span> Тестировать продукт на своих сотрудниках – мы уже договорились – самообман. Аутсорсер, у которого собран реальный пул респондентов из ЦА, делает это в разы быстрее и качественнее, чем внутренняя команда, которая каждый раз заново ищет учеников.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Идеальная конфигурация для крупной EdTech-школы – это, как правило, гибрид. 1–2 инхаус-QA в каждой продуктовой команде, которые знают свой контекст, плюс внешний партнер на нагрузку, мобильную автоматизацию, юзабилити и пиковые работы.</pre>
<p><!-- /wp:preformatted --></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'><em>Если вы решили рассматривать аутсорс тестирования – вот вопросы, по ответам на которые сразу станет понятно: перед вами серьёзная компания и надёжный партнёр или вам продают джунов в красивой обертке.</em></span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol class="wp-block-list"><!-- wp:list-item --></p>
<li>Покажите 2–3 реальных кейса с EdTech-продуктами или платформами с похожим профилем нагрузки. Без названий, под NDA – нормально, но цифры и подходы должны быть.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Какой у вас типовой подход к нагрузочному тестированию EdTech? Какие инструменты используете? Какие профили проектируете?</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>На скольких реальных устройствах вы можете тестировать мобильное приложение прямо сейчас, без закупки?</li>
<p><]]></description>
<link>https://quality-lab.ru/blog/ot-vebinarov-do-billinga-chto-nuzhno-testirovat-v-edtech-na-samom-dele/</link>
<pubDate>Tue, 02 Jun 2026 18:15:55 +0300</pubDate>
</item>
<item>
<title>Как мы создали новый тестовый фреймворк, адаптируемый к росту проектов</title>
<description><![CDATA[<p>Меня зовут Анатолий Бобунов, и в&nbsp;EXANTE я SDET&nbsp;— Software Development Engineer in Test. В&nbsp;последние несколько лет я развивал тестовую архитектуру для&nbsp;бэкенд‑сервисов компании.</p><p>Наш тестовый фреймворк изначально создавался как&nbsp;единая платформа для&nbsp;тестирования нескольких backend‑сервисов. По&nbsp;мере роста системы увеличивалось и количество сервисов, каждый из&nbsp;которых приносил свою специфичную логику, требования к&nbsp;клиентам, данным и подготовке окружения. Эти требования не&nbsp;всегда укладывались в&nbsp;существующую архитектуру. В&nbsp;результате появлялись локальные обходные решения, которые решали конкретную задачу, но&nbsp;обходили архитектурные ограничения.</p><p>Со временем такие решения начали накапливаться. Разные сервисы использовали разные паттерны для&nbsp;HTTP‑клиентов, ретраев, подготовки данных и валидации ответов. Общие абстракции постепенно размывались, а&nbsp;направление зависимостей становилось менее очевидным. Дополнительно ситуацию усиливали срочные задачи, которые требовали&nbsp;быстрых изменений без&nbsp;полноценного архитектурного пересмотра. Это приводило к&nbsp;появлению временных решений, которые затем становились постоянными.</p><p>Фреймворк продолжал работать и покрывал сценарии тестирования, но&nbsp;его развитие замедлялось. Добавление нового сервиса требовало всё больше исключений, интеграция новых инструментов становилась сложнее, а&nbsp;изменения в&nbsp;базовых компонентах затрагивали несвязанные части системы. В&nbsp;какой‑то момент стало очевидно, что&nbsp;текущая архитектура перестала масштабироваться вместе с&nbsp;количеством сервисов.</p><p>В&nbsp;этой статье я расскажу, почему мы решили создать новую архитектурную модель, какие принципы легли в&nbsp;её основу и как&nbsp;мы подготовили фреймворк к&nbsp;работе с&nbsp;SDK и AI‑инструментами.</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-automation/4519-test-framework</link>
<pubDate>Sun, 31 May 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Полезные навыки тестировщиков, юз-кейсы внедрения ИИ и TestContainers, принципы и инструкции для успешной автоматизации, и многое другое: самые интересные новости тестирования за февраль-май 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-738" mce_href="https://www.software-testing.ru/component/acymailing/archive/view/listid-1-newsletter/mailid-738" target="_blank">по ссылке.</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://software-testing.ru/news/4525-mail-may</link>
<pubDate>Thu, 28 May 2026 15:14:35 +0300</pubDate>
</item>
<item>
<title>Штат, гибрид или аутсорс тестирования: честный разбор экономики QA-команд в 2026</title>
<description><![CDATA[<p><!-- wp:columns {"verticalAlignment":null} --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":29879,"width":"318px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-%D0%BC%D0%B0%D1%8F-2026-%D0%B3.-16_42_36-Photoroom-1-1024x1024.png" alt="Аутсорс тестирования" class="wp-image-29879" style="width:318px;height:auto" title="Аутсорс тестирования" srcset="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_42_36-Photoroom-1-1024x1024.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_42_36-Photoroom-1-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_42_36-Photoroom-1-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_42_36-Photoroom-1-768x768.png 768w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_42_36-Photoroom-1.png 1254w" 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:paragraph --></p>
<p><span class='font-weight-bold'>Это не рекламный текст. Здесь чистая математика. </span>Передо мной не стоит задачи уговорить вас выбрать аутсорс и подписать с нами договор до конца квартала. Мне важно, чтобы вы оценили свою внутреннюю экономику с открытыми глазами, а не «потому что все так делают» или «в интернете написано». <span class='font-weight-bold'>В конце статьи я прикрепил <a href="https://quality-lab.ru#calculator">калькулятор</a>, где можно посчитать реальные затраты на QA, – и это очень отрезвляет.</span></p>
<p><!-- /wp:paragraph --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>2026 – это рынок нанимателя. Впервые за много лет. Мидл‑ручник в Москве сегодня закрывается на <span class='font-weight-bold'>110 000 ₽ в месяц</span>, и это уже <span class='font-weight-bold'>не региональная, а реальная столичная вилка из вакансий</span>, которые мы видим каждый день в HH и у себя в почте. Параллельно крупные продуктовые компании сокращают QA‑команды и режут косты на всём, до чего дотягиваются руки финансовых директоров (CFO). <span class='font-weight-bold'>Все ищут, где сэкономить, не потеряв в качестве. </span>Мы – не исключение: в этом году, всё оценив и взвесив, отдали свою «административку» на аутсорс (да, мы тоже осознали, что долго считали против себя).</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>А ещё недавно нас пустили в бизнес‑экономику нескольких клиентов – посмотреть, как формируется реальная стоимость их QA‑команд.<span class='font-weight-bold'> И я собрал всё, что мы увидели, чтобы прямо сейчас разложить по полочкам.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Почему так трудно посчитать затраты правильно?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Большая часть статей в интернете на тему «аутсорс vs инхаус» страдает одним и тем же: они сравнивают <span class='font-weight-bold'>зарплату штатного сотрудника</span> со <span class='font-weight-bold'>ставкой аутсорс‑команды</span>. Это всё равно что сравнивать стоимость литра бензина со стоимостью поездки на такси. Цифры разные, выводы – бесполезные.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Чтобы сравнение было честным, нужно сравнивать:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Полную стоимость владения штатным тестировщиком</span> (TCO – total cost of ownership) – со всеми накладными расходами;</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> Потому что час спящего на встрече тестировщика и час реально пишущего тест-кейсы – это разные часы, хоть вы и платите по факту за оба.&nbsp;&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p>Дисклеймер для CFO, читающего через плечо менеджера: <span class='font-weight-bold'>цифры в этой статье – медианные по рынку Москвы на январь – апрель 2026.</span> По вашему конкретному проекту они могут отличаться. Не верьте никому на слово, включая меня. Посчитайте свои.</p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Зарплата – это всего лишь треть стоимости сотрудника</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Самая частая ошибка, которую я вижу: руководитель в Excel пишет <span class='font-weight-bold'>«мидл = 110 000 ₽»</span> и сравнивает это с любой другой цифрой. Это неправильная отправная точка. <span class='font-weight-bold'>Реальная стоимость сотрудника складывается из четырёх слоёв</span>, и зарплата – только первый из них.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Слой 1. Прямые выплаты «в лоб»</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'><em>Это то, что видно сразу.</em></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> 110 000 ₽ – типичная вилка мидла-ручника в Москве на начало 2026 года;&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>НДФЛ (13–15%):</span> 16 400 ₽ – да, формально платит сотрудник, но из «грязной» суммы, которую начисляет работодатель;&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Страховые взносы (≈30% от грязной зарплаты):</span> 37 920 ₽ – пенсионный фонд, ОМС, соцстрах. Это уже из кармана компании.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Итого: <span class='font-weight-bold'>164 320 ₽/месяц</span>. <br>Уже не 110 000, правда?</pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Слой 2. Рабочее место и инфраструктура</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'><em>Даже если у вас полностью удалённая команда, инфраструктура всё равно стоит денег. Если у вас офис – затрат ещё больше.</em></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> ~3 500 ₽/месяц (хороший ноут на 180 тыс. + монитор + мышь, амортизация на 3 года).</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Лицензии на софт</span> (TestRail/Allure TestOps, Jira, Confluence, Postman Pro, BrowserStack, антивирус, корп. офис): ~6 000–10 000 ₽/месяц на человека.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Офис</span> (если есть): аренда + клининг + чай-кофе-печенье в Москве ~15 000–25 000 ₽/месяц на одно рабочее место.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Корпоративная связь, сервера для тестовых сред, внутренние сервисы:</span> ~2 000 ₽/месяц на человека.&nbsp;</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Берём осторожно для удалённого формата: <span class='font-weight-bold'>+12 000 ₽/месяц</span>. <br>Для офисного – смело <span class='font-weight-bold'>+30 000 ₽/месяц</span>. </pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":29880,"width":"350px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-%D0%BC%D0%B0%D1%8F-2026-%D0%B3.-16_51_26-Photoroom-1-1024x1024.png" alt="Аутсорс тестирования" class="wp-image-29880" style="width:350px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_51_26-Photoroom-1-1024x1024.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_51_26-Photoroom-1-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_51_26-Photoroom-1-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_51_26-Photoroom-1-768x768.png 768w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_51_26-Photoroom-1.png 1254w" 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>те же TestRail/Jira/Confluence/Allure нужны и аутсорс-команде. Но у нормального вендора <span class='font-weight-bold'>либо есть возможность купить дешевле, либо уже подобранные и обкатанные бесплатные альтернативы</span> (Qase Free, TestLink, YouTrack Free, Allure Report), которые он может развернуть клиенту, если тот не хочет тащить ещё одну подписку. <span class='font-weight-bold'>В штате каждую лицензию вы покупаете самостоятельно и за свои.</span></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Слой 3. HR‑цикл с помесячной разбивкой</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'><em>Это самый скрытый слой. Его невозможно увидеть в зарплатной ведомости, но он точно есть в P&amp;L.</em></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> в 2026 году: услуги рекрутингового агентства – 15–20% годового дохода (≈ 240 000 ₽), внутренний рекрутер – около 80 000–120 000 ₽ с учётом времени менеджеров на собеседования. Берём среднее: <span class='font-weight-bold'>150 000 ₽ за найм</span>;&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Срок закрытия вакансии</span> в Москве на начало 2026 – <span class='font-weight-bold'>1–2 месяца</span> от старта поиска до выхода человека на работу. И это при удачном раскладе;&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Адаптация (2-3 месяца до выхода на полную мощность):</span> сотрудник получает зарплату, но реально приносит ~50% пользы. Это потерянные ~165 000 ₽ за первые три месяца. В пересчёте на год – <span class='font-weight-bold'>~14 000 ₽/месяц</span>;&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Текучка:</span> средний срок жизни QA-мидла в одной компании в 2025–2026 гг. – 1,8–2,2 года. То есть каждые два года вы повторяете цикл «нашёл – адаптировал – обучил – потерял».</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Разбиваем затраты на наём (150 000 ₽) по 24 месяцам: <span class='font-weight-bold'>+6 250 ₽/месяц</span>. <br>Плюс адаптация: <span class='font-weight-bold'>+14 000 ₽/месяц</span>. <br>Итого: <span class='font-weight-bold'>~20 000 ₽/месяц</span>.</pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Слой 4. Управление, обучение, простои</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'><em>А вот это вообще никто не считает.</em></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> Тимлид/QA-лид тратит на одного мидла примерно 15–20% своего времени: 1:1, ревью, планирование, разбор инцидентов. Если ЗП тимлида на руки 200 000 ₽ (это TCO ~300 000 ₽), то 18% – это <span class='font-weight-bold'>~54 000 ₽/месяц</span> на каждого подчинённого мидла;&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Обучение, конференции, корпкультура:</span> 5 000–10 000 ₽/месяц на человека в среднем по компаниям. <span class='font-weight-bold'>Берём 7 000 ₽;</span>&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Оплачиваемые непродуктивные дни:</span> 28 дней отпуска + примерно 10 дней больничных + государственные праздники + отгулы = ~58 дней в году, или ~22% оплаченного, но нерабочего времени. Это не «расход сверху», это уже учтено в зарплате, но критично для пересчёта в продуктивные часы (см. ниже);&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Простои между задачами.</span> По нашим замерам на десятках проектов клиентов, штатный QA-инженер реально выполняет тестовые задачи <span class='font-weight-bold'>5–6 часов из 8-часового дня</span>. Остальное – встречи, ожидание сборок, ожидание ответов от разработчика, скроллинг новостей. Это <span class='font-weight-bold'>30–35% непродуктивного времени</span> внутри рабочего дня.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Менеджмент и обучение: <span class='font-weight-bold'>+61 000 ₽/месяц</span>.</pre>
<p><!-- /wp:preformatted --></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">
<thead>
<tr>
<th>Статья расходов</th>
<th>Сумма, ₽/мес</th>
</tr>
</thead>
<tbody>
<tr>
<td>Оклад на руки</td>
<td>110 000</td>
</tr>
<tr>
<td>НДФЛ</td>
<td>16 400</td>
</tr>
<tr>
<td>Страховые взносы (~30%)</td>
<td>37 920</td>
</tr>
<tr>
<td>Рабочее место, лицензии, инфраструктура</td>
<td>12 000</td>
</tr>
<tr>
<td>Размазанная стоимость найма</td>
<td>6 250</td>
</tr>
<tr>
<td>Период адаптации (амортизировано)</td>
<td>14 000</td>
</tr>
<tr>
<td>Менеджмент (доля времени тимлида)</td>
<td>54 000</td>
</tr>
<tr>
<td>Обучение, конференции</td>
<td>7 000</td>
</tr>
<tr>
<td><span class='font-weight-bold'>ИТОГО полная стоимость владения (TCO)</span></td>
<td><span class='font-weight-bold'>257 570</span></td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>257,5 тысяч из объявленных 110 тысяч на руки.</span> <span class='font-weight-bold'>Я не зря писал, что зарплата – это треть стоимости.&nbsp;</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Если у вас офисный формат, прибавьте сверху ещё <span class='font-weight-bold'>18 000–25 000 ₽/месяц</span> за рабочее место. Получите <span class='font-weight-bold'>~280 000 ₽/месяц</span> на одного мидла-ручника.&nbsp;</pre>
<p><!-- /wp:preformatted --></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'><em>Теперь пересчитаем эти 257 тысяч в «час реальной работы», за который вы фактически платите.&nbsp;</em></span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В месяце ~21 рабочий день × 8 часов = 168 часов оплаченного времени. Но:&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Отпуск + больничные + праздники съедают + отгулы <span class='font-weight-bold'>~22% от года</span>. <span class='font-weight-bold'>Остаётся ~131 час оплаченного присутствия в месяц;&nbsp;</span></li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Внутри рабочего дня – встречи, ожидание сборок, переключения. <span class='font-weight-bold'>Реально на задачах – 5–6 часов из 8, то есть ~70% времени;</span></li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Итого: 131 × 0,7 = <span class='font-weight-bold'>~92 продуктивных часа в месяц</span>.&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Стоимость одного продуктивного часа штатного мидла-ручника:&nbsp;</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>257 570 / 92 ≈ 2 800 ₽/час</span></pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Не 110 000/168 = 654 ₽/час, как любят считать в Excel. А две тысячи восемьсот рублей</span>! За один час, в течение которого тестировщик реально что-то делает руками с вашим продуктом.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Считаем тем же способом затраты на аутсорсинг&nbsp;</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Сразу важная и честная оговорка, чтобы не выглядеть мошенником с калькулятором. Да, аутсорс-инженер – такой же живой человек, как и штатный. У него тоже бывают встречи, синки с менеджером, ожидание сборок, переключение контекста между задачами. Если он тратит на ваш проект 8 часов в день – из них реально продуктивных тоже будет ~70%. Это надо признать.</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>Оплачиваемый отпуск (28 дней);</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><span class='font-weight-bold'>Рыночные ставки аутсорс-тестирования в Москве на начало 2026 года для мидл-ручника:</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Малые компании без своей школы и экспертизы, без контроля качества: 900–1 100 ₽/час;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Средние и крупные провайдеры с гарантиями и собственной учебной базой: <span class='font-weight-bold'>1 200–1 450 ₽/час</span>;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Топ-вендоры с очень узкой специализацией (банки, телеком, embedded): 1 900–2 800 ₽/час.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>Беру для сравнения медианную ставку <span class='font-weight-bold'>1 300 ₽/час.</span> Чтобы получить от аутсорса те же <span class='font-weight-bold'>92 продуктивных часа в месяц</span>, что и от штатного сотрудника, я должен закупить у вендора примерно 131 час «присутствия инженера на проекте» (те же 70% будут продуктивны). <span class='font-weight-bold'>Итого:&nbsp; 131 час × 1 300 ₽ = ~170 300 ₽/месяц. </span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:table --></p>
<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>Параметр</th>
<th>Инхаус-мидл</th>
<th>Аутсорс-мидл</th>
</tr>
</thead>
<tbody>
<tr>
<td>Стоимость в месяц</td>
<td>257 570 ₽</td>
<td>~170 300 ₽</td>
</tr>
<tr>
<td>Продуктивных часов в месяц</td>
<td>~92</td>
<td>~92</td>
</tr>
<tr>
<td>Цена одного продуктивного часа</td>
<td>~2 800 ₽</td>
<td>~1 850 ₽</td>
</tr>
<tr>
<td>Время до старта работ</td>
<td>1–2 мес. поиска + 3 мес. адаптации</td>
<td>3–10 дней</td>
</tr>
<tr>
<td>Оплата отпуска/больничного</td>
<td>Да, 22% времени</td>
<td>Нет</td>
</tr>
<tr>
<td>Простой между проектами</td>
<td>Оплачиваете полностью</td>
<td>Не оплачиваете</td>
</tr>
<tr>
<td>Замена при увольнении/болезни</td>
<td>Снова 1–2 мес. найма + адаптация</td>
<td>3–14 дней, равноценный специалист</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Разница на одном мидле: <span class='font-weight-bold'>~87 000 ₽/месяц</span>, или <span class='font-weight-bold'>~1,04 млн ₽/год</span>. <br>На команде из пяти ручников – <span class='font-weight-bold'>~5,2 млн ₽/год</span>.</pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p>Это не маркетинг, а математика, которую мы применили и к себе, отдав бухгалтерию и административные процессы на аутсорс в 2026 году. Получилось сэкономить около 40% и при этом усилить экспертизу – потому что отдельная бухгалтерская компания знает про налоги больше, чем штатный главбух, который варится только в одной компании. Та же логика работает с тестированием.</p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Скорость замены QA-инженера</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'><em>Отдельно подсвечу пункт, который обычно недооценивают, но вот в реальной жизни (не в excel) он решает очень многое.</em></span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Сценарий А (инхаус).</span> У вас уходит мидл-ручник. Сегодня он подал заявление, через 14 дней его нет. Вы запускаете поиск:&nbsp;</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>1–1.5 недели</span> – описать вакансию, согласовать с HR, разместить, дождаться первых откликов;&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>2–4 недели</span> – отсмотр, собеседования, тестовые задания;&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>2 недели</span> – оффер, отработка на старом месте, выход;&nbsp;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>2–3 месяца</span> – онбординг и адаптация.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><span class='font-weight-bold'>Итого от заявления до полноценной замены: ~3–4 месяца.</span> <br>Всё это время – оголённое направление, перегруз команды, риск регрессов.</pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Сценарий Б (аутсорс).</span> Инженер вендора уходит (болеет, меняет проект). Вендор предлагает замену из <a href="https://quality-lab.ru/outstaff/">внутреннего пула</a>. У хорошего провайдера это <span class='font-weight-bold'>3–14 дней</span>, причём новый человек уже на старте подготовлен:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>прошёл онбординг-процесс</span> (чек-лист погружения в продукт, готовые шаблоны тест-документации);</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>получил контекст от предыдущего инженера</span> (обновлённую тест-модель, актуальные кейсы, известные особенности продукта);</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>имеет доступ к внутренней базе знаний </span>по уже разобранным аналогичным проектам.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Гибкость, которую Excel не покажет</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'><em>Деньги посчитать легко, а вот возможности, которые даёт аутсорс, – в сухой таблице так просто не отразить. Перечислю то, что в реальной жизни часто оказывается важнее ставки.&nbsp;</em></span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">1. Масштабирование под релизы</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Ситуация.</span> Релиз через две недели, обычно команда из 3 ручников справляется, но сейчас фича на полпродукта и регрессию надо за выходные. Что вы делаете?</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> пишете в чат менеджеру, на следующий день подключаются ещё 2 человека, после релиза они уходят на другой проект. Платите только за релизные дни.</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">2. Широкая экспертиза – суперсила, которую недооценивают&nbsp;</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Ситуация.</span> Джун-тестировщик упёрся в задачу по нагрузке. Он не знает JMeter, не понимает, как читать графики, не умеет анализировать GC-логи. Что происходит?</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> джун идёт к тимлиду (который и сам не нагрузочник). Они идут гуглить, проходят курсы, а вы теряете 2–3 недели, получая в итоге посредственный результат. Есть ещё вариант: заплатить консультанту за разовый аудит 200–400 тысяч, когда всё уже окончательно пошло не так.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Аутсорс:</span> джун пишет в чат внутреннего «совета экспертов» – и через час разговаривает с человеком, который последние 10 лет тестирует банковские системы под нагрузкой. Этот человек подключается на 4 часа, размечает, что и как делать, передаёт обратно джуну. Никаких отдельных контрактов и согласований. Всё уже включено.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":29881,"width":"384px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-%D0%BC%D0%B0%D1%8F-2026-%D0%B3.-16_45_05-Photoroom-1-1024x1024.png" alt="Аутсорс тестирования" class="wp-image-29881" style="width:384px;height:auto" title="Аутсорс тестирования" srcset="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_45_05-Photoroom-1-1024x1024.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_45_05-Photoroom-1-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_45_05-Photoroom-1-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_45_05-Photoroom-1-768x768.png 768w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_45_05-Photoroom-1.png 1254w" 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">Самое смешное, что такая экспертиза очень часто нужна на проектах час-два в месяц. Содержать в штате senior нагрузочника, senior security-тестировщика, senior мобильщика, senior автоматизатора и senior API-эксперта – это бюджет, на который у вас не наберётся столько работы. А в аутсорс-структуре узкоспециализированные тестировщики <a href="https://quality-lab.ru/cases/">постоянно практикуются</a> на 10–15 проектах сразу, при этом они доступны для каждого клиента «по запросу».<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">3. Обучение и прокачка скиллов&nbsp;</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Этот пункт для нашей компании принципиальный, потому что <span class='font-weight-bold'>у нас есть свой учебный центр, из которого за 16 лет выпустились более 7 000 QA‑инженеров</span> (многие из них сейчас в штате наших же конкурентов – мы этим тихо гордимся). И вот что это нам даёт на практике:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li>Если на проекте нужен новый навык – Selenide, K6, Playwright, тестирование смарт‑контрактов – мы не идём искать человека на рынке. Мы прокачиваем своего за 2–4 недели по внутренней программе, бесплатно для клиента.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>В инхаусе любая новая экспертиза &#8212; это либо найм за 1–2 месяца с трёхмесячной адаптацией, либо отправка человека на платное обучение (30–70 тысяч рублей), либо отказ от задачи.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">4. Минимизация человеческого фактора&nbsp;</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>В штате процессы зависят от Даши, уходящей в декрет, от Пети, который выгорел и нервно пишет заявление, от Серёжи, который болеет три недели подряд. Это нормально для любого работодателя. Но <span class='font-weight-bold'>вы имеете право минимизировать такие риски.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>В аутсорсе головная боль по замене лежит на вендоре</span>. Если человек заболел (уволился, просто плохо работает) – вам подберут альтернативу без оплаты «накладных расходов».</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">«Инхаус лучше, потому что&#8230;» – разбираем главные аргументы</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":29882,"width":"285px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-%D0%BC%D0%B0%D1%8F-2026-%D0%B3.-16_50_32-Photoroom-1-1024x1024.png" alt="Аутсорс тестирования" class="wp-image-29882" style="width:285px;height:auto" title="Аутсорс тестирования" srcset="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_50_32-Photoroom-1-1024x1024.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_50_32-Photoroom-1-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_50_32-Photoroom-1-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_50_32-Photoroom-1-768x768.png 768w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-25-мая-2026-г.-16_50_32-Photoroom-1.png 1254w" 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">Переходим к интересной части. Я регулярно слышу от руководителей одни и те же контраргументы против аутсорсинга тестирования. Хочу их разобрать честно – где они правы, а где поддерживают мифы из 2010-х.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Аргумент 1: «Экспертиза должна оставаться внутри»&nbsp;</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Что слышу:</span> «Если мы отдадим тестирование на аутсорс, через год у нас не останется никого, кто понимает продукт. А подрядчик уйдёт — и мы голые».</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>Реальность:</span> адекватный правильный аутсорс работает наоборот. Нормальный вендор изначально упаковывает всю работу так, чтобы можно было отвязать и вернуть проект заказчику в любой момент без потерь, поэтому система построена так:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>тест-документация</span> (стратегия, чек-листы, тест-кейсы) ведётся <span class='font-weight-bold'>в вашей системе</span> – TestRail, Allure TestOps, Qase, что у вас стоит. Не в его внутренних инструментах;</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> на встречах с вашим QA-лидом или менеджером (если с вашей стороны есть хоть один человек, контролирующий процесс);</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>документирование и хранение «скрытых знаний»</span> – тех самых нюансов продукта, которые обычно живут в голове одного сотрудника и теряются при его уходе. У вендоров это <span class='font-weight-bold'>обязательный процесс</span>.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Парадокс: <span class='font-weight-bold'>экспертиза чаще теряется в инхаусе, а не в аутсорсе</span>. Потому что в штате никто не заставляет ведущего инженера документировать каждый шаг.</pre>
<p><!-- /wp:preformatted --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Аргумент 2: «В штате люди душой за продукт, аутсорсерам всё равно»&nbsp;</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Что слышу:</span> «Полноценный член команды переживает за качество, а человек от агентства – отбыл часы и ушёл».</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>Реальность:</span> зависит не от формы трудоустройства, а от культуры — и вашей, и подрядчика. Если у вас в штате текучка 2 года и зарплаты ниже рынка, никакой «душевности» там тоже нет. И наоборот: у нас на проектах люди сидят по 3–5 лет, знают продукт клиента глубже, чем кто-либо в самой компании клиента, и переживают за релизы лично. Потому что:</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>. Один прокатанный продакшен – и заказчик уходит к конкурентной QA team;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>в нормальной аутсорс-компании <span class='font-weight-bold'>привязка инженера к проекту длинная – 1–3 года минимум</span>, не «месяц поработал и ушёл»;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>KPI инженера часто завязаны на качество найденных дефектов и удовлетворённость клиента</span>, а не на потраченные часы.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Аргумент 3: «Аутсорс не разбирается в нашем сложном домене»&nbsp;</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Что слышу: </span>«У нас уникальный продукт (тяжёлый банковский домен, специфический рынок). Внешним подрядчикам туда не зайти».</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>Реальность: </span>в первые 2–4 недели при привлечении внешней QA компании действительно могут быть трудности; ну ладно, бывают исключения – как‑то у нас был кейс тестирования, где только ТЗ состояло из 15 тысяч страниц (это не опечатка!), поэтому мы 2 месяца выходили на полную мощь.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Здесь всё зависит от вашей готовности дать вендору погрузиться в процессы и от его опыта в смежных областях. <span class='font-weight-bold'>Например, из 530+ проектов у нас 20% – банки и страховые, 15% – веб‑студии, 14% – телеком, 12% – соцсети, 11% – e‑commerce. </span>В нашей команде точно найдутся люди, которые уже работали на двух‑трёх проектах из вашей сферы.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Более того – вот неудобная для штата правда: <span class='font-weight-bold'>аутсорсер, который видел 15 банков, понимает «как принято в индустрии» лучше, чем штатный QA, который всю карьеру провёл в одном банке.</span> Просто потому, что у него выборка шире, так как внешнее тестирование программного обеспечения даёт больше опыта.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Аргумент 4: «Штатный сотрудник полностью под контролем»</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Что слышу:</span> «Я могу подойти и сказать &#171;сделай вот это срочно&#187;».</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>Реальность:</span> в нормальном аутсорс-договоре прописан SLA по времени реакции, и <span class='font-weight-bold'>для срочных задач это часы, а не дни.</span> Плюс есть менеджер, который снимает с вас часть управленческой рутины – а это <span class='font-weight-bold'>та самая нагрузка на тимлида в 18% его времени, которую мы посчитали выше (54 000 ₽/мес на каждого мидла)</span>. При независимом тестировании программного обеспечения эту работу делает аккаунт-менеджер вендора. Бесплатно для вас.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading">Аргумент 5: «Будут проблемы с конфиденциальностью»</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>Что слышу:</span> «Наши данные нельзя отдавать на аутсорсинг, у нас секретный продукт».</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f9f0"}}} --></p>
<p class="has-background" style="background-color:#e6f9f0"><span class='font-weight-bold'>Реальность: </span>NDA, договор с юридическим лицом, работа на ваших стендах через ваш же доступ (когда вендор не выгружает к себе ничего) закрывают более 90 % кейсов.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Действительно режимные истории – гостайна, банки уровня ТОП‑3 с особым контуром – это да, скорее инхаус (хотя мы и с ними работаем – чётко и ответственно, проходя все проверки ИБ). В остальных случаях это не аргумент против аутсорсинга, это вопрос грамотно оформленного NDA и контроля доступов.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading"><span class='font-weight-bold'>Когда инхаус объективно лучше?</span></h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'><em>Раз уж разобрали мифы, отдельно перечислю случаи, где штат реально и без оговорок выигрывает. Не упомянуть их – значит не быть до конца честным.</em></span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:table --></p>
<figure class="wp-block-table">
<table class="has-fixed-layout">
<thead>
<tr>
<th>Когда инхаус действительно лучше</th>
<th>Почему</th>
</tr>
</thead>
<tbody>
<tr>
<td>Очень секретный или режимный продукт</td>
<td>Гостайна, банки уровня ТОП-3 с особым контуром, оборонка – здесь даже идеальный NDA не закроет требований регулятора</td>
</tr>
<tr>
<td>Продукт-флагман, на котором держится 80%+ выручки и где есть «коммерческая тайна»</td>
<td>Стратегическая компетенция должна быть в штате. Это не про экономию, это про снижение бизнес-рисков</td>
</tr>
<tr>
<td>Очень длинный, сложный домен</td>
<td>Биллинг телекома, банковский core – погружение 1–2 года. Дешевле растить и удерживать своих</td>
</tr>
<tr>
<td>Абсолютно стабильная, прогнозируемая нагрузка без пиков</td>
<td>Если вам всегда нужны ровно 4 ручника и не больше – экономия от гибкости аутсорса меньше, чем накладные на коммуникацию с вендором.</td>
</tr>
<tr>
<td>Сильная инженерная культура, которую вы целенаправленно строите</td>
<td>Внутренние ритуалы, code review, общая ответственность за продукт – это плохо переносится через подрядчика</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:paragraph --></p>
<p><span class='font-weight-bold'><em>На наших проектах в 2025–2026 годах я вижу устойчивый тренд: директора перестают мыслить категорией «всё в штат» или «всё на аутсорс». Они строят гибридные QA-команды для обеспечения качества</em></span><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:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>В штате остаются: </span>QA‑лид (или 1–2 лида на продукт), 1–2 senior‑инженера – «хранители знаний» по основному домену, тест‑аналитики, отвечающие за тест‑стратегию.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>На аутсорс уходят:</span> массовая регрессия, написание и поддержка большого объёма тест‑кейсов, нагрузочные и security‑проверки, кросс‑браузерное и мобильное тестирование под пиковые релизы, экспертиза «по запросу».</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p>В такой модели вы держите <span class='font-weight-bold'>«стратегическую» экспертизу внутри </span>(тех людей, ради которых не жалко платить TCO более 350 тысяч рублей), а <span class='font-weight-bold'>«дополнительные руки» арендуете в рамках внештатного QA-проекта </span>– в зависимости от нужного в моменте объёма. Экономия на таких командах из 8 человек у наших клиентов – <span class='font-weight-bold'>25–40% годового бюджета на QA</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><span class='font-weight-bold'>Я обещал дать объективную картину, поэтому расскажу и про подводные камни. Потому что аутсорс услуг по тестированию программного обеспечения</span></em><em><span class='font-weight-bold'> – это не только солнечные единороги и сэкономленные миллионы.</span></em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>Выбор подрядчика без должной проверки &#8212; это лотерея.</span> Рынок аутсорса QA-услуг в РФ очень неоднородный. Есть компании, которые посадят на ваш проект студентов после двухнедельных курсов за 900 ₽/час с соответствующим качеством. <span class='font-weight-bold'>Защита:</span> запрашивать резюме всехпредлагаемых на проект людей, проводить с ними техсобеседования, прописывать в договоре уровень и опыт;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>коммуникационный оверхед на старте.</span> В первые 2–3 недели работы аутсорс-команда не понимает ваш продукт так же глубоко, как ваш штат. Это нормально. <span class='font-weight-bold'>Защита:</span> закладывайте период погружения и ресурсы на коммуникацию и не ждите магии с первого дня;</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li><span class='font-weight-bold'>зависимость от вендора при плохой документации.</span> Если вы передали 100% тестирования и подрядчик ленится оформлять артефакты – через год вы будете зависеть от него.<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">Сводная таблица инхауса и аутсорса тестирования&nbsp;</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'><em>Плюсы и минусы без розовых очков, да и без чёрных тоже.</em></span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:table --></p>
<figure class="wp-block-tab]]></description>
<link>https://quality-lab.ru/blog/shtat-gibrid-ili-autsors-testirovaniya-chestnyj-razbor-ekonomiki-qa-komand-v-2026/</link>
<pubDate>Wed, 27 May 2026 10:58:03 +0300</pubDate>
</item>
<item>
<title>Не просто «ручное тестирование»: ценные навыки тестировщиков</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/skills-of-software-testers.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/skills-of-software-testers.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Эди Стоукс (Ady Stokes)<br /><strong><a href="https://www.ministryoftesting.com/articles/more-than-just-manual-testing-recognising-the-skills-of-software-testers" mce_href="https://www.ministryoftesting.com/articles/more-than-just-manual-testing-recognising-the-skills-of-software-testers" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><h1>Почему я это пишу</h1>
<p>Если вы какое-то время работаете тестировщиком ПО или в разработке, вы, скорее всего, сталкивались с термином «ручное тестирование». Это выражение может вызывать бурные споры.</p>
<p>И дело не только в разных мнениях. Сам термин часто искажает суть тестирования. В худшем случае «ручное тестирование» создает вредный водораздел, обесценивая вклад человека и чрезмерно возвышая автоматизацию. В лучшем — умаляет значимость вдумчивых усилий тестирования.</p>
<p>В этой статье хочу обсудить, почему этот термин может быть вреден для ремесла тестирования, и предложить, как сместить фокус к более инклюзивному и точному пониманию того, что на самом деле делают тестировщики. Кто знает, исчезнет ли когда-нибудь термин «ручное тестирование», но попытаться мы можем и должны.</p>]]></description>
<link>https://software-testing.ru/library/around-testing/job/4493-the-skills-of-software-testers</link>
<pubDate>Mon, 25 May 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Как нагрузочное тестирование защищает бизнес от убытков?</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>О нагрузочном тестировании для менеджеров, продактов, маркетологов и основателей стартапов.&nbsp;В статье собрали всё, что нужно знать, чтобы задавать инженерам правильные вопросы и принимать решения на основе данных, а не интуиции.</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:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":29808,"sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large"><img fetchpriority="high" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/05/Frame-633_11zon-1024x1024.png" alt="Frame-633_11zon" class="wp-image-29808" srcset="https://quality-lab.ru/wp-content/uploads/2026/05/Frame-633_11zon-1024x1024.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/05/Frame-633_11zon-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/05/Frame-633_11zon-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/05/Frame-633_11zon-768x768.png 768w, https://quality-lab.ru/wp-content/uploads/2026/05/Frame-633_11zon.png 1080w" 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:paragraph {"align":"left"} --></p>
<p class="has-text-align-left">Третий клиент оказался другим. Сотрудник отдела маркетинга давнего партнёра – человек, который отвечает за планирование рекламных кампаний и хочет понимать, что произойдёт с продуктом во время запуска крупной акции. Для него технический разговор превратился в информационный шум. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"align":"left"} --></p>
<p class="has-text-align-left">И дело не в недостатке опыта – просто у человека совсем другой контекст: иные задачи, риски и даже профессиональная терминология.</p>
<p><!-- /wp:paragraph --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Мы провели для него краткий ликбез: рассказали о видах нагрузочного тестирования, объяснили, как интерпретировать результаты и как это связано с его работой. Произошло неожиданное: вместо одной услуги были заказаны две и теперь затраты на тестирование включены в маркетинговый бюджет клиента на постоянке – его проводят перед каждой крупной рекламной кампанией или акцией. А всё потому, что человек понял какие его профильные задачи решает тестирование производительности.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Для нас это тоже стало ценным опытом: мы смогли наладить взаимодействие между инженерами и маркетологами, добавить специальные имитации трафика с учётом особенностей их целевой аудитории и выработать совместный рабочий процесс.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'><em>Статья&nbsp;создана&nbsp;для&nbsp;тех,&nbsp;кому&nbsp;важно&nbsp;не&nbsp;просто почитать о том, что такое нагрузочное тестирование,&nbsp;а&nbsp;понять тему достаточно для того, чтобы&nbsp;на&nbsp;встрече&nbsp;с техническими специалистами&nbsp;задавать точные&nbsp;и&nbsp;осмысленные&nbsp;вопросы, направленные на достижение результата.</em></span></p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Что на самом деле происходит под нагрузкой?</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Ваша система – это не просто «сервер». Это цепочка компонентов, каждый из которых имеет свой предел: серверная часть приложения, база данных, очередь задач, файловое хранилище, внешние интеграции. Когда к вам одновременно приходит много пользователей, то узкое место обнаруживается там, где вы меньше всего этого ожидали.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>До определённого порога система ведёт себя предсказуемо: трафик усиливается – время отклика растёт незначительно. Затем наступает точка насыщения – и начинается то, что инженеры называют «хоккейной клюшкой»: время отклика резко взлетает, пропускная способность перестаёт расти и начинает падать.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:html --></p>
<div style="margin: 28px 0; border: 1px solid #e4e0d8; border-radius: 8px; padding: 18px 14px 12px; background: #ffffff;"><img decoding="async" style="width: 100%; height: auto; display: block; border-radius: 4px;" src="data:image/png;base64,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vn013gIEKF68OL/88gsAZ8+e1do+69atY+fOnQCMGzeOypUra60zP67LAFevXqVHjx7ExcXRsGFDli5dmq3nB0Pnv3HjBt27dycsLIxKlSoxd+5czpw5w82bN9m/fz9ffvklCoWC1atX8+uvvxq8fpWs7gfyUm7v7c+fP69OHJcuXZrFixdz7ty5bN/n5sTMmTNZtmwZANOmTTO4g8G8vI5Mnz5dnTiuW7cu69at4/r165w8eZJRo0ZhYWGBv78/n332mcbbGgXN0HMs5P66NnLkSK3958mTJ3h5eXHlypW8/mhCvJWk5bF460VERKj/bW1tnePljBs3jrCwMCpUqMCWLVvUD0kADg4ODB8+nBo1atCjRw82bdpE3759qV69us5l5SSOyMhInJ2d2bZtG0WLFlUPV73+8/7775OQkMDUqVO1ki6tWrWiVatWWst0cnKiQoUKdOrUiTZt2uDn58f27dszvXFSPQAYGRnl6HP89NNPOoe7uLhQu3ZtmjRpQo8ePfjrr7/45ptvctTCJ7dOnDjB7t27MTIyonXr1uzdu1fndA8ePMDX1xeAAQMG8O2332pNk1etp83MzDLd3oa0SAkKCqJixYps2bJFvaxChQoxYMAAKleuTLdu3YiIiMDb25vp06drzDtu3DhSU1NxcHBg27ZtlCxZUj3ugw8+oGHDhnzwwQc8fvyYcePG0bp1a4N7lQ8LC1M/RL7//vt6k8+VKlViypQpWsOdnZ1p1KgR7du358qVK5w7d07vul7cjjY2NvTo0QMTExO+++47goODCQ0NpUiRIupp9u7dy6FDhwDo168fkyZNUo9zdHRkypQpuLq6MmXKFK5fv86qVav44osvdK4/4wO0ubm51neam/3l/v37/Pnnn4D+7airFXDGYapORTOTl+dC1fYwMTHRWq+hrccLyt9//82tW7cAmDRpkkYv946OjsydOxcHBwf+/PNP9u/fz/79+2ndurV6mvj4eEaMGIFSqcTd3Z0tW7ZotI5zcHCgZMmStGvXTuN1Z13fT8ZtZWlpmatr3bx58/D396d48eIULVo0Tx7KDNmvdElKSmLChAkAuLu7s337do2Wql27dqVBgwa0a9eOyMhIxo4dy549e/QuT5VAMjY21ornVWkhb2dnxz///KM13MnJidKlS9O2bVsGDhzIjh07WLhwYaZJyZxu9ydP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]]></description>
<link>https://quality-lab.ru/blog/kak-nagruzochnoe-testirovanie-zashhishhaet-biznes-ot-ubytkov/</link>
<pubDate>Thu, 21 May 2026 17:19:39 +0300</pubDate>
</item>
<item>
<title>Почему интуиция вас подводит: 5 ловушек теории вероятностей в IT</title>
<description><![CDATA[<p>Автор: Александр Заплавный</p>
<p>Многим кажется, что теория вероятностей — это лишь вузовские задачи про урны с шарами, далекие от написания кода или настройки серверов. Кажется, что для успешной работы в IT достаточно логики и знания алгоритмов.</p><p>Однако на практике пренебрежение законами вероятности ведет к реальным инженерным ошибкам. Мы видим ложные тренды на графиках мониторинга, недооцениваем критичность «редких» багов и тратим часы на отладку тестов, не учитывая зависимость событий.</p><p>Проблема в когнитивных искажениях: человеческий мозг плохо работает со случайностями. Эволюционно мы привыкли искать закономерности даже там, где их нет, и в сложных системах интуиция часто нас подводит.</p><p>В этой статье мы не будем решать абстрактные задачи. Вместо этого разберем 5 практических ловушек, в которые попадают разработчики и аналитики, и посмотрим, как базовая математика помогает принимать взвешенные технические решения.</p>]]></description>
<link>https://software-testing.ru/library/testing/test-analysis/4518-probability-theory</link>
<pubDate>Wed, 20 May 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Как организовать bug bash: руководство для тестировщиков</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/bug-bash.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/bug-bash.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Парвин Хан (Parveen Khan)<br /><strong><a href="https://www.ministryoftesting.com/articles/how-to-throw-a-bug-bash-a-tester-s-guide" mce_href="https://www.ministryoftesting.com/articles/how-to-throw-a-bug-bash-a-tester-s-guide" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><h1>Что такое bug bash?</h1>
<p>Вам когда-нибудь хотелось превратить тестирование в вечеринку? Bug bash как раз позволяет это сделать! Ну, не всё там сводится к веселью и играм: обычно самый крепкий напиток — это чёрный кофе, и вряд ли вам захочется нанимать диджея – но при этом можно неплохо провести время и заодно узнать важные вещи о продукте и качестве.</p>
<p>Bug bash укрепляет сотрудничество, даёт возможность выслушать разные точки зрения и помогает формировать и укреплять культуру качества. Обычно bug bash выглядит примерно так:</p>
<ul>
<li>Вы приглашаете кросс-функциональную команду: тестировщиков, разработчиков, продакт-оунеров, дизайнеров, стейкхолдеров. Иногда это просто продуктовая команда, а иногда — люди, которые обычно не ходят на ваши встречи – например, юристы или маркетологи. Важно пригласить и тех, кто ещё не пользовался продуктом (или не пробовал новые фичи).</li>
<li>Вы задаёте общие правила тестирования продукта. Как и на обычной вечеринке, хороший хозяин должен обозначить ожидания и рамки.</li>
<li>Веселитесь! Геймифицируйте тестирование (несколько идей ниже).</li>
<li>В течение нескольких часов или даже нескольких сессий по паре часов команда сосредоточенно тестирует продукт, следуя заданным правилам.</li>
<li>Обязательно заложите время на перерывы.</li>
<li>Закуски и напитки тоже всегда приветствуются.]]></description>
<link>https://software-testing.ru/library/testing/other-testing/4482-how-to-throw-a-bug-bash-a-tester-s-guide</link>
<pubDate>Mon, 18 May 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Как ускорить автотесты на Python в Pytest в 8,5 раз</title>
<description><![CDATA[<p>Автор: Анатолий Бобунов</p>
<p>Меня зовут Анатолий Бобунов, я работаю SDET в компании EXANTE. Однажды я пришел на проект, на котором выполнение некоторых тест-сьютов занимало больше часа, настолько медленно, что запускать их на каждый merge request (MR) было просто нереально. Мы хотели запускать автотесты на каждый коммит в MR, но с такой скоростью это было невозможно. В результате мне удалось, за счёт серии небольших, но точных изменений добиться 8,5-кратного ускорения - без переписывания тестов с нуля. В статье расскажу, какие проблемы у нас возникли и как мы их решали.</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-automation/4517-python-pytest</link>
<pubDate>Wed, 13 May 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>10 мощных тестов с Chrome DevTools</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/chrome-devtools/chrome-devtools1.png" mce_src="https://software-testing.ru/images/stories/library/11hs/chrome-devtools/chrome-devtools1.png" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Кастури Раджаманиккам (Kasturi Rajamanikkam)<br /><strong><a href="https://www.ministryoftesting.com/articles/10-powerful-tests-with-chrome-devtools" mce_href="https://www.ministryoftesting.com/articles/10-powerful-tests-with-chrome-devtools" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><p>Знаете ли вы, что Chrome DevTools предназначены не только для разработчиков, но и для тестировщиков? Для QA-специалиста важно не просто находить баги — понимание первопричин их появления и умение предложить возможные решения выводит тестирование на новый уровень.</p>
<p>Если вы не пользуетесь Chrome, аналог Chrome DevTools с похожим функционалом можно найти в любом современном браузере, так что вы можете выполнять эти проверки в браузере по своему выбору.</p>
<p>Чтобы максимально эффективно использовать Chrome DevTools, тестировщикам стоит иметь базовые знания HTML, CSS, DOM, JavaScript и уметь читать сетевые ответы.</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-tools/4484-10-powerful-tests-with-chrome-devtools</link>
<pubDate>Mon, 11 May 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Исследовательское тестирование и UX‑аудит для интернет-магазина</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p><em><span class='font-weight-bold'>Специалист по тестированию Харитон Дунько поделился, как нашёл с коллегами то, что ломало конверсию онлайн-магазина и приводило к потере клиентов.</span></em></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":29686,"width":"250px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-%D0%BC%D0%B0%D1%8F-2026-%D0%B3.-18_20_55-1024x1024.jpg" alt="Тестирование интернет-магазинов" class="wp-image-29686" style="width:250px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_20_55-1024x1024.jpg 1024w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_20_55-300x300.jpg 300w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_20_55-150x150.jpg 150w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_20_55-768x768.jpg 768w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_20_55.jpg 1254w" 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:quote --></p>
<blockquote class="wp-block-quote"><p><!-- wp:paragraph --></p>
<p>В <a href="https://quality-lab.ru/blog/pochemu-bez-realnykh-polzovateley-vy-testiruete-illyuziyu/">прошлой статье</a> я писал о важности проведения юзабилити‑тестирования с привлечением реальных пользователей. Теперь пишу в продолжение темы, но под другим углом – и тоже о реальном кейсе, всё, как вы любите. Расскажу, как получили задачу протестировать интернет-магазин автозапчастей и что из этого вышло.</p>
<p><!-- /wp:paragraph --></p></blockquote>
<p><!-- /wp:quote --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>Скажу честно, случай нестандартный, так как обратился к нам с запросом на тестирование <span class='font-weight-bold'>директор по маркетингу, а не техлид</span>, как это обычно бывает. В последние месяцы отчётливо видна тенденция, когда маркетологи, уставшие от разборок с разработчиками, привлекают независимых тестировщиков для оценки продукта. Можно сколько угодно говорить о продвинутом функционале и отсутствии багов в интернет-магазине, но <span class='font-weight-bold'>показатель конверсии и отток пользователей никогда не обманывают</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Когда сайт интернет‑магазина запускают или он активно растёт, основные усилия обычно направляют на каталог, интеграции с поставщиками и рекламу. <span class='font-weight-bold'>Но что, если покупок мало не из‑за цены или ассортимента</span>, а потому что поиск не ищет, фильтр не фильтрует и прочих незаметных, но важных факторов?</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Вот именно такие неточности нужно было найти в рамках проведения <span class='font-weight-bold'>исследовательского тестирования и UX‑аудита сайта розничной торговли автозапчастями</span>. Задача была в том, чтобы посмотреть на сайт глазами обычного покупателя: сможет ли он найти нужный товар, поймёт ли, как оформить заказ, не уйдёт ли к конкурентам?.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Особенности UX‑аудита интернет-магазина</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Без плясок с бубнами не обошлось, поскольку документации по функционалу маркетплейса не было. Пришёлся кстати подход исследовательского тестирования «тест‑туры», по методологии Джеймса Уиттакера (James A. Whittaker). При этом фокус был на Турах по деловому центру (Tours of the Business District), т. е. упор делался на те функциональности, ради которых пользователи приходят на сайт и делают заказы.</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":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>The Money Tour</span> (поиск товара, добавление в корзину, оформление заказа, т. е. всё то, что оказывает прямое влияние на конверсию и выручку);</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>The Guidebook Tour</span> (навигация, хлебные крошки, структура каталога, т. е. то, что помогает пользователю не потеряться и дойти до покупки);</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>The Landmark Tour</span> (поиск по VIN или FRAME, фильтры, карточки товаров, т. е. те уникальные фичи, которые помогают пользователю);</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>The FedEx Tour</span> (доставка, пункты выдачи, интеграция с ПВЗ, т. е. логистика);</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<p class="has-background" style="background-color:#e6f0f9"><span class='font-weight-bold'>The Garbage Collector Tour</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":29687,"width":"280px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-%D0%BC%D0%B0%D1%8F-2026-%D0%B3.-18_16_36-1024x1024.jpg" alt="Тестирование е ком" class="wp-image-29687" style="width:280px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_16_36-1024x1024.jpg 1024w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_16_36-300x300.jpg 300w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_16_36-150x150.jpg 150w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_16_36-768x768.jpg 768w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_16_36.jpg 1254w" 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">Такой подход позволил быстро выявить не только технические баги, но и системные проблемы UX, которые не видны при формальном тестировании.<br><br><span class='font-weight-bold'>Проверив сайт нашего заказчика, а затем сравнив его с конкурентами, я выделил несколько проблем, которые отпугивают клиентов в следующих ключевых модулях.</span><br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Поиск онлайн-магазина</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Этот модуль – главная точка входа. Если он не работает, то пользователь уходит.</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>При поиске по бренду (например, Bosch) список не фильтровался, а выбранный бренд не визуализировался вверху списка.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>При вводе длинного названия товара текст «уезжал» под иконку лупы.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<li>Поиск по VIN/FRAME не работал для новых и относительно новых автомобилей. Например, VIN автомобилей 2024 года выпуска сайт не видел.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph {"style":{"color":{"background":"#f78da84d"}}} --></p>
<p class="has-background" style="background-color:#f78da84d">В целом в модуле поиска товаров было найдено <span class='font-weight-bold'>14 ошибок на десктоп‑версии и 5 в мобильной</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>Это ключевой рубеж. Здесь ошибки стоят дороже всего. Например, многие пользователи, увидев пустую корзину после первого клика, решат, что функция не работает, и откажутся от повторной покупки. А это прямая потеря повторных продаж.</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>Счётчик в корзине показывал количество наименований, а не штук (добавил 3 штуки, а в корзине было написано «1»).</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://baymard.com/learn/ecommerce-filter-ui" rel="nofollow">Baymard Institute</a><sup data-fn="a8600c0a-9b68-4404-b276-298a64a3eccf" class="fn"><a href="https://quality-lab.ru#a8600c0a-9b68-4404-b276-298a64a3eccf" id="a8600c0a-9b68-4404-b276-298a64a3eccf-link">1</a></sup>, <span class='font-weight-bold'>60% пользователей покидают сайт, если не могут эффективно отфильтровать товары</span>. Каждая такая потеря – минус потенциальный заказ. <span class='font-weight-bold'>И даже мелкие неудобства в корзине увеличивают процент брошенных чекаутов на 5–8%.</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>Ползунок цены не двигался, а ручной ввод сбрасывался.</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 --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":29688,"width":"296px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-%D0%BC%D0%B0%D1%8F-2026-%D0%B3.-18_11_50-1024x1024.jpg" alt="Тестирование корзины" class="wp-image-29688" style="width:296px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_11_50-1024x1024.jpg 1024w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_11_50-300x300.jpg 300w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_11_50-150x150.jpg 150w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_11_50-768x768.jpg 768w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_11_50.jpg 1254w" 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'>6 ошибок в вебе</span> и <span class='font-weight-bold'>1 в мобильной версии</span> плюс <span class='font-weight-bold'>7 проблем валидации</span> <span class='font-weight-bold'>в профиле</span>, напрямую влияющих на завершение покупки.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Мобильная версия в e-commerce</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Около <span class='font-weight-bold'>40–60% трафика</span> в e‑commerce происходит с <a href="https://www.tadviser.ru/index.php/%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D1%8F%3A%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82-%D1%82%D0%BE%D1%80%D0%B3%D0%BE%D0%B2%D0%BB%D1%8F_%D0%B2_%D0%BC%D0%B8%D1%80%D0%B5" rel="nofollow">использованием мобильных устройств</a><sup data-fn="fbc3bfa6-b6b6-4ff0-967d-aa61175223df" class="fn"><a href="https://quality-lab.ru#fbc3bfa6-b6b6-4ff0-967d-aa61175223df" id="fbc3bfa6-b6b6-4ff0-967d-aa61175223df-link">2</a></sup>. Если мобильная версия неудобна, то вы теряете половину клиентов. Это новая реальность.</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>Футер перекрывал кнопки в каталоге по VIN, в т. ч. невозможно было получить данные о детали.</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>Всего в мобильной версии было найдено 7 критических проблем, не считая минорных. Это тот случай, когда адаптивный дизайн есть, но пользоваться им невозможно.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Доверие покупателей и контент</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Мелочи убивают лояльность. Орфографические ошибки, дубли, несоответствия – всё это работает против вас.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp: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>Названия товаров в истории заказов менялись. Заказываете «Тормозная жидкость», а в истории отображается «Жидкость (L 05 005)».</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 {"style":{"color":{"background":"#f78da84d"}}} --></p>
<p class="has-background" style="background-color:#f78da84d">Всего было обнаружено <span class='font-weight-bold'>67 ошибок и сформулировано 55 рекомендаций по улучшению</span>. Причём из<span class='font-weight-bold'> 67 ошибок было 9 Critical уровня</span>, которые блокировали ключевые сценарии, <span class='font-weight-bold'>28 Major уровня</span>, которые существенно ухудшали UX, <span class='font-weight-bold'>23 Minor уровня</span> – это в основном визуальные и логические недочёты, а также <span class='font-weight-bold'>7 Trivial уровня</span>, т. е. какие‑то косметические неточности.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В итоге заказчик увидел свой сайт глазами клиента и был неприятно удивлён, но выразил нам благодарность, был удовлетворён и обещал исправить найденные баги и применить рекомендации. И что важно – мы сотрудничаем по сей день. Нам было особенно приятно получить такой результат на фоне того, что разработчики скептически отнеслись к нам в начале и твердили: <span class='font-weight-bold'>«Пользователи сами не знают, чего хотят»</span>. А мы им детально показали, что <span class='font-weight-bold'>пользователи просто не могут купить то, что хотят</span>.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Вывод</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Многие компании откладывают поиск и исправление «некрасивых» доработок, фокусируясь на новых фичах. Владельцы интернет-магазинов часто считают, что если сайт как‑то работает, то всё в порядке.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":29697,"width":"287px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-%D0%BC%D0%B0%D1%8F-2026-%D0%B3.-18_07_11-1024x1024.jpg" alt="тестирование интернет магазинов" class="wp-image-29697" style="width:287px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_07_11-1024x1024.jpg 1024w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_07_11-300x300.jpg 300w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_07_11-150x150.jpg 150w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_07_11-768x768.jpg 768w, https://quality-lab.ru/wp-content/uploads/2026/05/ChatGPT-Image-6-мая-2026-г.-18_07_11.jpg 1254w" 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>, которые не ловятся стандартными тестами, но при этом режут конверсию на <span class='font-weight-bold'>10–30%</span> и выше. Наш кейс – живое доказательство.<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>Хотите узнать, какие скрытые проблемы тормозят рост вашего интернет‑магазина? Мы проводим исследовательское тестирование e‑commerce проектов любой сложности с фокусом на конверсию и <a href="https://quality-lab.ru/usability-testing/">пользовательский опыт</a>. </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><span class='font-weight-bold'>Напишите нам, чтобы обсудить, как помочь вашему онлайн-магазину продавать лучше.</span></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>
<p><!-- wp:footnotes /--></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></p>]]></description>
<link>https://quality-lab.ru/blog/issledovatelskoe-testirovanie-i-uxaudit-dlya-internet-magazina/</link>
<pubDate>Thu, 07 May 2026 10:59:41 +0300</pubDate>
</item>
<item>
<title>Первый месяц в Bug Bounty: итоги, цифры и выученные уроки</title>
<description><![CDATA[<p><a href="https://habr.com/ru/articles/993926/" mce_href="https://habr.com/ru/articles/993926/" target="_blank" style="">Оригинальная публикация</a></p>
<p>Мой путь в ИБ начался с нуля - у меня не было опыта работы и образования в айти в целом, будь это системное администрирование или программирование. Я просто планомерно учился и сдавал сертификации. За три года у меня собрался определенный стек: OSCP, HTB CWES, CRTP, PNPT, PJPT, PJOR, CompTIA A+, Network+ и Security+.</p><p>Когда пришло время искать работу пентестером, я столкнулся с реальностью: вакансий в моем регионе почти нет, а те, что находил, не приносили даже приглашений на собеседование. Профиль без практического опыта не вызывал интереса у работодателей. Чтобы начать нарабатывать реальный стаж, я решил попробовать себя в багхантинге.</p><p>Основная цель была простой получить опыт и проверить свои знания в бою, а не в лабораторной среде. Ну и, конечно, был интерес заработать репутацию практика и получить первые выплаты.</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-tools/4516-bug-bounty</link>
<pubDate>Wed, 06 May 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Когда тестировщик в отпуске, команда справится!</title>
<description><![CDATA[<p><strong><img src="https://software-testing.ru/images/stories/library/11hs/out-of-office.jpg" mce_src="https://software-testing.ru/images/stories/library/11hs/out-of-office.jpg" width="200" mce_style="float: left;" style="float: left;" />Автор:</strong> Эмили О’Коннор (Emily O’Connor)<br /><strong><a href="https://www.ministryoftesting.com/articles/when-the-tester-s-away-the-team-can-test-anyway" mce_href="https://www.ministryoftesting.com/articles/when-the-tester-s-away-the-team-can-test-anyway" target="_blank">Оригинал статьи</a><br /></strong><strong>Перевод</strong><strong>: </strong>Ольга Алифанова</p><p>Меня зовут Эмили, я ведущий инженер по тестированию, и я считаю, что пришло время попрощаться с написанием трудоёмких актов сдачи дел и поприветствовать тестирование, которое эффективно, даже когда вы в отпуске или отсутствуете на работе.</p>
<p>По роду своей деятельности я работаю с разными командами и вовлечена в множество проектов, которые ведутся в компании.</p>]]></description>
<link>https://software-testing.ru/library/testing/general-testing/4481-when-the-tester-s-away-the-team-can-test-anyway</link>
<pubDate>Sun, 03 May 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>Юзабилити‑тестирование без розовых очков: почему идеальный функционал не спасёт от провала?</title>
<description><![CDATA[<p><!-- wp:paragraph --></p>
<p>Знакомая история: команда полгода пилила фичу, тестировщики нашли все баги, релиз вышел чистый, как слеза младенца. А пользователи… не оценили. Воронка ломается на третьем шаге, поддержка задыхается от тикетов «не могу найти эту вашу кнопку», CFO смотрит на расходы и тихо плачет.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"width":"33.33%"} --></p>
<div class="wp-block-column" style="flex-basis:33.33%"><!-- wp:image {"id":29643,"sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large"><img fetchpriority="high" decoding="async" width="683" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_felted_raccoon.-2-Photoroom_4_11zon-683x1024.jpg" alt="Юзабилити‑тестирование без розовых очков" class="wp-image-29643" srcset="https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_felted_raccoon.-2-Photoroom_4_11zon-683x1024.jpg 683w, https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_felted_raccoon.-2-Photoroom_4_11zon-200x300.jpg 200w, https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_felted_raccoon.-2-Photoroom_4_11zon-768x1152.jpg 768w, https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_felted_raccoon.-2-Photoroom_4_11zon.jpg 1024w" sizes="(max-width: 683px) 100vw, 683px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"width":"66.66%"} --></p>
<div class="wp-block-column" style="flex-basis:66.66%"><!-- wp:paragraph --></p>
<p>Что произошло? Да, вполне привычная история. Продукт прошёл функциональное тестирование, но не прошёл главный тест – встречу с реальным человеком. Классический QA не лечит кривой UX. Он вообще не про это. Можно покрыть продукт автотестами на 100%, прогнать регрессию, получить зелёненький отчёт и всё равно слить релиз – потому что пользователь не понял, куда жать.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>И вот тут на сцену выходит юзабилити‑тестирование. Не «ещё один вид тестирования», не «опционально, если останется бюджет», а инструмент управления риском провала продукта. Мы подготовили информационный концентрат: что, как и в каком порядке делать.</p>
<p><!-- /wp:paragraph --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:heading --></p>
<h2 class="wp-block-heading">Главное недоразумение: юзабилити – это не про «удобство»</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Если в вашей команде юзабилити‑тестирование воспринимают как «ну, чтобы пользователю было удобненько», то у вас проблема на уровне базовых установок. Юзабилити – не про красоту и не про комфорт. Это побочные эффекты. Истинная цель – прибыль.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>В удобном интерфейсе пользователь легко и с удовольствием доходит до целевого действия. Растут конверсии, а за ними и выручка. Каждая лишняя кнопка, каждый невнятный лейбл – это деньги, утекающие мимо кассы. Когда вы это поймёте, юзабилити перестанет быть для вас «второстепенным видом тестирования где‑то после нагрузочного» и станет центром работы по выживанию и росту продукта.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><br>И ещё. <span class='font-weight-bold'>UX‑проектирование</span> – это весь процесс создания интерфейса от ресёрча до макетов. <span class='font-weight-bold'>Юзабилити‑тестирование</span> – этап обратной связи внутри этого процесса. Без него UX превращается в ритуальные пляски с бубном по канонам Material Design: вроде красиво, а летит ли – непонятно.</pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":29645,"width":"267px","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/04/ad3896b5-110e-4be4-a727-c9fe2c89acfd-Photoroom-1.png" alt="Юзабилити‑тестирование " class="wp-image-29645" style="width:267px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/04/ad3896b5-110e-4be4-a727-c9fe2c89acfd-Photoroom-1.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/04/ad3896b5-110e-4be4-a727-c9fe2c89acfd-Photoroom-1-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/04/ad3896b5-110e-4be4-a727-c9fe2c89acfd-Photoroom-1-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/04/ad3896b5-110e-4be4-a727-c9fe2c89acfd-Photoroom-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: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> Нужна ли инструкция, чтобы пользоваться? Если да – у нас плохие новости.</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 --></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:heading {"level":3} --></p>
<h3 class="wp-block-heading"><span class='font-weight-bold'>Ставим цели</span></h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Самый главный шаг и самый игнорируемый, к сожалению. Без чёткой цели тест превращается в «давайте посмотрим, что не так». Цель всегда привязана к стейкхолдеру: маркетинг хочет конверсии, поддержка – снижения тикетов «как это сделать?», продакт – отстройки от конкурента, юристы – соответствия WCAG. Сначала вопрос – потом инструмент.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading"><span class='font-weight-bold'>Выбираем методики под задачи</span></h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>В юзабилити‑тестировании больше десятка методик, и каждая – под свою задачу. Использовать одну для всего – это забивать гвозди микроскопом.</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>Think-aloud</td>
<td>Прототипы, ранние этапы. Когда нужны ментальные модели, а не метрики.</td>
</tr>
<tr>
<td>Session Recording</td>
<td>Прод с массовой аудиторией. Где люди отваливаются, тепловые карты.</td>
</tr>
<tr>
<td>Time to Done</td>
<td>Сравнение версий интерфейса. Эффект редизайна в секундах.</td>
</tr>
<tr>
<td>Card Sorting</td>
<td>Проектирование меню, навигации, структуры каталога.</td>
</tr>
<tr>
<td>GOMS, KLM</td>
<td>Профессиональное ПО, где каждая секунда на счету (call-центры, трейдинг).</td>
</tr>
<tr>
<td>SUS, UMUX</td>
<td>Регулярные количественные замеры юзабилити (индекс 0–100).</td>
</tr>
<tr>
<td>Cognitive walkthrough</td>
<td>Этап проектирования, живых пользователей ещё нет.</td>
</tr>
<tr>
<td>Хронометраж сессий</td>
<td>B2B-системы, где «длинные» шаги (возвраты, согласования, выгрузки).</td>
</tr>
<tr>
<td>Эвристики Нильсена</td>
<td>Быстрая ревизия силами эксперта. Когда нет ресурсов на пользовательский тест.</td>
</tr>
<tr>
<td>Коридорные тесты</td>
<td>5–10 минут с первым встречным. Проверить, не стало ли хуже после правок.</td>
</tr>
<tr>
<td>WCAG</td>
<td>Госуслуги, образование, международные рынки, аудиты.</td>
</tr>
</tbody>
</table><figcaption class="wp-element-caption">Запомните, что методику выбирают под цель, а не наоборот. Если кто‑то говорит «давайте сделаем юзабилити‑тест!» – переспросите: «Какой именно? Зачем?». Нет внятного ответа – методика не выбрана, тест провалится.</figcaption></figure>
<p><!-- /wp:table --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading"><span class='font-weight-bold'>Определяемся с целевой аудиторией</span></h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"width":"66.66%"} --></p>
<div class="wp-block-column" style="flex-basis:66.66%"><!-- wp:image {"id":29646,"width":"412px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="1024" height="683" src="https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_felted_wool-sty-Photoroom_5_11zon-1024x683.jpg" alt="Юзабилити‑тестирование " class="wp-image-29646" style="width:412px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_felted_wool-sty-Photoroom_5_11zon-1024x683.jpg 1024w, https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_felted_wool-sty-Photoroom_5_11zon-300x200.jpg 300w, https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_felted_wool-sty-Photoroom_5_11zon-768x512.jpg 768w, https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_felted_wool-sty-Photoroom_5_11zon.jpg 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"width":"33.33%"} --></p>
<div class="wp-block-column" style="flex-basis:33.33%"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted"><br>Тестировать продукт на «случайных людях» – путь в никуда. Бабушка, зашедшая в приложение для зумеров, <br>не даст вам полезных данных про продукт.<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"><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><span class='font-weight-bold'><img src="https://s.w.org/images/core/emoji/15.0.3/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" />Плохой сценарий: </span>«Найдите раздел „Книги“, выберите жанр „Фантастика“, добавьте книгу в корзину».<br /><span class='font-weight-bold'><img src="https://s.w.org/images/core/emoji/15.0.3/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" />Хороший сценарий:</span> «Представьте, что хотите купить подарочную книгу для друга, которому нравится фантастика. Покажите, как бы вы это сделали».</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"><span class='font-weight-bold'>Собираем инструменты</span></h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Zoom/Google Meet – для модерируемых сессий. Hotjar/Метрика – для записи и тепловых карт. Maze, UXtweak, PlaybookUX, Useberry – специализированные платформы. Если первые четыре шага сделаны нормально – выбор инструмента уже мелочь. Если напортачили – ни Maze, ни Fullstory не спасут.</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'>20 методик юзабилити‑тестирования</span>. Это удобная шпаргалка для <span class='font-weight-bold'>QA‑лида, продакт‑менеджера или UX‑исследователя</span>. По каждой из методик: суть, когда и для чего применять, что для этого нужно, какого результата ожидать.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column {"width":"66.66%"} --></p>
<div class="wp-block-column" style="flex-basis:66.66%"><!-- wp:image {"id":29647,"sizeSlug":"large","linkDestination":"none"} --></p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="715" src="https://quality-lab.ru/wp-content/uploads/2026/04/%D0%9F%D1%80%D0%B5%D0%B2%D1%8C%D1%8E-1024x715.jpg" alt="Превью Юзабилити‑тестирование 20 методик" class="wp-image-29647" srcset="https://quality-lab.ru/wp-content/uploads/2026/04/Превью-1024x715.jpg 1024w, https://quality-lab.ru/wp-content/uploads/2026/04/Превью-300x209.jpg 300w, https://quality-lab.ru/wp-content/uploads/2026/04/Превью-768x536.jpg 768w, https://quality-lab.ru/wp-content/uploads/2026/04/Превью.jpg 1218w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column {"width":"33.33%"} --></p>
<div class="wp-block-column" style="flex-basis:33.33%"><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Заполните форму, и мы отправим документ вам на электронную почту.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:shortcode --></p>
<p><!-- /wp:shortcode --></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: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: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>Заметки по ходу – Google Doc, Excel, что угодно.</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>Укладывайтесь в 30–45 минут. Длиннее – пользователь устаёт и начинает врать.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":29648,"width":"264px","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/04/c69c2555-0566-463f-a2cd-1c263f1994c0-Photoroom.png" alt="Юзабилити‑тестирование " class="wp-image-29648" style="width:264px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/04/c69c2555-0566-463f-a2cd-1c263f1994c0-Photoroom.png 1024w, https://quality-lab.ru/wp-content/uploads/2026/04/c69c2555-0566-463f-a2cd-1c263f1994c0-Photoroom-300x300.png 300w, https://quality-lab.ru/wp-content/uploads/2026/04/c69c2555-0566-463f-a2cd-1c263f1994c0-Photoroom-150x150.png 150w, https://quality-lab.ru/wp-content/uploads/2026/04/c69c2555-0566-463f-a2cd-1c263f1994c0-Photoroom-768x768.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></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"><br>В «Лаборатории Качества» <a href="https://quality-lab.ru/blog/pochemu-bez-realnykh-polzovateley-vy-testiruete-illyuziyu/">мы видели</a> десятки случаев, когда модератор не выдерживал, начинал «помогать» участнику – и весь тест летел в мусорку. Молчать тяжело, но необходимо. Не допускайте эту критическую ошибку.</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>Ловите <span class='font-weight-bold'>паттерны</span>, а не единичные случаи. <span class='font-weight-bold'>Один человек</span> – ещё не показатель, так как есть факторы в виде личностных особенностей, плохого настроения и т. д. А вот если <span class='font-weight-bold'>3+ пользователей</span> запнулись на одном месте – это сигнал. По канонам Якоба Нильсена 5 пользователей выявляют около 85% юзабилити‑проблем – поэтому необязательно собирать огромные выборки. Главное – чтобы эти пять человек были из вашей реальной ЦА.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>После всех сессий группируйте проблемы по категориям: навигация, тексты, визуал, функционал, мобилка. Простейшая таблица закрывает 80% задач: участник, сценарий, что получилось, где сложности, цитаты, время, severity (1–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><em>Если хотя бы половина пунктов отсутствует в вашем процессе – у вас не юзабилити‑тестирование, а имитация бурной деятельности.</em></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading"><span class='font-weight-bold'>Перед тестом</span></h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">Цель сформулирована и привязана к стейкхолдеру.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">Методика выбрана под цель (см. таблицу выше).</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">ЦА описана конкретно, с критериями отбора.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">Сценарии – как истории, без слов из интерфейса.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">Прототип работает, кликабелен, без багов.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">Проведён пилот с записью и пересмотром.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading"><span class='font-weight-bold'>Во время сессии</span></h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">Сказали «тест проходит интерфейс, а не вы».</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">Попросили думать вслух.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">Включили запись.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">Молчите, не подсказываете.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">Уложились в 30–45 минут.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading"><span class='font-weight-bold'>После сессии</span></h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul class="wp-block-list"><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">Считаете паттерны (3+), не единичные случаи.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">Группируете по категориям, расставляете severity.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">Делаете отчёт с цитатами и фрагментами видео.</li>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item {"style":{"color":{"background":"#e6f0f9"}}} --></p>
<li style="background-color:#e6f0f9">Команда формирует план действий, вносит правки, при необходимости отдаёт продукт для повторного теста.</li>
<p><!-- /wp:list-item --></ul>
<p><!-- /wp:list --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:columns --></p>
<div class="wp-block-columns"><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:preformatted --></p>
<pre class="wp-block-preformatted">Когда мы в «Лаборатории Качества» <a href="https://quality-lab.ru/blog/erp-adoption-60-percent-case-study/">заходим на проекты</a> по запросу «у нас всё ок, просто помогите ускорить регрессию», часто оказывается, что регрессия – последняя из проблем. На первом месте – пользователь, который не может за три клика сделать то, ради чего вообще пришёл. И вопрос меняется с «как нам быстрее тестировать?» на «как нам перестать делать продукт, который никому не понятен?». Вот ради этого вопроса и существует <a href="https://quality-lab.ru/usability-testing/">юзабилити‑тестирование</a>.<br></pre>
<p><!-- /wp:preformatted --></div>
<p><!-- /wp:column --></p>
<p><!-- wp:column --></p>
<div class="wp-block-column"><!-- wp:image {"id":29651,"width":"281px","height":"auto","sizeSlug":"large","linkDestination":"none","align":"center"} --></p>
<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="835" height="1024" src="https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_raccoon_in_a_fe-Photoroom-2-835x1024.png" alt="Юзабилити‑тестирование " class="wp-image-29651" style="width:281px;height:auto" srcset="https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_raccoon_in_a_fe-Photoroom-2-835x1024.png 835w, https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_raccoon_in_a_fe-Photoroom-2-244x300.png 244w, https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_raccoon_in_a_fe-Photoroom-2-768x942.png 768w, https://quality-lab.ru/wp-content/uploads/2026/04/gpt-image-2-medium_a_A_3D_raccoon_in_a_fe-Photoroom-2.png 1132w" sizes="(max-width: 835px) 100vw, 835px" /></figure>
<p><!-- /wp:image --></div>
<p><!-- /wp:column --></div>
<p><!-- /wp:columns --></p>
<p><!-- wp:paragraph --></p>
<p>А у вас как? На каком этапе тестируете юзабилити – на прототипе, на бете или (а вы любите рисковать) после релиза? Какие методики реально зашли, а какие оказались неоправданными? Делитесь в комментариях.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>Если у вас сейчас появилось много вопросов и мыслей – напишите нам, обсудим без галстуков. Реальный опыт – лучшая валюта в нашей отрасли, и мы готовы делиться.</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p><!-- /wp:paragraph --></p>]]></description>
<link>https://quality-lab.ru/blog/yuzabiliti-testirovanie-bez-rozovykh-ochkov/</link>
<pubDate>Wed, 29 Apr 2026 13:55:19 +0300</pubDate>
</item>
<item>
<title>Внедряем Testcontainers за два дня или как перестать бояться рефакторинга и начать доверять своим тестам</title>
<description><![CDATA[<p>Автор: Леонид Сухин</p>
<p>Я фанат тестов. Очень люблю, когда основные части моего кода покрыты полностью, от и до. Первая очевидная причина, для чего это нужно: если я закрываю задачу, то должен более-менее точно знать, что действительно ее выполнил. Тесты помогают получить такую уверенность. Вторая причина: хочется иметь возможность безболезненно вносить изменения и проводить рефакторинг. Наличие тестов позволяет делать это, пусть и с опаской. Если тестов нет, то рефакторинг либо невозможен, либо может стать серьезным испытанием для команды, ведь придется проводить регрессионное тестирование большого количества функционала.</p><p>Подход, который я долгое время использовал массово - написание юнит-тестов с использованием Mockito. В заглушки превращается любой сторонний сервис, используемый тестируемым классом. Тесты супер-быстрые, все зеленое, все супер!</p><p>Со временем я заметил, что этот подход начал изрядно напрягать. Часто на две строчки кода приходилось писать не менее 10-20 строк теста. Огромное количество переопределений поведения заглушек. Проверки, что тот или иной метод сторонних сервисов более не вызывался или вызывался не более определенного количества раз. Без преувеличения, огромное количество бойлер-плейт кода в тестах.</p><p>Дальше - больше. Множество зеленых галочек, появляющееся на экране при запуске тестов, не могло не радовать. Но вот ты решаешь сделать минимальный рефакторинг, оптимизировать какой-то метод. В этот момент все разваливается на куски. Куча красных тестов! Как, почему? Да просто во внутренней реализации ты перешел на использование другого метода, добавил в метод еще один параметр или что-то подобное. В результате куча тестов перестала работать. И теперь, поменяв одну строчку в процессе рефакторинга, надо поменять еще 30 строк в тестах. В какой-то момент начинаешь ловить себя на мысли - “Ни в коем случае, никаких рефакторингов больше!”</p>]]></description>
<link>https://software-testing.ru/library/testing/testing-automation/4515-testcontainers-</link>
<pubDate>Tue, 28 Apr 2026 23:00:00 +0300</pubDate>
</item>
<item>
<title>TechWriter Days 3. Как это было</title>
<description><![CDATA[<p>&nbsp;</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR00cfRlK5w0Cd54H8WH1RAi6syhieBzMg2OSW8aNk1WwkQGzZvRR6WAOdFZgYl2gzKhir_zZF9On3rvjjsdhSKETNuESX00qhtx9HQjcs3C-wt1LAwrOgZmnnSO71qCulz5TVEphDaE3CA74ECkygdlDP6LfUnWBSdzMesO-yO2v8rtSWFuiHGY8FcD0/s1462/22.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1096" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR00cfRlK5w0Cd54H8WH1RAi6syhieBzMg2OSW8aNk1WwkQGzZvRR6WAOdFZgYl2gzKhir_zZF9On3rvjjsdhSKETNuESX00qhtx9HQjcs3C-wt1LAwrOgZmnnSO71qCulz5TVEphDaE3CA74ECkygdlDP6LfUnWBSdzMesO-yO2v8rtSWFuiHGY8FcD0/s320/22.jpg" width="240" /></a></div><br /><p></p><p>27-28 марта в Москве прошла 3-я конференция для технических писателей —&nbsp;TechWriter Days 3.</p><p>Сайт конференции —&nbsp;<a href="https://techwriterdays.ru/">https://techwriterdays.ru/</a>.</p><p>Программа —&nbsp;<a href="https://techwriterdays.ru/ru/program/137253">https://techwriterdays.ru/ru/program/137253</a></p><p><br /></p><p>«Я там был, мед, пиво пил» © И хочу поделиться с вами. Конференция отпочковалась от конференции аналитиков, так как тех писы уже — дело стандартное, есть отдельные должности под них.</p><p>А я сама в свое время и аналитиком на проектах была, да и с документацией работала постоянно, потому что я — бюрократ ))) Так что очень интересно было посетить эту конференцию.</p><p>Организация тут, как всегда у Владислава с Татьяной Орликовых, на высоте. Еда, чай, место для отдыха, куча всяких активностей, да и просто интересные доклады! Расскажу про те, где я была и где хотела бы.</p><span><a name='more'></a></span><p><br /></p><h3 style="text-align: left;">Мой список "посмотреть потом"</h3><p></p><ol style="text-align: left;"><li><a href="https://techwriterdays.ru/ru/talk/137362" target="_blank">Тихая эпидемия в IT, или Почему выгорают технические писатели</a>&nbsp;— плохо себя чуствовала, не осталась на последние доклады, ушла домой. Но исходно ставила галочку сходить на доклад. Полистала слайды — интересно и жизненно, особенно про команды, где твою роль не понимают. Хотя это история про выгорание, а хотелось бы "что делать в такой команде", но тоже интересно)</li><li><a href="https://techwriterdays.ru/ru/talk/141107" target="_blank">Использование стилей MS Word без страха</a>&nbsp;— тут обещают реальные кейсы из жизни, я такое люблю)</li><li><a href="https://techwriterdays.ru/ru/talk/140867" target="_blank">Внутреннее продвижение базы знаний: от справочника до культуры работы с информацией</a>&nbsp;— внутреннее продвижение тоже очень актуальная тема!</li><li><a href="https://techwriterdays.ru/ru/talk/140956" target="_blank">Документация как продукт: от текстов к стратегии и управлению опытом</a>&nbsp;— документация как отдельный продукт, в том числе улучшаюший онбординг. Это прям откликает мне, я сама делала онбординг))</li><li><a href="https://techwriterdays.ru/ru/talk/141084" target="_blank">Отчеты и метрики в документации: как считать влияние на бизнес</a>&nbsp;— всегда интересно, кому какие метрики зашли</li></ol><p><br /></p><h2 style="text-align: left;">Какие доклады я слушала</h2><p><br /></p><h3 style="text-align: left;">Кому доверить ревью API — техпису или искусственному интеллекту.&nbsp;Камила Мазаева</h3><p><a href="https://techwriterdays.ru/ru/talk/141082" target="_blank">Ссылка на доклад</a></p><p>Камила работает в Альфабанке, где много всяких разных проектов. Путь документации там такой:</p><p>Аналитик → техпис → разработка</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRYHo17r_xD-zmWiw5NC6TD6HhFOw8kDPI8CUmpDQJbZy4qrO_7NY3QsEldmgElN7OJnhHgN2Dm-o3NlP4YmPQWVg2g9D9Bsg3B97htdoUbtQYYt7bjtrIlTVcvykGzkVy65-AD8lZjfHnRJKlspkMuoP_hVExYBGr063quRj2sgkrgxgIx4HUJ5EvJSM/s1280/11.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRYHo17r_xD-zmWiw5NC6TD6HhFOw8kDPI8CUmpDQJbZy4qrO_7NY3QsEldmgElN7OJnhHgN2Dm-o3NlP4YmPQWVg2g9D9Bsg3B97htdoUbtQYYt7bjtrIlTVcvykGzkVy65-AD8lZjfHnRJKlspkMuoP_hVExYBGr063quRj2sgkrgxgIx4HUJ5EvJSM/s320/11.jpg" width="320" /></a></div><p>Технический писатель нужен, потому что документацию пишут разные люди, в разных стилях. А нужен единый, за этим следит техпис. Но техписы тонут в работе — когда приходят документы с опечатками, разным стилем и тд.</p><p>Поэтому решили нудную работу делегировать ИИ. Посмотрели, что да как, и решили сделать так, чтобы ИИ не вносил правки в текст, а присылал отчет по найденным проблемам:</p><p></p><ul style="text-align: left;"><li>уровень критичности</li><li>где проблема?</li><li>как написать лучше</li></ul><div>И человек уже принимает или отклоняет такие правки. В итоге аналитик открывает чат с ботом, куда уже внесен нужный промт → дал документацию, получил фидбек. Красота!</div><div><br /></div><div>Ну и выводы — ИИ хорошо правит простые опечатки и быстро обрабатывает документы. Но не очень хорош с контекстом, терминологией и работе с неоднозначностью.</div><div><br /></div><div>И, конечно, нужно помнить, что сердце ИИ — хороший промт!</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNxsMg9G33oNeYk99pdViv49npB4spfap9KInrtPxtFyKveIobEBBaJen3LwZw0biRu22oy2PF_EzRXIxc8tmIgBFyB2B9JjhRPBbmkqcVkL8ngdFo3XMqzl2vq9Zc_LdPE-Pigf_y_9lpeZJURLomidNeVYty21PVp_J9mPtOX9loXQgC1_WJnksBAtQ/s1280/12.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNxsMg9G33oNeYk99pdViv49npB4spfap9KInrtPxtFyKveIobEBBaJen3LwZw0biRu22oy2PF_EzRXIxc8tmIgBFyB2B9JjhRPBbmkqcVkL8ngdFo3XMqzl2vq9Zc_LdPE-Pigf_y_9lpeZJURLomidNeVYty21PVp_J9mPtOX9loXQgC1_WJnksBAtQ/s320/12.jpg" width="320" /></a></div><br /><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Через тернии к звездам: как мы перевезли всю документацию Яндекса на Diplodoc.&nbsp;Эльвира Гильманова и&nbsp;Михаил Кошкин</h3><div><a href="https://techwriterdays.ru/ru/talk/140923" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Довольно интересный рассказ о переезде документации с одной платформы на другую. Переезд занял 5 лет! ????</div><div><br /></div><div>Раньше жили на DITA, которая выглядела как документация из 2000-х годов, перешли на YFM.</div><div>Всякое бывало, что-то предусмотрели, а что-то — нет.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh48ip61s-bbUIlZU5fbujPOKdKZxDxPLiT5_vymQyBVMp4qcTaHfsbBAV9uqXh8A_Me6nt206rZ4w3_NgbQcoUB2khdJ6GhmLJcOwaSpgeDj2WRXiYjQtzFBmEtxQLsZpZrqY5fsTM-7Q8c4NTEs4jQhD-MGMvFhh5QLimUYIOV6ueSRB0HQxLX-QijV0/s1280/13.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh48ip61s-bbUIlZU5fbujPOKdKZxDxPLiT5_vymQyBVMp4qcTaHfsbBAV9uqXh8A_Me6nt206rZ4w3_NgbQcoUB2khdJ6GhmLJcOwaSpgeDj2WRXiYjQtzFBmEtxQLsZpZrqY5fsTM-7Q8c4NTEs4jQhD-MGMvFhh5QLimUYIOV6ueSRB0HQxLX-QijV0/s320/13.jpg" width="320" /></a></div><br /><div>Были и косяки — нужно было объединить документацию. Посмотрели, она написана на разных платформах, провели диагностику, какая лучше, выбрали... DITA. И через месяц узнали, что все пеередут в YFM.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3E8Y0J57vzN3ubt5BxRqPQv02mQxAogwxUUh4620SC-ZaXw2uQsoNmhNruIG6aXPwZm0pt-bz_hUl5cAXYJI2g08ZIdd_nFoLiyMR1Im3OlLSZmLe6UHHU7aCNor-g29xBpf5FJZdT6MA4_IfKRIbAQrF9GS0Xqr6TeNtgeOPJo0izhXnqyNkhgvWzok/s1280/14.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3E8Y0J57vzN3ubt5BxRqPQv02mQxAogwxUUh4620SC-ZaXw2uQsoNmhNruIG6aXPwZm0pt-bz_hUl5cAXYJI2g08ZIdd_nFoLiyMR1Im3OlLSZmLe6UHHU7aCNor-g29xBpf5FJZdT6MA4_IfKRIbAQrF9GS0Xqr6TeNtgeOPJo0izhXnqyNkhgvWzok/s320/14.jpg" width="320" /></a></div><br /><div>Была ситуация со старым багом, который вроде как не очень хорошо ловится, вот и не правили. А потом выяснилось, что популярная документация не могла из-за него мигрироваться. Пытались сделать костыли — заняло квартал с нулевым результатом. А переписать с нуля заняло месяц.</div><div><br /></div><div>Так что хоть "переписать с нуля" и боятся, иногда это самый лучший вариант. И даже самый быстрый, хотя кажется наоборот))</div><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Собрать документацию в один клик: опыт применения языковых моделей и шаблонизаторов.&nbsp;Никита Осокин</h3><div><a href="https://techwriterdays.ru/ru/talk/139167" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Ребята работают по ГОСТ — а это часто не про «написать документацию», а про коммуникации, про «правильную» структуру документа.</div><p></p><p>И вот мучались, мучались, и решили сделать свое решение. Да, оно в маркдауне и после ворда писать бывает сложновато, но тут у них ИИ, наученный помогать и подсказывать, как что-то сделать.</p><p>В итоге раньше переименовали какое-то название — это надо открыть ворд, ctrl + f, поиск, замена... А если разные падежи, оно ещё и не работает! Что сделали? Единый банк переменных.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9j3x0tTU2rxAQnvyi8KYHalxGp3IASlVwJ6xPhYTMnqutMCN8zhFagdUbCt0wdZPuxj5is4BfnMJwVtT_Bg0utiIXlpL-km7gLg34K4UtTQwcGOnW50VxncWRvVGTth-MC5e2Glv0nRiE7kKW-Db3i3qANexlj84dxlXYk9avzhfooCDHNdkkaz3LD8c/s1950/15.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9j3x0tTU2rxAQnvyi8KYHalxGp3IASlVwJ6xPhYTMnqutMCN8zhFagdUbCt0wdZPuxj5is4BfnMJwVtT_Bg0utiIXlpL-km7gLg34K4UtTQwcGOnW50VxncWRvVGTth-MC5e2Glv0nRiE7kKW-Db3i3qANexlj84dxlXYk9avzhfooCDHNdkkaz3LD8c/s320/15.jpg" width="320" /></a></div><br /><p>Ну и не только его, конечно)) В итоге что получили? Приходит заказчик:</p><p>— Ой, а давайте всё же систему именовать не АС "Документирование", а АС "Техпис"</p><p>Раньше такие просьбы за неделю до сдачи проекта вызывали желание выйти в окно, а теперь "да легко"</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgurONxnqv6h4dtNaUhPW3iwLNsY_UqZyfyKx_FuXjWjYW_glY3EN2C6Rwu87nVBt_T8xyAwxOfVm1ifOsFls4xrcLCHwgmNktYJPoP1GG_KfeRQWcHh4bznbsX4dABHRrJkDcQ3siU8AQVUBviTJP1oDt7fbPWbkyn5kWt3A_elUV7EydyshrP3CqsMR0/s1950/17.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgurONxnqv6h4dtNaUhPW3iwLNsY_UqZyfyKx_FuXjWjYW_glY3EN2C6Rwu87nVBt_T8xyAwxOfVm1ifOsFls4xrcLCHwgmNktYJPoP1GG_KfeRQWcHh4bznbsX4dABHRrJkDcQ3siU8AQVUBviTJP1oDt7fbPWbkyn5kWt3A_elUV7EydyshrP3CqsMR0/s320/17.jpg" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><p><br /></p><h3 style="text-align: left;">Масштаб, сложность, автоматизация: как агенты изменили процесс документирования в Yandex Cloud.&nbsp;Александр Яковлев</h3><p><a href="https://techwriterdays.ru/ru/talk/140813" target="_blank">Ссылка на доклад</a></p><p>Александр рассказал про их опыт внедрения ИИ. Какие инструменты использовали:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjepD3MVDj_JCHQ13GwajFNRKH4cvoxyB6bzqNhjAa35jhw6qYplCQr2feU5QYdrza77vVPkXVGGTkY7GSpRRyJ0lwDWVskTT8vh0lZBi9YDJYV1CblLam6ZzExdnEBHjtmBKbttykfmbG1vrtB6_6fuqHE2_Fudgo1sx_YMn-gYGiBxZRENK_KTj_I4NM/s1950/18.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjepD3MVDj_JCHQ13GwajFNRKH4cvoxyB6bzqNhjAa35jhw6qYplCQr2feU5QYdrza77vVPkXVGGTkY7GSpRRyJ0lwDWVskTT8vh0lZBi9YDJYV1CblLam6ZzExdnEBHjtmBKbttykfmbG1vrtB6_6fuqHE2_Fudgo1sx_YMn-gYGiBxZRENK_KTj_I4NM/s320/18.jpg" width="320" /></a></div><br /><p>Методом проб и ошибок пришли к таким выводам:</p><p></p><ul style="text-align: left;"><li>агент не работает с гитом, не пушит сам — иначе он такого напушит, что только всё испортит</li><li>тестирование документации тоже на людях — ИИ бы справился, но это хорошее время для ревью.</li></ul><div>Что входит в настройку агента:</div><div><ul style="text-align: left;"><li>системный промт</li><li>режим</li><li>фоновые знания</li></ul><div>Где в итоге агент может реально приносить пользу?</div></div><div><ol style="text-align: left;"><li>Создание структурированной информации — пошаговые инструкции, обзорные статьи</li><li>Обновление существующей документации на основе тикетов, скринов, истории изменений</li><li>Подготовка Release Notes</li><li>Анализ актуальности документации из истории изменений и релизов инструментов.</li></ol><div>Был кейс — уволился человек, который отвечал за несколько проектов. Попросили ИИ проанализировать документацию на основании как раз таки истории изменений. Да, это заняло 1.5 млн токенов, но был вау-результат и найдено много проблем в доке.</div></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Changelog на лету: автоматическая генерация с помощью GitLab.&nbsp;Татьяна Кириллова</h3><div><a href="https://techwriterdays.ru/ru/talk/141108" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>В чем разница между RN и CL?</div><div><ul style="text-align: left;"><li>Release Notes — документация для пользователей</li><li>Changelog — для разработчиков, что вообще и где менялось.</li></ul><div>Так вот. Схема до автоматизации, техпис собирает change log сам:</div></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMqqghrqhbOW3FWbHDh51Z5Fs7L1YHmNzq28iFhjJ_h1NwblUPJguwlDLwWSRrhfr1j0AsVsrHMiUGjuyw-lZiogqxlRiD8vvg8vLv6TvpFqgykgTsyVUulJ75dguFdegNHNC6Bus8ZkqzKY-QEv4vgYZPzEmhqtdE7AV4w4GdQQA0bW71RRivVTnNWWM/s1462/19.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1096" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMqqghrqhbOW3FWbHDh51Z5Fs7L1YHmNzq28iFhjJ_h1NwblUPJguwlDLwWSRrhfr1j0AsVsrHMiUGjuyw-lZiogqxlRiD8vvg8vLv6TvpFqgykgTsyVUulJ75dguFdegNHNC6Bus8ZkqzKY-QEv4vgYZPzEmhqtdE7AV4w4GdQQA0bW71RRivVTnNWWM/s320/19.jpg" width="240" /></a></div><br /><div>Неприкольно! И трудозатратно. Поэтому&nbsp;описали критерии "что хотим от автоматизации", погуглили инструменты и сравнили по своим критериям:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgklD5hvLwSMnonxnydhQ-cSGY1ZkG-rNMwWpqkiYQrMpxHfuhQiMo8P4QUdge_E83mVn_EhxaQjTHcgA6RdYDMGSCcj6fDiShKBCSZxHnHSiA9r4O4KbRtdvpBWpnmsCmAqANEPTCplt4SYcbUsgj_OGgF7sfPBvRQkPtNfIThw0iOKTwWdVFLxbeXnjs/s1950/20.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgklD5hvLwSMnonxnydhQ-cSGY1ZkG-rNMwWpqkiYQrMpxHfuhQiMo8P4QUdge_E83mVn_EhxaQjTHcgA6RdYDMGSCcj6fDiShKBCSZxHnHSiA9r4O4KbRtdvpBWpnmsCmAqANEPTCplt4SYcbUsgj_OGgF7sfPBvRQkPtNfIThw0iOKTwWdVFLxbeXnjs/s320/20.jpg" width="320" /></a></div><br /><div><br /></div><div>Простой подход, но зато выбор становится очевиден!</div><div><br /></div><div>НО! Возникла проблема — робот не человек, ему нужен шаблон. И надо вводить соглашение о коммитах, иначе все пишут как душе угодно, и собранный ченджлог будет просто нечитаем. А это надо убедить разработчиков писать "как положено" )))</div><div><br /></div><div>В итоге:</div><div><ul style="text-align: left;"><li>пока проводят ревизию сообщений</li><li>планируют прикрутить автоматическое соглашение</li></ul><div>Ну и закрепили структуру сообщения:</div></div><div><ul style="text-align: left;"><li>Номер задачи — обязательно</li><li>Тип — fix, new...</li><li>Описание&nbsp;</li><li>Тело (необязательное)</li></ul><div>Пока обкатывают, впереди ещё долгий путь)</div></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Матрица зрелости процессов работы с текстом в ИТ.&nbsp;Анна Терновая</h3><div><br /></div><div><a href="https://techwriterdays.ru/ru/talk/140637" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Зачем вообще нужна матрица зрелости? Есть несколько разных причин:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioffuYJ1JqEmZAQUg0WLjuI8zQYavFRvYo_oVAV37DFwSUOcxefQFqX9EvrrvLBQfY9puk0JOS7ZMjg3uWLmbTGeXpe3XjlD5WSVkpGXIIbopoAo3e_jwfOzpIGDxgifD93QD5nG0vK5I6kM-aKFhqN1-zW2lWucIqN-gtT-jWD-5255zMUS_EYk99c6o/s1950/29.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioffuYJ1JqEmZAQUg0WLjuI8zQYavFRvYo_oVAV37DFwSUOcxefQFqX9EvrrvLBQfY9puk0JOS7ZMjg3uWLmbTGeXpe3XjlD5WSVkpGXIIbopoAo3e_jwfOzpIGDxgifD93QD5nG0vK5I6kM-aKFhqN1-zW2lWucIqN-gtT-jWD-5255zMUS_EYk99c6o/s320/29.jpg" width="320" /></a></div><br /><div>Анна рассказала про то:</div><div><ul style="text-align: left;"><li>Какую литературу использовали при изучении темы</li><li>Какую матрицу выбрали себе</li></ul><div>Главная фишка — делить каждую колонку на "наших и ваших", команду разработки и команду документирования. Потому что уровни зрелости могут быть разные и повлиять на чужую команду вы можете не всегда.</div></div><div><br /></div><div>Ну а дальше смотрим на примерах, как могут выглядеть эти матрицы и что с этим делать. Когда уже есть внедренное решение, всегда можно показать "незрелой" команде пользу — смотрите, вот мы выросли в матрице и какие это профиты дало!&nbsp;</div><div><br /></div><div>Так что нужно заручиться поддержкой одной из команд, а потом история успеха будет продвигать вас сама =)</div><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Подготовка к документированию: читаем ТЗ, собираем информацию.&nbsp;Софья Новикова</h3><div><a href="https://techwriterdays.ru/ru/talk/138958" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Софья рассказывала, как собирать информацию из разных источников:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv2hhuxFD3OM5JWkCwBVjm80ouRCIPJgpQNgcXr2tGjuZ1xpIdBIN_gsDry5dAZlKQq5a96NZVVe2wPiqKE1tUz6Cy2kmV0ApBrQQX06Du2E9AFjo6saLewTa2xraLCfNWHS057qA3IDvyoLbTsniIKhxGvVYeMeD65HeBdfHTaVrgpYl1jldnz43TYLU/s1280/21.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv2hhuxFD3OM5JWkCwBVjm80ouRCIPJgpQNgcXr2tGjuZ1xpIdBIN_gsDry5dAZlKQq5a96NZVVe2wPiqKE1tUz6Cy2kmV0ApBrQQX06Du2E9AFjo6saLewTa2xraLCfNWHS057qA3IDvyoLbTsniIKhxGvVYeMeD65HeBdfHTaVrgpYl1jldnz43TYLU/s320/21.jpg" width="320" /></a></div><br /><div>А ещё, если документация разбита на разделы, техписы вычитывают каждый раздел — всё ли понятно? А если нет, термины можно сначала погуглить или спросить у ИИ, чтобы не отвлекать коллег лишний раз вопросами!</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4mdNpg2PBoioKgPW_Q5fDpWcT7ntyc7YrCojSuInxQJbmx_Pxf0TfGUM8EVbDgry6Lz9ss1tQuSxpbILcbYou0WVwyLE63gagTXzYPDP0JvP5OkjB_bK0R7pSeD6WI8c6y02NXpr7r-sNq32D-5YHu6iX8PxvVaBjWFfpX-sPIEaEmGvlBdzAQMMMDT8/s1950/23.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4mdNpg2PBoioKgPW_Q5fDpWcT7ntyc7YrCojSuInxQJbmx_Pxf0TfGUM8EVbDgry6Lz9ss1tQuSxpbILcbYou0WVwyLE63gagTXzYPDP0JvP5OkjB_bK0R7pSeD6WI8c6y02NXpr7r-sNq32D-5YHu6iX8PxvVaBjWFfpX-sPIEaEmGvlBdzAQMMMDT8/s320/23.jpg" width="320" /></a></div><br /><div>В общем, если информации у вас мало, учитесь её собирать из разных мест, в том числе у коллег. База? База, но о ней надо помнить.</div><div><br /></div><div><br /></div><h3 style="text-align: left;">Документация как зеркало продукта: роль технических писателей в улучшении пользовательского опыта.&nbsp;Эльвира Дёгтева</h3><div><a href="https://techwriterdays.ru/ru/talk/139119" target="_blank">Ссылка на доклад</a></div><div><br />Эльвира рассказала кейсы из жизни, когда пытаешься сделать мелкую задачу, которая выливается в большой рефакторинг))</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYOy_CVAmLFA1JKVH_svz5fSaiYiaG_RCEL_Xlo664WDtOSdGBj0KKm4Qi2Kr4hyphenhyphenqwu9p9NdjPN8UGnMhuPNmTrRTH55DSU60mibnvVmt6EA6Dbw3K7k5Yu2UzKPdoCZ-7piJDOi738e85VoeMK3sbeDHDQQpJqRTQ-PMS70k02K48RTU_reZxj8QZeN0/s1280/24.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYOy_CVAmLFA1JKVH_svz5fSaiYiaG_RCEL_Xlo664WDtOSdGBj0KKm4Qi2Kr4hyphenhyphenqwu9p9NdjPN8UGnMhuPNmTrRTH55DSU60mibnvVmt6EA6Dbw3K7k5Yu2UzKPdoCZ-7piJDOi738e85VoeMK3sbeDHDQQpJqRTQ-PMS70k02K48RTU_reZxj8QZeN0/s320/24.jpg" width="320" /></a></div><br /><div>Кейсы из жизни — это всегда интересно. И тут как раз кейсы из серии "пройти мимо, сделав вид, что всё ок, не моя же зона ответственности", или начать копать... И копать... И копать))) Интересные истории!</div><div><br /></div><div><br /></div><h3 style="text-align: left;">Трансфер знаний от уходящих сотрудников.&nbsp;Denis Mazin</h3><div><a href="https://techwriterdays.ru/ru/talk/140884" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Тут интересная история — каким-то образом ребята выявили, что 18% сотрудников в зоне риска ухода. И надо бы передать их знания, пока они не пропали...</div><div><br /></div><div>Накидали такую матрицу:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQbx6iepAPSz3YcOymoBNc4oeeQU9k1h89QjdrnvEeE_LjLPH6oAPZy3Od5u6YKHVQf_4Y9V5-CatZhu1a4pzfE1ht0LkEuTcZezBqDTz2BQLGruOWE5yBTJSWHuEmZz66EziAuK7o1zOWhKhB8XH9BMHfayBFa9cNpNtHDtepVvYi_spPSikA8O59bhk/s1950/25.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQbx6iepAPSz3YcOymoBNc4oeeQU9k1h89QjdrnvEeE_LjLPH6oAPZy3Od5u6YKHVQf_4Y9V5-CatZhu1a4pzfE1ht0LkEuTcZezBqDTz2BQLGruOWE5yBTJSWHuEmZz66EziAuK7o1zOWhKhB8XH9BMHfayBFa9cNpNtHDtepVvYi_spPSikA8O59bhk/s320/25.jpg" width="320" /></a></div><br /><div>Запланировали передачу знаний и понеслось... Сначала сотрудникам некогда этим заниматься. Благо начальство поддержало и поставило высокий приоритет задаче. Но всё равно работу тоже надо работать.</div><div><br /></div><div>В итоге за год сделали многое, и пришли к неожиданному выводу, что передача знаний — это не разовая акция, а постоянная. Уйти может любой, заболеть, а знания брать где? Так что ребята теперь работают над встраиванием этого процесса в основной.</div><div><br /></div><div><br /></div><h3 style="text-align: left;">Матрица итеративного редактирования. Анна Штольц&nbsp;</h3><div><a href="https://techwriterdays.ru/ru/talk/138854" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Редакторы постоянно сталкиваются со сжатыми сроками. Дают текст на 250 стр и говорят, что есть полчаса. Что делать?</div><div><br /></div><div>В идеале нулевым этапом надо текст просто прочитать — тогда поймешь, хватит времени или надо сразу просить сроки увеличить.</div><div><br /></div><div>Ну а потом идет итеративное вычитывание, потому что так проще, если держать в уме сразу всё, что-то обязательно пропустишь. Да и не всегда нужна полная и подробная вычитка.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ_VJ0qgw92qTtOIRybaT94O-wSj7dmQcHhaI1aQSDHvb9iJvRITUCWXE1NyrbsSlfbp1xCaDe-aLaNMyrjslHUod4pn1kq7z-mnskVfp5_HuHQA3FRNiSpWvG273XmcItlOB17tx6jZNzNGpvDiuuaHKYQT4OkQIWCmrvItcQ0VOwJr2LEKftSp5T_vc/s1280/26.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1280" data-original-width="960" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ_VJ0qgw92qTtOIRybaT94O-wSj7dmQcHhaI1aQSDHvb9iJvRITUCWXE1NyrbsSlfbp1xCaDe-aLaNMyrjslHUod4pn1kq7z-mnskVfp5_HuHQA3FRNiSpWvG273XmcItlOB17tx6jZNzNGpvDiuuaHKYQT4OkQIWCmrvItcQ0VOwJr2LEKftSp5T_vc/s320/26.jpg" width="240" /></a></div><br /><div><br /></div><div>Выделили такие этапы:</div><div><ol style="text-align: left;"><li>Корректура — почти на автомате, всякие опечатки (странно, что не передали это ИИ)</li><li>Литературная правка</li><li>Выравнивание стиля — много жаргона? Это плохо.</li><li>Фактчекинг — названия, имена, даты, логика повествования</li><li>Отделка</li></ol><div>Интересно было посмотреть со стороны, как преображается текст, так как Анна показывала все на конкретном примере, а в итоге «до — после».&nbsp;</div></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Уровни качества документирования.&nbsp;Оксана Гаврюшенко</h3><div><a href="https://techwriterdays.ru/ru/talk/138400" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Оксана работает в компании, которая делает документацию на заказ. Поэтому каждый раз нужно отвечать заказчику на вопрос «почему так дорого».&nbsp;</div><div><br /></div><div>Так что ребята сделали разную градацию — что нужно? Одноразовая работа? Чтобы документация потом жила? Должна ли соответствовать ГОСТ? И прочее. Всё это влияет на сроки и стоимость. И главное, что надо научиться понимать — разницу между желаемым и достаточным.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiATHhBUqpXX_iOHY0skNKdmrDB_w7eMtwathGPtcYm2KDFvcdt6o5sPZQHaqV3qSwDV1gbLZNXo4z1jVden1TLmwej0KQDQkc0-5Q-pUY4JR8ADW8nSfF1QOaXFJAHvVZ6iEEKPdfnT-bSAydq9YXyz2LODPKGCxUcTzK9kt_cZTdqbed1dbK2z6T03EQ/s1280/27.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiATHhBUqpXX_iOHY0skNKdmrDB_w7eMtwathGPtcYm2KDFvcdt6o5sPZQHaqV3qSwDV1gbLZNXo4z1jVden1TLmwej0KQDQkc0-5Q-pUY4JR8ADW8nSfF1QOaXFJAHvVZ6iEEKPdfnT-bSAydq9YXyz2LODPKGCxUcTzK9kt_cZTdqbed1dbK2z6T03EQ/s320/27.jpg" width="320" /></a></div><br /><div><br /></div><div>Ну а в докладе Оксана приводит примеры своих матриц влияния результата на стоимость. Вполне любопытно посмотреть на чужой подход)</div><div><br /></div><div><br /></div><h3 style="text-align: left;">Декомпозиция страха: практики взаимопонимания для руководителей и команд техписателей. Мария Макеева</h3><div><br /></div><div><a href="https://techwriterdays.ru/ru/talk/137270" target="_blank">Ссылка на доклад</a></div><div><br /></div><div>Каюсь, на этот доклад я залетела случайно. Исходно собиралась в секцию B, но очень уж название зацепило. Прочитав название (не описание), я подумала, что там будет та же проблема, что звучала на конференции чуть ранее — когда другие отделы не понимают ценность техписов и надо ходить, доказывать её.</div><div><br /></div><div>Мне стало интересно послушать такой доклад, вот я сюда и завернула. А это доклад про то, как вырасти в руководителя был =))) Но тоже неплохой, как стать хорошим руководителем, а не просто начальником с кнутом!</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXozNBctz6wF8wCIl7dBDyPMVN5ur9obq5StbCo1rQdFEDvgUd-s6fFF-LYmpvE0U2fncozmpm-GFn7n-tzcNHTWCpMseDlLvmSzvhb4UZwPI6G15I9NqeXMfYAAjW5CVJgyGI6TSCCKVHPh0J36TH9KKor_x6NOV5rwhEBkrZBGKWj4E_hdp-3J8JO7o/s1280/28.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXozNBctz6wF8wCIl7dBDyPMVN5ur9obq5StbCo1rQdFEDvgUd-s6fFF-LYmpvE0U2fncozmpm-GFn7n-tzcNHTWCpMseDlLvmSzvhb4UZwPI6G15I9NqeXMfYAAjW5CVJgyGI6TSCCKVHPh0J36TH9KKor_x6NOV5rwhEBkrZBGKWj4E_hdp-3J8JO7o/s320/28.jpg" width="320" /></a></div><div><br /></div><div><br /></div><div><h3>Орг вопросы</h3></div><div>Место проведения — удобная гостиница, которая находится прямо около метро (что большой плюс). Места всем хватает, еды на обеде много всякой разной и вкусной.</div><div><br /></div><div>Помимо обеда — всякие ништяки в кофе зоне. Причем с утра и после обеда это что-то мясное / рыбное. Бутербродики, например. Чтобы можно было перекусить, если пропустил завтрак или приехал на конференцию прям с поезда. Очень здорово сделано ????</div><div><br /></div><div>Плюс комната для отдыха с аэрохоккеем, VR-очками и даже игровым автоматом)))&nbsp;</div><div><br /></div><div>А ещё куча разных стендов, где тоже и розыгрыши есть, и пообщаться с докладчиками можно. А ещё туда издательство Питер приезжает и книги продает, дешевле, чем в магазине. Я там прибарахлилась немношко)) Жаль, что серию Head First O`Really они больше не возят, я бы из неё пару книг тоже взяла...</div><div><br /></div><div>Но в любом случае, заняться вам всегда будет чем. А ещё на конференции есть много людей, готовых вам помочь и ответить на все вопросы, так что по орг части никаких вопросов нет)</div><div><br /></div><div><br /></div><div><h3>Резюме</h3></div><div>Конференция — это всегда место вдохновления. И место встреч! Когда ещё вы сможете встретиться с коллегами, живущими в других городах?)))</div><div><br /></div><div>Я рада, что конференция для технических писателей — это теперь отдельная конференция, для всех, кто любит документацию, кто тем или иным образом участвует в её создании. Документация — это очень важно! И здорово, что теперь есть, где поделиться своим опытом!&nbsp;</div><div><br /></div><div>Буду теперь ждать&nbsp;TechWriter Days 4 =)</div><p></p>]]></description>
<link>http://okiseleva.blogspot.com/2026/04/techwriter-days-3.html</link>
<pubDate>Tue, 07 Apr 2026 15:44:00 +0300</pubDate>
</item>
<item>
<title>Ричард Румельт. Взлом стратегии.</title>
<description><![CDATA[<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhflD4_j2vfwFvdByTvMH5zJY1VNkQKlq2H_m109zHof1OBGioGoSfhyphenhyphenqeyFfguHnjWZwgtCAfcS-zTHJf6NGtLbrWumHctBzol1xRAzoakzAWMsPvzkB_q1cUnXYBR5Hy7YIB8ai1zlORjfC6pc-zevWm9hzCk43AYitMsIPrqklqSxDF2mPoIgn6VexdJ/s637/1000001446.webp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="637" data-original-width="415" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhflD4_j2vfwFvdByTvMH5zJY1VNkQKlq2H_m109zHof1OBGioGoSfhyphenhyphenqeyFfguHnjWZwgtCAfcS-zTHJf6NGtLbrWumHctBzol1xRAzoakzAWMsPvzkB_q1cUnXYBR5Hy7YIB8ai1zlORjfC6pc-zevWm9hzCk43AYitMsIPrqklqSxDF2mPoIgn6VexdJ/s320/1000001446.webp" width="208" /></a></div><br /><p><br /></p><p>Книжка - говно, хотя в ней и есть неплохие моменты.</p><p>Написана уставшим еба-консультантом, который уже много раз помогал стратегировать в разных компаниях в те времена когда стратегировать было модно и нанимать консультантов тоже.</p><p>Толика полезной информации в книге есть, но не что-то удивительное до чего не дойти собственной головой на практике.</p><p><br /></p><p>Читать не стоит.</p><p><br /></p><p>Оценка 1/10.</p>]]></description>
<link>http://test-failed.blogspot.com/2026/04/blog-post.html</link>
<pubDate>Tue, 07 Apr 2026 11:42:00 +0300</pubDate>
</item>
<item>
<title>Мои 12 недель в году. Часть 33 (вышла книга по SQL, закончила книгу про ИИ)</title>
<description><![CDATA[<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA2l-uVPius3f6B8xuloQHfhz-palIX60PvHdIEj1eiGaiIPQ-LH16EKL8lMZ_vBRxA_kBOpVcsWOj5NhzJR3zbthm2NFiHiUTdPB95Ke0-n9gBAVuA1fGiir0ecmwgLli4GDtuX57W9iYvIyiuUAJBcOJtZA-iZdjB5t7BUakzWwapqZivfjIEny1chI/s1950/IMG_20260312_190851.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA2l-uVPius3f6B8xuloQHfhz-palIX60PvHdIEj1eiGaiIPQ-LH16EKL8lMZ_vBRxA_kBOpVcsWOj5NhzJR3zbthm2NFiHiUTdPB95Ke0-n9gBAVuA1fGiir0ecmwgLli4GDtuX57W9iYvIyiuUAJBcOJtZA-iZdjB5t7BUakzWwapqZivfjIEny1chI/s320/IMG_20260312_190851.jpg" width="320" /></a></div><br /><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-line: none;">Первый опыт</a><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif">,&nbsp;</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-line: none;">второй</a><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif">,&nbsp;</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-line: none;">3</a><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif">,&nbsp;</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-line: none;">4</a><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif">,&nbsp;<a href="https://okiseleva.blogspot.com/2018/06/12-5.html" style="color: #6699cc; text-decoration-line: none;">5</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2018/09/12-6.html" style="color: #6699cc; text-decoration-line: none;">6</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2018/12/12-7.html" style="color: #6699cc; text-decoration-line: none;">7</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2019/03/12-8.html" style="color: #6699cc; text-decoration-line: none;">8</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2019/06/12-9.html" style="color: #6699cc; text-decoration-line: none;">9</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2019/09/12-10.html" style="color: #6699cc; text-decoration-line: none;">10</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2019/12/12-11.html" style="color: #6699cc; text-decoration-line: none;">11</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2020/03/12-12.html" style="color: #6699cc; text-decoration-line: none;">12</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2020/06/12-13.html" style="color: #6699cc; text-decoration-line: none;" target="_blank">13</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2020/09/12-14.html" style="color: #336699; text-decoration-line: none;" target="_blank">14</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2021/04/12-15.html" style="color: #336699; text-decoration-line: 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-line: none;" target="_blank">16</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2021/11/12-17.html" style="color: #336699; text-decoration-line: none;" target="_blank">17</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2022/02/12-18.html" style="color: #336699; text-decoration-line: none;" target="_blank">18</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2022/06/12-19.html" style="color: #336699; text-decoration-line: none;" target="_blank">19</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2022/09/12-20.html" style="color: #336699; text-decoration-line: none;" target="_blank">20</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2022/12/12-21.html" style="color: #336699; text-decoration-line: none;" target="_blank">21</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2023/03/12-22.html" style="color: #336699; text-decoration-line: none;" target="_blank">22</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2023/06/12-22-dump-sqa-days.html" style="color: #336699; text-decoration-line: none;" target="_blank">23</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2023/09/12-24.html" style="color: #336699; text-decoration-line: none;" target="_blank">24</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2023/12/12-25-sqa-days.html" style="color: #336699; text-decoration-line: none;" target="_blank">25</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2024/04/12-26-3.html" style="color: #336699; text-decoration-line: none;" target="_blank">26</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2024/07/12-27-css.html" style="color: #336699; text-decoration-line: none;" target="_blank">27</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2024/10/12-28-graphql.html" style="color: #336699; text-decoration-line: none;" target="_blank">28</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2025/01/12-28.html" style="color: #336699; text-decoration-line: none;" target="_blank">29</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2025/04/12-30-chatgpt.html" style="color: #336699; text-decoration-line: none;" target="_blank">30</a>,&nbsp;<a href="https://okiseleva.blogspot.com/2025/07/12-31-sqa-days.html" style="color: #336699; text-decoration-line: none;" target="_blank">31</a>, <a href="https://okiseleva.blogspot.com/2025/11/12-32.html" target="_blank">32</a></span></p><p><br /></p><h3 style="text-align: left;">Что это за техника</h3><p>Вы собираетесь с друзьями в группу и ставите себе цели на 12 недель (3 месяца). Это могут быть как рабочие, так и личные задачи. Такие, которые вы вроде как хотите сделать, но вечно откладываете, так как «некогда, потом, щас, вот только мелочевку разгребу и тот пожарчик потушу».</p><p><br /></p><p>Настало время заняться тем, чем действительно хочется!&nbsp; Отталкиваясь от глобальных целей, составляете план на неделю. И раз в неделю встречаетесь с группой и обсуждаете, сколько успели, сколько нет. Какой план на следующую неделю. Я, правда, уже давно не встречаюсь, а просто веду файлик "что сделано", откуда потом и просматриваю всё, что успела за цикл.</p><p><br /></p><h3 style="text-align: left;">Результаты кратко</h3><p>Основной план:</p><p><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">????</span>&nbsp;книга по чату — закончить&nbsp;</p><p><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">????</span>&nbsp;книга по чату — вычитать</p><p><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">????</span>&nbsp;книга по тайм-менеджменту — написать 1 главу</p><p><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>&nbsp;1 статья на Хабр</p><p>С книгой новой чуток продолбалась, а вот курс отложила не по своей вине. Там огромная боль, но об этом чуть ниже...&nbsp;</p><p>На самом деле, с учетом двух госпитализаций плановых очень неплохой результат, там же пока врачей обойти, справки собрать... А ещё почти месяц болели по кругу... В общем, «время есть? Делай!», иначе потом придет какой-нибудь песец ????????</p><p>Кратко что сделала:</p><p></p><ol style="text-align: left;"><li>Книга 4, SQL:&nbsp;</li><ol><li>прошли верстку!</li><li>книга уже <a href="https://okiseleva.blogspot.com/2026/01/sql.html" target="_blank">вышла в продажу</a>!</li></ol><li>Книга 5, ChatGPT:</li><ol><li>закончила книгу!&nbsp;</li><li>вычитала её, от души наредактировав</li><li>принимаю картинки, пока ещё не все готовы</li></ol><li>Курс по автоматизации в Postman:</li><ol><li>Записала ещё пару уроков, обработала</li><li>Поставила на паузу, потому что в Postman обновилось всё, и сниппеты, и документация&nbsp;<span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">＼(〇_ｏ)／</span></li></ol><li>Статьи на Хабр — 1 статья&nbsp;</li><li>Пополнила свой youtube-канал — 1 видео&nbsp;</li><li>Инструменты 12 недель — продолжаю вести файлик DONE, это все еще очень круто</li><li>Новый год!&nbsp;</li><li>Новогодняя фотосессия )))</li><li>Две госпитализации у младшей дочери (плановые, гемангиома)</li><li>Записалась в зал, начала заниматься ????</li></ol><span><a name='more'></a></span><div><br /></div><p></p><h3 style="text-align: left;">Результаты подробнее</h3><div><div><br /></div><h3 style="text-align: left;">Книга 4: SQL</h3></div><p></p><div>В прошлом цикле я книгу прошла редактуру, но верстка только началась. В декабре мы закончили верстку, встали в очередь в типографию и книга уже даже успела&nbsp;<a href="https://okiseleva.blogspot.com/2026/01/sql.html" target="_blank">выйти в продажу</a>! И всё за один цикл!&nbsp;<span lang="EN-US" style="font-family: &quot;MS Gothic&quot;; font-size: 11pt; line-height: 107%;">＼</span><span style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 107%;">(</span><span lang="EN-US" style="font-family: &quot;MS Gothic&quot;; font-size: 11pt; line-height: 107%;">〇</span><span style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 107%;">_</span><span lang="EN-US" style="font-family: &quot;MS Gothic&quot;; font-size: 11pt; line-height: 107%;">ｏ</span><span style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 107%;">)</span><span lang="EN-US" style="font-family: &quot;MS Gothic&quot;; font-size: 11pt; line-height: 107%;">／</span></div><p></p><p></p><div>Кайф =)))</div><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Книга 5: ChatGPT</h3><div><br /></div><div>В <a href="https://okiseleva.blogspot.com/2026/01/2025.html" target="_blank">новогоднем посте</a>&nbsp;я писала, что после провала с SQL (когда я так накосячила внутри книги, что от меня редактор отказался) «я буду умнее, отдам художницам картинки и буду вычитывать книгу, а не просто ждать!».</div><div><br /></div><div>Так вот. В январские праздники я закончила книгу, ю-ху! И маякнула художницам, что жду только их... Даже немного дежавю повеяло, с SQL все было точно также, просто год назад))</div><div><br /></div><div>Обещание «быть умнее» я сдержала! Картинки жду, сама стала перечитывать книгу. Оказалось, это прям реально хороший план! Хоть книгу про ИИ я написала меньше, чем за год, вернуться к старому тексту это как в программировании:</div><div><br /></div><div>— Кто эту фигню написал?! Ой, это был я...</div><div><br /></div><div>Почти 2 месяца вычитывала. Ну, точнее как. Читаешь — не нравится. Думаешь, как переделать, а это время... Плюс в исходном варианте вообще не было главы про баг-трекинг, а я смотрела-смотрела на содержание... И решила добавить! А это глава с нуля...&nbsp;</div><div><br /></div><div>В общем, что-то местами поменяла, что-то переписала, что-то удалила, что-то пополнила... Работы получилось много! Но! Я всё сделала за один цикл!!</div><div><br /></div><div>Есть и грустная новость — книга всё ещё не сдана. И тут дежавю уже не работает... Год назад я ждала до марта, но в марте мы всё сдали. А сейчас почти апрель, обе ещё работают...</div><div><br /></div><div>Я как раз сегодня потыкалась в нано банано и отправила редактору результат с вопросом, подойдет ли для верстки? А то ведь на картинки художниц чуть ли не инструкция была — цвет шрифта, разные слои текста и картинки, обязательно оригинал фотошоп файла... С другой стороны, вставляли же мы скриншоты, и нормально.</div><div><br /></div><div>В общем, обсудили с издательством, мне дали добро на использование картинок с ИИ. Так что следующая книга будет уже с моим авторством изображений =))) Ну, процентов на 70-90, я думаю, что художницам тоже что-то оставлю...</div><div><br /></div><div>Единственная беда — сама по себе нано банана стоит как крыло самолета (около 25к за год), вроде как дешевле взять чат с её функцией, но какой? Пока изучаю тему... Если есть что посоветовать, я вся внимание =)&nbsp;</div><div><br /></div><div>Ну а статус книги — закончила, уже всё вычитала и причесала, жду художниц! В следующем цикле то точно дождусь (или уже в этой книге заменю на ИИ ????)</div><div><br /></div><div><br /></div><div><h3>Книга 6: Тайм-менеджмент</h3><div><br /></div></div><div>Итак, к февралю я уже подразгреблась с 5-ой книгой и стала свободна. А зачем время терять? Занялась следующим проектом. Очень уж хочется мне книгу про тайм-менеджмент написать, про свой опыт 12 недель)))</div><div><br /></div><div>Я пока прикинула такое содержание — 3 части книги:</div><div><ol style="text-align: left;"><li>Вводная, что это такое и всякое общее (мотивация и тд)</li><li>Техники, которые мне НЕ зашли (но могут зайти другим)</li><li>Техники, которые мне зашли и уже 9 лет со мной!</li></ol><div>Примерные главы:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghrXaGSWTGH4AN71nuWY1Ujl-HYE3B5M4-4lZ8i6YukLGQPEDbMoNiciWdPEC_8P4v23t_P22gBxgKze5sseMPOIUZg3K2ctp226HKW3bB_rsR8L7Z6r0LLoDH_5ieGzb6s9fympvlhqATT3wmeRGOUNuFN26z6OX-_4d9MrsguiJAFSGOPrq4NsglnE8/s1157/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1157" data-original-width="825" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghrXaGSWTGH4AN71nuWY1Ujl-HYE3B5M4-4lZ8i6YukLGQPEDbMoNiciWdPEC_8P4v23t_P22gBxgKze5sseMPOIUZg3K2ctp226HKW3bB_rsR8L7Z6r0LLoDH_5ieGzb6s9fympvlhqATT3wmeRGOUNuFN26z6OX-_4d9MrsguiJAFSGOPrq4NsglnE8/s320/1.png" width="228" /></a></div><br /><div><br /></div><div>Я прошлась по всем своим постам из цикла 12 недель и насобирала «мяса», раскидав текст по разным главам. Теперь осталось его переосмыслить, дополнить, и будет красота!</div></div><div><br /></div><div>Пока сижу на первой главе, как обычно, начало самое сложное. Потом уже можно будет раскачаться, сделать примерную структуру глав и пойдет как по маслу. Пока — раскачиваюсь!</div><div><br /></div><div>Но вообще план на год — написать 2 книги, и это помимо книги про ИИ, потому что её я дописала в январе. Посмотрим, смогу ли!</div><div><br /></div><div><br /></div><div><h3 style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; margin: 0px; position: relative;">Курсы</h3></div><div><br /></div><div><br /></div><div><b>Автоматизация в Postman</b></div><div><br /></div><div>У меня был план перезаписать <a href="https://testbase.ru/learn/rest-auto-in-postman" target="_blank">курс по автоматизации в Postman</a>.&nbsp;</div><div><br /></div><div><div>Прошлый результат — 9 уроков готовы, 10-ый записан, в обработке.</div><div>Текущий — 11 уроков готовы.</div></div><div><br /></div><div>Причем 11 уроков я доделала ещё в январе, 29 числа всё сделала. Радостная такая была, осталось всего 3 урока! А дальше можно и цену поднять, ведь курс обновлен!</div><div><br /></div><div>А потом... Потом постман обновился. Причем не как раньше, чуток. Не-е-е-е-т... Они:</div><div><br /></div><div>1. Кардинально изменили внешний вид и структуру документации. А я ведь учу изучать документацию... Я ведь в уроках показываю "вот пошли в доку, читаем там...". И все эти уроки разом устарели... 10 лет! Документация менялась, но не кардинально... И вот сейчас (((</div><div><br /></div><div>2. Судя по примерам в новой документации, изменен стиль автотестов. То есть код надо писать чуть-чуть по-другому. Это мне тоже непонятно, ведь столько автотестов уже написано, зачем их "ломать"?</div><div><br /></div><div>Да, старые тесты пока работают, но надолго ли? А то чувствую, потом скажут "не работает тест? Обновляйте через постбота!", а он может такой ерунды нагородить...</div><div><br /></div><div>В общем, тесты тоже теперь неактуальны. При этом! В документации уже новые тесты, в самом постмане в сниппетах ещё старые. То есть пока (на начало февраля) ещё не синхронизировали документацию с инструментом.</div><div><br /></div><div>Плюс в марте вышли новые изменения в «что платно, что бесплатно», поэтому с февраля у меня обновление курса на паузе. Я жду, когда все перетурбации закончатся, чтобы... Дописать 3 урока и переписать всё, что снова устарело (((</div><div><br /></div><div>Самое обидное — я взялась переписывать курс просто, чтобы было. Просто потому, что большая часть курса записана почти 5 лет назад и студенты на это указывают, даже если урок актуален. Потребности обновлять весь курс не было, ну разве что пару уроков. А теперь...</div><div><br /></div><div>Обновились бы они так год назад, ну или я бы дооткладывала перезапись, вот сейчас было бы идеальное время. А так... Я год потратила на работу, которая полетела в мусорку. Год обновляла курс, который снова устаревший, капец.</div><div><br /></div><div>Конечно, всё было не зря. Я ОЧЕНЬ много всего изменила в курсе. Где-то добавила доп. материалов, где-то обновила домашние задания... Так что не всё в мусор, но демотивация была сильнейшая.&nbsp;</div><div><br /></div><div>Ну, чтож... Бывает...</div><div><br /></div><div><br /></div><div><div><br /></div><div><b>Остальные курсы</b></div></div><div><b><br /></b></div><div>По остальным курсам мелкие правки по замечаниям от студентов чуток правим описание ДЗ или теста.</div><div><br /></div><div>Есть планы на новый курс-два, но вроде занялась одним курсом, потом заболели дети, потом мы сами, потом ещё один нежданчик прилетел, и вот до сих пор пытаюсь вернуться к работе...</div><div><br /></div><div><br /></div><div><h3 style="text-align: left;">Хабр</h3><div>Одна статья, всё по плану =))) Есть идеи на новые, но пока руки не дошли...</div><div><br /></div><div><a href="https://habr.com/ru/articles/1003554/" target="_blank">1 тест = 1 проверка. Чем хорош принцип атомарности в автотестах в Postman</a></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Блог</h3><div>В блог я стала выписывать примеры использования ИИ:</div><div><br /></div><div><a href="https://okiseleva.blogspot.com/2026/01/chatgpt.html" target="_blank">ChatGPT, подсчитай количество страниц в книге и авторских листов</a></div><div><br /></div><div>И рассказывать о том, чего «в 21 веке уже не бывает» по версии моих студентов, ага:</div><div><br /></div><div><a href="https://okiseleva.blogspot.com/2026/02/blog-post.html" target="_blank">Новый функционал? Подождем до последнего. Как банки к АУСН подключались</a></div><div><a href="https://okiseleva.blogspot.com/2026/03/blog-post.html" target="_blank">Эльба: ну вы там как-нибудь сами проверьте, где ошибка произошла</a></div></div><div><br /></div><div>Не очень много, надо бы исправиться, в первую очередь в статьях на Хабр. Я попробую сделать чуть больше!</div><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Ютуб / ВК</h3><div><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">Мой канал —&nbsp;</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-line: 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;">&nbsp;(</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-line: none;" target="_blank">Дубль в ВК</a><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">).</span></div><div><br /></div><div>Тоже грустновато, всего 1 видео:</div><div><br /></div><div><a href="https://youtu.be/7xSyW_mU07A" target="_blank">1 автотест = 1 проверка. Почему этот принцип хорош</a>&nbsp;(<a href="https://vkvideo.ru/video-227447987_456239169" target="_blank">Видео в ВК</a>)&nbsp;</div><div><br /></div><div>Вот тут я хочу хотя бы 2-3 видео выпускать, а то зашла внутрь канала и грустненько стало... Вот этот пункт мне точно надо прокачать!</div><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Всякое разное, не рабочее</h3><div><br /></div><div><b>Семья, дети</b></div><div><br /></div><div>Катюше уже 9.5 мес, она научилась садиться, вставать, ползать на четвереньках и даже немного ходить!</div><div><br /></div><div>Сейчас у нас&nbsp;"вставать всегда, вставать везде, вот лозунг мой, и солнца!"</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH32_HmZjLg2DJjC2jadu4FLNZOzF1TW-_Sk5sRHGL5EAZezY0z9DHSS_rt6OYU9Z41WkJElYzf97vWl4xeIciAx3DYVntv2TOrve8p7XJDgWqsT0EaK0fBUGamefs2wtvrhf3-T1MWfojTFVTYCRrZ26rJKQWc5tog4IvgbPrHnlnZY-wVS5sZ8VtY5o/s1950/11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1462" data-original-width="1950" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH32_HmZjLg2DJjC2jadu4FLNZOzF1TW-_Sk5sRHGL5EAZezY0z9DHSS_rt6OYU9Z41WkJElYzf97vWl4xeIciAx3DYVntv2TOrve8p7XJDgWqsT0EaK0fBUGamefs2wtvrhf3-T1MWfojTFVTYCRrZ26rJKQWc5tog4IvgbPrHnlnZY-wVS5sZ8VtY5o/s320/11.jpg" width="320" /></a></div><br /><div>Мы в январе и марте госпитализировались по гемангиоме, прижигали лазером. Пьем атенолол, чтобы ушел объем, следим...</div><div><br /></div><div>Но из-за госпитализаций никак не можем поставить Леше живую вакцину — надо ж сначала Катю привить. А Катя то болеет, то госпитализация скоро... В марте плюнули и поставили прививку за неделю до больницы, иначе мы так совсем от графика отстанем. Теперь Кате осталась 1 прививка и можно Леше живую давать, ура!</div><div><br /></div><div>А ещё госпитализация — это пройтись по врачам, собрать справки, сделать эхо, ЭКГ и тд... Отжирает времени много (((</div><div><br /></div><div>А ещё дети болели... А болеем мы тяжело, двое малышей — это неделя без сна, минимум. Потом заболеем сами / бабушка, и снова не отдохнешь или поработаешь вечером, потом ещё по кругу может пойти...</div><div><br /></div><div>В общем, мы проболели почти весь декабрь и почти весь февраль. 2 месяца из 3, огонь! Так что я еще много всего успела))</div><div><br /></div><div><br /></div><div><b>Остальное</b></div><div><br /></div><div>Ходили в кино!</div><div><br /></div><div>1. «Злая 2» — очень круто, я в целом догадывалась о концовке, это было логично, но очень понравилось, как они все завертели там))</div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Проверка планов, поставленных в прошлый раз</h3><div><br /></div><div><div style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">Основные цели:</div><div style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><ul style="line-height: 1.4; list-style-image: initial; list-style-position: initial; margin: 0.5em 0px; padding: 0px 2.5em;"><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b><b><span style="font-weight: 400;">????&nbsp;</span></b>Книга по ChatGpt&nbsp;</b>— закончить книгу → готово!</li><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b><b><span style="font-weight: 400;">????&nbsp;</span></b>Книга по ChatGpt&nbsp;</b>— вычитать её&nbsp;&nbsp;→ готово!</li><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b><b><span style="font-weight: 400;">????&nbsp;</span></b>Книга по тайм-менеджменту</b>&nbsp;— написать 1 главу → в процессе)) Зато насобирала мяса на 20 других глав!</li><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b>Курсы&nbsp;</b>— постман сделать ещё 3 лекции (не верю в полную перезапись с учетом новогодних праздников и начала садика = болезней) → 3 лекции сделала!</li><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b></b>Статья на Хабр&nbsp;</b>— ну хоть одну! → одна и вышла)</li></ul></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;">Найс ту ду:</div><div style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><ul style="line-height: 1.4; list-style-image: initial; list-style-position: initial; margin: 0.5em 0px; padding: 0px 2.5em;"><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b>Youtube-канал</b>&nbsp;— 2 шт — уменьшаем цель до реально достижимой)) → не сделала ((( Но результат достижимый!</li><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b><b><b><b><b><span style="font-weight: 400;">????&nbsp;</span></b></b></b></b>Встретиться с друзьями&nbsp;</b></li></ul></div></div><div><br /></div><div><h3 style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; margin: 0px; position: relative;"><br /></h3><h3 style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; margin: 0px; position: relative;">Планы на следующие 12 недель</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 style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><ul style="line-height: 1.4; list-style-image: initial; list-style-position: initial; margin: 0.5em 0px; padding: 0px 2.5em;"><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b>Книга по ChatGpt&nbsp;</b>— сдать в редактуру</li><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b>Книга по тайм-менеджменту</b>&nbsp;— написать 3 главы, по одной в месяц норм план!</li><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b>Курсы&nbsp;</b>— сделать 1 тему нового курса</li><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b>Статья на Хабр&nbsp;</b>— ну хоть одну!&nbsp;</li></ul></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;">Найс ту ду:</div><div style="background-color: white;"><ul style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 1.4; list-style-image: initial; list-style-position: initial; margin: 0.5em 0px; padding: 0px 2.5em;"><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b>Youtube-канал</b>&nbsp;— 2 шт — уменьшаем цель до реально достижимой))</li><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b>Книга по Python</b>&nbsp;— прочитать 100 страниц</li><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b>Встретиться с друзьями&nbsp;</b></li><li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><b>Курс по постману</b> — сделать ещё 3 лекции (не верю в полную перезапись с учетом новогодних праздников и начала садика = болезней)</li></ul><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;"><br /></div><div style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">Да, я тут решила снова читать начать, и даже начала! А потом цикл болезней и нежданчиков, и уже 2 недели нет времени читать ((( Вот поставила в план, хочу достигнуть!</div><div style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;"><b><br /></b></div><h3 style="text-align: left;"><span style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"><span style="font-size: 14.85px;"><b>Резюме</b></span></span></h3><div>Хороший вышел цикл! Вроде главные результаты укладываются в пару строк, перезаписывала курс да пилила книгу, но сколько работы в это вложено! А уж с учетом болезней...</div><div><br /></div><div>Так что всё было неплохо, надеюсь, будет ещё лучше дальше, ведь весной-летом дети болеют меньше, надеюсь поработать! ????</div></div></div><p></p>]]></description>
<link>http://okiseleva.blogspot.com/2026/03/12-33.html</link>
<pubDate>Tue, 31 Mar 2026 12:41:00 +0300</pubDate>
</item>
<item>
<title>Эльба: ну вы там как-нибудь сами проверьте, где ошибка произошла</title>
<description><![CDATA[<p>Продолжаю рассказывать про «<a href="https://okiseleva.blogspot.com/search/label/%D0%B4%D0%B0%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B3%D0%BE%20%D0%BD%D0%B5%20%D0%B1%D1%8B%D0%B2%D0%B0%D0%B5%D1%82" target="_blank">да такого не бывает</a>» в наши дни. У ИП подошел срок платить страховые взносы. У меня вся бухгалтерия в Эльба.Контур, которая и выставила мне задачку.</p><p>Зашла в эльбу, прокликала задачу до "выставить счет в банке", и тут она мне выдает ошибку — не настроена связь с банком о_О</p><p>Она автоматизированная и была настроена. Перешла в личный кабинет, и правда, нет связи. Потом и на главной странице уже заметила, что сумма на счету отображается неправильная...&nbsp;</p><p>Восстановила соединение с банком и тут же написала в поддержку. Мой исходный вопрос был предельно простой, как быстро Эльба всё подсосет:</p><p>- У меня была разорвана связь с банком, сейчас восстановила — <i>Интеграция c Альфа-Банком настроена с 18.02.2025</i>. Получается, задача "заплатить страховые взносы" неактуальна, если данные не получала система с 18 февраля? Как быстро она подсосет все, что нужно?</p><p>Но во что это вылилось, у-у-у-у.... Давайте я сначала покажу нашу примерную переписку за эти 2 дня, от которой у меня до сих пор бомбит, а потом кратко подведу её итоги (если лень читать всё).</p><span><a name='more'></a></span><p><br /></p><h3 style="text-align: left;">Переписка с поддержкой</h3><p>Сначала в чате с поддержкой тебе отвечает бот. Он увидел ключевые слова про страховые взносы и накатал огромное сообщение на целый лист (чат с техподдержкой это такой узкий, выплывает справа снизу на экране, вот его лист):</p><p>-&nbsp;Обязанность по уплате страховых взносов ИП за себя определена ФЗ... <i>(бла-бла-бла, о том, почему я вообще должна платить взносы)</i></p><p>-&nbsp;Это вообще не про мой вопрос</p><p>На эту фразу бот уходит искать человека. Когда я восстанавливала связь, система предложила подписать согласие на передачу данных банком. Я подумала, что все дело в этом, согласие понадобилось, поэтому докинула вопрос:</p><p>- Почему эльба не написала, что связь с банком разорвана? по сути это же вы просто согласие затребовали подписать, почему не было письма тогда? Ну и как теперь исправить некорректные данные в эльбе? раз она про часть данных не знала</p><p>То есть жду ответ, что "подождите пару часов и все подсосется" или "сделайте то и то". Ок. Приходит человек:</p><p>- Если ранее не были загружены операции ранее 18.02.2025 года, то необходимо перенастроить интеграцию с банком. Интеграция настраивается в течении суток.</p><p>Либо можно скачать выписку банка в формате 1С с расширением *.txt, тогда операции загрузятся сразу.</p><p>Чтобы загрузить выписку: ...</p><p>Если платёж уже заведен в Эльбу вручную, то он не задвоится, если будут совпадать:</p><p>1. номер платёжного поручения;</p><p>2. сумма;</p><p>3. дата;</p><p>4. ИНН-КПП контрагента.</p><p>В ином случае в сервисе будет создан дубль операции.</p><p>Если? Что значит "если"??</p><p>- Откуда я знаю, были загружены операции ранее 18.02 или нет? У меня была настроена интеграция, сообщения об ошибке в ней я не получала, и как я должна понять, с каких пор ошибка и что она затронула? все платежи с начала года выверять? Сейчас на главной блок "деньги" вообще не верный</p><p>-&nbsp;Если платёж уже заведен в Эльбу, то он не задвоится, если будут совпадать:</p><p>1. номер платёжного поручения;</p><p>2. сумма;</p><p>3. дата;</p><p>4. ИНН-КПП контрагента.</p><p>В ином случае в сервисе будет создан дубль операции.&nbsp;Можете просто загрузить операции в раздел Деньги вручную. Если есть лишние операции, их потребуется удалить вручную.</p><p>***</p><p>То есть мне снова сделали копипасту "когда дубля не будет". Только я тестировщиком работаю и прекрасно понимаю, что, раз шанс ошибки и возникновения дублей есть, я хочу его избежать. В конце концов, мне за дубли налоги платить придется, а не им.</p><p>А ещё очень умилило вот это вот "просто загрузите деньги вручную". Каждую операцию, да. Вручную...</p><p>В итоге я с ними ругалась, ругалась — почему мне надо загружать лишнее? Или самой искать, с какого момента был сбой? Это ведь их задача — локализовать ошибку.</p><p>Но техподдержка лишь лапки подняла:</p><p>- Доступ к учетной записи есть только у вас, консультанты технической поддержки не могут посмотреть информацию, которая отображается у вас в Эльбе. Вам надо посмотреть от какого числа у вас в разделе "Деньги" отражается информация по счету и сверить с данными из интернет-банка.</p><p>В общем, сами сидите и выверяйте, класс!</p><p>Самое смешное, что, когда я выверила — сидела и просматривала глазками 2 экрана, деньги в эльбе и в альфа-банке, то с текущей даты и назад до 28 января всё ок. Это я сегодня уже выверяла, а связь с банком восстановила вчера.</p><p>То есть по сути ответ на мой исходный вопрос мог быть коротким:</p><p>- Сбой произошел в январе из-за техработ в банке. Так как вы указали при восстановлении связи 18 февраля 2025 года, Эльба должна была все подтянуть. Проверьте на всякие случай поступления за последние пару дней и такого-то января, чтобы убедиться, что всё хорошо.</p><p>И ВСЁ! Но нет, надо было закидывать меня копипастой, писать какую-то фигню не про мои вопросы, а ещё рассказывать, как я могу сама локализовывать баг вместо них.</p><p>Сегодня уже ругалась на них, так мне консультанта сменили )))) Видимо, девушка не выдержала моих вопросов "почему эльба не написала мне про сбой", ну а что, они мне копипастят одно и то же, и я свои вопросы без ответа им в ответ копипастила.</p><p>Пришел парень, который знал систему, наконец-то! Он и пояснил всё:</p><p>- То что интеграция нарушена, Эльба пишет в разделе "Деньги" и при выполнении задачи по УСН, а так же в разделе "Реквизиты". На данный момент уведомление о разрыве интеграции не реализовано, зарегистрировал пожелание на доработу Эльбы.</p><p>"Интеграция настроена с 18.02.2025", это значит что все данные с этой даты подтянутся в Эльбу. Эта дата указывается при настройке интеграции с банком, но только в случае если она не была настроена, или была разорвана по кнопке "Разорвать связь с банком". Если интеграция была нарушена, и восстановлена по кнопке "Авторизоваться в банке" то дата не изменится, и за период когда интеграция была нарушена операции подтянутся.</p><p><i>(Я ведь спрашивала их, что значит эта дата. Я нажала "восстановить связь — ок", почти не глядя, так как уже делала это раньше. Как в винде, знаете, далее-далее-далее-ок.</i></p><p><i>А там, оказывается, можно указать дату, с которой восстанавливать, я даже внимания не обратила на неё. И нет бы другому консультанту ещё выше по переписке на вопрос "что значит это сообщение" подсказать, что это та дата, которую я указала (я не указывала, она подтянулась с прошлого разрыва связи) при восстановлении.</i></p><p><i>Пока я дождалась этого консультанта, я уже разорвала связь и снова восстановила, как меня попросила поддержка. И вот теперь я&nbsp;заметила эту дату. Почему только техподдержка не подсветила мне это "вот на этом экране вы выбрали дату (скрин), она и отображается в сообщении"?)</i></p><p>В вашем случае, если не помните как именно восстанавливали интеграцию, и нет возможности отследить хватает/не хватает операций(например, их было очень много и проверить все затруднительно) то можно подгрузить выписку из банка в формате 1С за весь 2025 и 2026 год в Эльбу. Если операция есть в Эльбе, то как правило она не задублируется, так как выписка из банка и выписка по интеграции идентичны.</p><p>***</p><p>В общем, всё Эльба сделала сама, можно было бы остановить переписку ещё на первом сообщении, при нормальном и грамотном ответе...</p><p><br /></p><h3 style="text-align: left;">Кратко</h3><div>Какие были проблемы в итоге:</div><div><br /></div><div>1. Нет извещения о сбое в системе. Да, связь разрушилась по вине банка, а не Эльбы, и мне техподдержка так и писала "ну это же банк виноват".&nbsp;</div><div><br /></div><div>Но мне, как пользователю, какая разница кто виноват? Вы видите ошибку в логах, связь разорвана. Можно прислать письмо «Связь с банком была разорвана, пожалуйста, зайдите в ЛК по ссылочке и нажмите "Восстановить" её». Всё.</div><div><br /></div><div>Да, я всё равно это узнаю во время выполнения задачи, но тогда больше шансов, что что-то не подтянется и придется подтягивать вручную.</div><div><br /></div><div><br /></div><div>2. Первая линия техподдержки слабая по данной проблеме. Нет адекватной инструкции на такой случай. Пример я писала выше:</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><div><br /></div><div><br /></div>]]></description>
<link>http://okiseleva.blogspot.com/2026/03/blog-post.html</link>
<pubDate>Thu, 12 Mar 2026 13:19:00 +0300</pubDate>
</item>
<item>
<title>1 тест = 1 проверка. Чем хорош принцип атомарности в автотестах в Postman</title>
<description><![CDATA[<p>&nbsp;</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggM489VWSzh-WA7cPHkq1eHuIfuTkkqRzhtZMSz4GbCKDjaDi9USBsDyD6bqFZqh2J_5tPhs968mKOBKRb_dMvHH4-ulJmHH4dbGJNpbpxCVyM-dz4QfW9sDvMuPPIpCBakOpMagCwOER1EVrP45K7nD4CtLHJDLfAtolkaZ9OylqF3nytzHKENAPwsjs/s1280/%D0%BF%D1%80%D0%B5%D0%B2%D1%8C%D1%8E_1%20%D1%82%D0%B5%D1%81%D1%82%20%D0%BE%D0%B4%D0%BD%D0%B0%20%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggM489VWSzh-WA7cPHkq1eHuIfuTkkqRzhtZMSz4GbCKDjaDi9USBsDyD6bqFZqh2J_5tPhs968mKOBKRb_dMvHH4-ulJmHH4dbGJNpbpxCVyM-dz4QfW9sDvMuPPIpCBakOpMagCwOER1EVrP45K7nD4CtLHJDLfAtolkaZ9OylqF3nytzHKENAPwsjs/s320/%D0%BF%D1%80%D0%B5%D0%B2%D1%8C%D1%8E_1%20%D1%82%D0%B5%D1%81%D1%82%20%D0%BE%D0%B4%D0%BD%D0%B0%20%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0.png" width="320" /></a></div><br /><p></p><p><span style="font-size: large;"><a href="https://habr.com/ru/articles/1003554/" target="_blank"><b>Ссылка на Хабр</b></a></span></p><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">Принцип атомарности&nbsp;<em style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">(объект или операцию нельзя разделить на части, не нарушив их целостность или смысл)</em>&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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">И в автотестах Postman он особенно хорош! Давайте разберемся на примерах, почему лучше писать небольшие автотестики, «один тест, одна проверка», чем «много проверок в одном тесте».</p><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; 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;"><span style="font-size: 1.125rem;">Готовим тесты</span></h3><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">Запрос будем отправлять в бесплатную систему&nbsp;<a href="https://okiseleva.blogspot.com/2017/04/users-soap-rest.html" rel="noopener noreferrer nofollow" style="color: #548eab; quotes: &quot;«&quot; &quot;»&quot;; text-decoration-line: none; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" target="_blank">Users</a>. Метод doRegister:&nbsp;</p><pre style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(247, 247, 247); border-color: rgb(240, 240, 240); border-image: none 100% / 1 / 0 stretch; border-radius: 4px; border-style: solid; border-width: 1px; box-sizing: border-box; color: #333333; font-family: monospace, monospace; 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; word-break: normal;"><code class="json" style="background: none; 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; word-break: normal; word-spacing: normal;"><span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">URL</span>: <span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">http</span>:<span class="ͼ8" style="color: #8f8f8f; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">//users.bugred.ru/tasks/rest/doregister</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" /><span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">Запрос</span>:<br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" />&nbsp;&nbsp;&nbsp;&nbsp;"name": <span class="ͼ7" style="color: #7ba800; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">"Демо 1"</span>,<br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" />&nbsp;&nbsp;&nbsp;&nbsp;"email": <span class="ͼ7" style="color: #7ba800; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">"test_demo_1@gmail.com"</span>,<br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" />&nbsp;&nbsp;&nbsp;&nbsp;"password": <span class="ͼ7" style="color: #7ba800; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">"1"</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" />}</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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;"><br /></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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">Если с первого раза запрос не упал, отправляем повторно, чтобы получить ошибку в ответе:</p><pre style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(247, 247, 247); border-color: rgb(240, 240, 240); border-image: none 100% / 1 / 0 stretch; border-radius: 4px; border-style: solid; border-width: 1px; box-sizing: border-box; color: #333333; font-family: monospace, monospace; 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; word-break: normal;"><code style="background: none; 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; word-break: normal; word-spacing: normal;">{
&nbsp;&nbsp;&nbsp;&nbsp;"type": "error",
&nbsp;&nbsp;&nbsp;&nbsp;"message": " email test_demo_1@gmail.com уже есть в базе"
}</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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;"><a class="tm-button code-explainer__link" href="https://sourcecraft.dev/" style="align-items: center; background-color: transparent; border: none; 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-line: none; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; visibility: visible;" target="_blank">Объяснить с<img src="https://habr.com/img/sourcecraft-light.bf8f84c1..svg" style="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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; vertical-align: middle; width: 14px;" /></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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">Напишем автотесты на эти 2 поля. Какие тут есть варианты? Мы можем писать маленькие тесты, одна проверка, один тест:</p><pre style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(247, 247, 247); border-color: rgb(240, 240, 240); border-image: none 100% / 1 / 0 stretch; border-radius: 4px; border-style: solid; border-width: 1px; box-sizing: border-box; color: #333333; font-family: monospace, monospace; 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; word-break: normal;"><code class="javascript" style="background: none; 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; word-break: normal; word-spacing: normal;"><span class="ͼ8" style="color: #8f8f8f; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">// Сохраняем ответ в переменную</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" /><span class="ͼ4" style="color: #8959a8; font-weight: bold; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">var</span> <span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">jsonData</span> <span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">=</span> <span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">pm</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">response</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">json</span>()<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">;</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" /><span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">pm</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">test</span>(<span class="ͼ7" style="color: #7ba800; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">"Проверяем тип"</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">,</span> <span class="ͼ4" style="color: #8959a8; font-weight: bold; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">function</span> () <span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">{</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" />&nbsp;&nbsp;&nbsp;&nbsp;<span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">pm</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">expect</span>(<span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">jsonData</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">type</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">to</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">eql</span>(<span class="ͼ7" style="color: #7ba800; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">"error"</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">;</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" /><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">}</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">;</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" /><span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">pm</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">test</span>(<span class="ͼ7" style="color: #7ba800; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">"Проверяем message"</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">,</span> <span class="ͼ4" style="color: #8959a8; font-weight: bold; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">function</span> () <span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">{</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" />&nbsp;&nbsp;&nbsp;&nbsp;<span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">pm</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">expect</span>(<span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">jsonData</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">message</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">to</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">eql</span>(<span class="ͼ7" style="color: #7ba800; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">" email test_demo_1@gmail.com уже есть в базе"</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">;</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" /><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">}</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">;</span></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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;"><a class="tm-button code-explainer__link" href="https://sourcecraft.dev/" style="align-items: center; background-color: transparent; border: none; 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-line: none; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; visibility: visible;" target="_blank">Объяснить с<img src="https://habr.com/img/sourcecraft-light.bf8f84c1..svg" style="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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; vertical-align: middle; width: 14px;" /></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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">А можем объединить, то есть написать один тест, который проверяет и тип, и message сразу (добавим его в те же скрипты, поэтому переопределять jsonData уже не надо):</p><pre style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(247, 247, 247); border-color: rgb(240, 240, 240); border-image: none 100% / 1 / 0 stretch; border-radius: 4px; border-style: solid; border-width: 1px; box-sizing: border-box; color: #333333; font-family: monospace, monospace; 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; word-break: normal;"><code class="javascript" style="background: none; 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; word-break: normal; word-spacing: normal;"><span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">pm</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">test</span>(<span class="ͼ7" style="color: #7ba800; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">"Проверяем тип и message сразу"</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">,</span> <span class="ͼ4" style="color: #8959a8; font-weight: bold; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">function</span> () <span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">{</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" />&nbsp;&nbsp;&nbsp;&nbsp;<span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">pm</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">expect</span>(<span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">jsonData</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">type</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">to</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">eql</span>(<span class="ͼ7" style="color: #7ba800; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">"error"</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">;</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" />&nbsp;&nbsp;&nbsp;&nbsp;<span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">pm</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">expect</span>(<span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">jsonData</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">message</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">to</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">eql</span>(<span class="ͼ7" style="color: #7ba800; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">" email test_demo_1@gmail.com уже есть в базе"</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">;</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" /><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">}</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">;</span></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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;"><a class="tm-button code-explainer__link" href="https://sourcecraft.dev/" style="align-items: center; background-color: transparent; border: none; 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-line: none; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; visibility: visible;" target="_blank">Объяснить с<img src="https://habr.com/img/sourcecraft-light.bf8f84c1..svg" style="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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; vertical-align: middle; width: 14px;" /></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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">Отправляем запрос — все 3 теста проходят успешно:</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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;"><img decode="async" height="1345" loading="lazy" sizes="(max-width: 780px) 100vw, 50vw" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/59f/2f8/b23/59f2f8b239add917a1b36ca896e21dc2.png" srcset="https://habrastorage.org/r/w780/getpro/habr/upload_files/59f/2f8/b23/59f2f8b239add917a1b36ca896e21dc2.png 780w,
       https://habrastorage.org/r/w1560/getpro/habr/upload_files/59f/2f8/b23/59f2f8b239add917a1b36ca896e21dc2.png 781w" style="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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; vertical-align: middle;" width="1989" /></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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 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: 32px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;"><br /></p><p><a class="anchor" id="one_error" name="one_error" style="background-color: white; color: #548eab; display: block; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; margin-top: 24px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" target="_blank"></a></p><h3 style="-webkit-font-smoothing: antialiased; background-color: white; color: #333333; font-family: &quot;Fira Sans&quot;, sans-serif; font-size: 1.125rem; 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">Одна проверка упала</h3><p style="background-color: white; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-size: 16px; line-height: 1.5rem; margin: 12px 0px 0px; padding: 0px; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">Сломаем тесты 1 и 3, поменяв «error» на «error2». Автотесты теперь выглядят так:</p><pre style="background: none 0% 0% / auto repeat scroll padding-box border-box rgb(247, 247, 247); border-color: rgb(240, 240, 240); border-image: none 100% / 1 / 0 stretch; border-radius: 4px; border-style: solid; border-width: 1px; box-sizing: border-box; color: #333333; font-family: monospace, monospace; 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; word-break: normal;"><code class="javascript" style="background: none; 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out; word-break: normal; word-spacing: normal;"><span class="ͼ8" style="color: #8f8f8f; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">// Сохраняем ответ в переменную</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" /><span class="ͼ4" style="color: #8959a8; font-weight: bold; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">var</span> <span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">jsonData</span> <span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">=</span> <span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">pm</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">response</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">json</span>()<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">;</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" /><span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">pm</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">test</span>(<span class="ͼ7" style="color: #7ba800; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">"Проверяем тип"</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">,</span> <span class="ͼ4" style="color: #8959a8; font-weight: bold; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">function</span> () <span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">{</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" />&nbsp;&nbsp;&nbsp;&nbsp;<span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">pm</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">expect</span>(<span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">jsonData</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">type</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">to</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">eql</span>(<span class="ͼ7" style="color: #7ba800; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">"error2"</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">;</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" /><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">}</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">;</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" /><span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">pm</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">test</span>(<span class="ͼ7" style="color: #7ba800; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">"Проверяем message"</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">,</span> <span class="ͼ4" style="color: #8959a8; font-weight: bold; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">function</span> () <span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">{</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" />&nbsp;&nbsp;&nbsp;&nbsp;<span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">pm</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">expect</span>(<span class="ͼ5" style="color: #39728e; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">jsonData</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">message</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">to</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">.</span><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">eql</span>(<span class="ͼ7" style="color: #7ba800; quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">" email test_demo_1@gmail.com уже есть в базе"</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">;</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;" /><span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">}</span>)<span class="ͼ6" style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 0.2s ease-in-out;">;</span><br style="quotes: &quot;«&quot; &quot;»&quot;; transition: opacity 0.2s ease-in-out, color 0.2s ease-in-out, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 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, text-decoration 0.2s ease-in-out, background-color 0.2s ease-in-out, -webkit-text-decoration 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, text-decoration 0.2s e]]></description>
<link>http://okiseleva.blogspot.com/2026/02/1-1-postman.html</link>
<pubDate>Thu, 26 Feb 2026 21:22:00 +0300</pubDate>
</item>
<item>
<title>Новый функционал? Подождем до последнего. Как банки к АУСН подключались</title>
<description><![CDATA[<p>На <a href="https://testbase.ru/learn" target="_blank">моих курсах</a> для начинающих у студентов порой возникают сомнения в актуальности лекций. Ошибочно кажется, что в 21 то веке:</p><p style="text-align: left;"></p><ol style="text-align: left;"><li>цикл «Code and Fix» не существуется, у всех Agile или аналоги (ну да, ну да...);</li><li>глупых багов типа перехода через новый год или смены часовых поясов, уже давно нет, их решения «вшиты» в библиотеки кода (ага, щаз)</li><li>нет проблем «сделали в последние дни, из-за чего огребли проблемы»;</li><li>нет проблем с документацией;</li><li>...</li></ol><div>Поэтому я рассказываю актуальные истории таких проблем, которых вроде как в 2026 году и быть то не должно... У меня их даже поднакопилось, но... Не записал сразу = забыл ))) Буду постепенно рассказывать тогда.</div><div><br /></div><div>Сегодня я расскажу про АУСН. Сначала короткий рассказ, что это такое, а потом про текущую ситуацию с ним (и проблемы...)</div><div><br /></div><span><a name='more'></a></span><div><br /></div><div><br /></div><h3 style="text-align: left;">Что такое УСН и АУСН</h3><div><br /></div><div>Это налоговые ставки для ИП или малого бизнеса. Когда вы работаете в штате, за вас налоги платит работодатель. А если вы открываете юр. лицо, нужно будет платить самому. Зачем?</div><div><br /></div><div>Несколько причин открыть ИП (хотя сейчас есть альтернатива — самозанятый, раньше не было):</div><div><ol style="text-align: left;"><li>Работать как ИП на компанию (или несколько разных) — некоторые компании берут только ИП, или наоборот, не берут тех, у кого есть ИП.&nbsp;</li><li>Работать на второй работе — на одной трудоустроены, остальное как ИП. Так, например, я с издательством сотрудничаю как ИП и на него получаю гонорар с проданных книг. Так проще и дешевле платить налоги, чем как физику.</li><li>Получать официальную прибыль — например, за сдачу квартиры в аренду, чтобы не как физик декларации заполнять, а просто честно платить налог с ИП.&nbsp;</li><li>Ну и просто работать на себя, но если вы это планируете, то и так всё знаете ????</li></ol><div>Открывая ИП (или ООО, или ещё что-то), вам надо выбрать налоговую ставку. По сути раньше были основные варианты:</div></div><div><ul style="text-align: left;"><li>УСН — упрощенный налог, платишь 6% с дохода (не с прибыли, а поступивших денег, неважно сколько ты при этом потратил)</li><li>«Серьезный» бухучет — там платишь с разницы «доходы - расходы», но бухучета больше, он сложнее + налоговая будет заставлять отчитываться обо всех расходах, чтобы ты туда лишнее не вписал.</li></ul><div>В общем, обычно берут упрощенку. В ней есть ограничение — 60 млн дохода в год, иначе надо платить НДС и всякое сложное.</div></div><div><br /></div><div>Потом появился АУСН — автоматизированный налог, где 8%, а не 6% платишь, но "зато" оно платится само, не надо делать отчетность, её считают банки. Но если ты уже платишь за бухгалтерию, то вроде как и нет смысла в этом АУСН... Раньше )</div><div><br /></div><div><br /></div><div><div><br /></div><h3>Изменения в 2026 году</h3><div><br /></div><div>Поменяли систему. Чтобы не платить НДС и сидеть на упрощенке, максимальный доход по ставкам:</div></div><div><ul style="text-align: left;"><li>УСН — 10 млн рублей в год (вместо 60!!). Но понижают "медленно", в этом году можно 20 млн получить, в следующем вроде 15, потом уже&nbsp;перейдут на 10.</li><li>АУСН — 60 млн&nbsp;</li></ul><div>То есть по сути, если доход больше 10-20 млн <i>(эх, мне бы в эту категорию ????)</i>, надо переходить на АУСН. ВОТ ТЕПЕРЬ он стал выгодным!</div></div><div><br /></div><div><br /></div><div><br /></div><div><h3>Проблемы перехода (а вот и баги!)</h3><div><br /></div><div>Ну и, собственное, сейчас многие стали переходить на АУСН и, сюрприз-сюрприз, стали вылезать баги!&nbsp;</div><div><br /></div><div>Я тут немного теоритик, так как сама в эту категорию дохода не попадаю. Но знакомый, который перешел, скинул любопытную статью, подтвердив, что встречал такие проблемы —&nbsp;<a href="https://www.forbes.ru/finansy/554530-biznes-stal-case-perehodit-na-ausn-s-kakimi-problemami-mozno-stolknut-sa">https://www.forbes.ru/finansy/554530-biznes-stal-case-perehodit-na-ausn-s-kakimi-problemami-mozno-stolknut-sa</a>:</div><div><br /></div><div><blockquote>«С проблемами передачи данных при работе на АУСН сейчас сталкиваются многие предприниматели, и это не частные сбои, а системные», — говорит член совета московского регионального отделения «Деловая Россия» Андрей Глушкин. Ошибки в передаче данных от банков и операторов в налоговые органы наблюдается довольно часто, особенно в начале 2026 года, подтверждает член Ассоциации налоговых консультантов, руководитель налоговой практики адвокатского бюро «БВМП» Александр Андропов. В числе основных причин — неполная готовность банковских систем к интеграции с Федеральной налоговой службой (ФНС), в том числе потому, что многие кредитные организации подключились к реестру уполномоченных кредитных организаций для АУСН (то есть стали банками, где плательщики АУСН могут открывать счета) только в конце 2025-го. «Банки не успели полноценно протестировать обмен данными, что приводит к искажениям в передаваемой информации», — говорит Андропов.&nbsp;</blockquote></div><div><br /></div><div>Я сначала, пока читала статью, лишь кивала головой. Конечно, это логично, если раньше единицы работали, то и меньше проблем встречали. Чем больше пользователей, тем больше шанс, что они попадут "в ту самую ветку кода, где есть баг".</div><div><br /></div><div>Ну и раз сейчас массово юрики стали переходить на эту систему, стали всплывать проблемы.</div><div><br /></div><div>— Конечно, банки были не готовы! — думала я. Ведь это только сейчас внедряется, я вот про АУСН услышала год назад, что-то новенькое жеж (я не бухгалтер и поэтому за бухгалтерскими новостями не слежу)</div><div><br /></div><div>А вот что для меня стало откровением в этой статье, так это то, АУСН уже почти 4 года! Оказывается, он запустился летом 2022 года. 3.5 года назад!</div><div><br /></div><div>И при этом банки «не успели протестировать обмен данными». А всё почему? А потому, что банки и сами только недавно стали подключаться к этой системе!</div><div><br /></div><div>Это кажется странным, ведь все равно придется. Но оттянуть до последнего — это состояние души))) Начиная со студенчества, когда в последнюю неделю начинаешь сдавать домашки, и заканчивая... А заканчивая ли?</div><div><br /></div><div>В любом случае в банковских системах есть свои планы на ближайшие несколько релизов. Надо сделать функцию А, исправить функцию Б и вон ту финтюфлюшечку хочется. Так зачем брать в релиз задачи, которые пока не горят? Видимо, клиентов на АУСН было настолько мало, что проще было им отказать "нет, мы не умеем поддерживать такую систему", чем внедрять её.</div><div><br /></div><div>Хотя, конечно, за несколько лет можно было выделить время... Но реальность такова, что подключаться все стали в последний момент — а это всегда опасно (баги есть везде, поэтому нужно время на тестирование и отладку).&nbsp;</div></div><div><br /></div><div>Ну и интеграция — это тоже всегда сложно, потому что обычно нет подродного ТЗ, делают как поняли, а оно работает не так, а надо переделывать... В общем, процесс небыстрый! Хоть и 21 век)</div><div><br /></div><div><i style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;">PS — добавила пост в&nbsp;<a href="http://okiseleva.blogspot.ru/2015/07/blog-post_16.html" style="color: #6699cc; text-decoration-line: none;">общую копилку багов</a>.</i></div><p></p>]]></description>
<link>http://okiseleva.blogspot.com/2026/02/blog-post.html</link>
<pubDate>Tue, 24 Feb 2026 20:37:00 +0300</pubDate>
</item>
</channel>
</rss>
