HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Инверсия зависимостей - это крайне мощная техника, которая работает не только с функциями, но и с объектами. В этом уроке мы рассмотрим ее глубже на примере HTTP-запросов. Здесь мы познакомимся с таким понятием как<strong>стаб</strong>(от английского<em>stub</em>- заглушка).</p>
1 <p>Инверсия зависимостей - это крайне мощная техника, которая работает не только с функциями, но и с объектами. В этом уроке мы рассмотрим ее глубже на примере HTTP-запросов. Здесь мы познакомимся с таким понятием как<strong>стаб</strong>(от английского<em>stub</em>- заглушка).</p>
2 <p>Предположим, что у нас есть функция, которая анализирует приватные репозитории на GitHub одной конкретной организации. При этом функция возвращает форки - репозитории, отпочкованные от основного репозитория:</p>
2 <p>Предположим, что у нас есть функция, которая анализирует приватные репозитории на GitHub одной конкретной организации. При этом функция возвращает форки - репозитории, отпочкованные от основного репозитория:</p>
3 <p>Давайте ее протестируем. Что мы хотим от этой функции? В первую очередь убедиться, что она работает правильно - возвращает массив имен приватных форков. Идеальный тест выглядел бы так:</p>
3 <p>Давайте ее протестируем. Что мы хотим от этой функции? В первую очередь убедиться, что она работает правильно - возвращает массив имен приватных форков. Идеальный тест выглядел бы так:</p>
4 <p>К сожалению, не все так просто. Внутри функции выполняется HTTP-запрос. Обсудим, какие проблемы из-за этого могут возникнуть:</p>
4 <p>К сожалению, не все так просто. Внутри функции выполняется HTTP-запрос. Обсудим, какие проблемы из-за этого могут возникнуть:</p>
5 <ol><li>Нестабильная сеть может тормозить выполнение тестов и приводить к фантомным ошибкам. Тесты будут иногда проходить, иногда нет</li>
5 <ol><li>Нестабильная сеть может тормозить выполнение тестов и приводить к фантомным ошибкам. Тесты будут иногда проходить, иногда нет</li>
6 <li>У<em>github.com</em>и других подобных сервисов установлены временные ограничения на запросы - в секунду, в час и так далее. Скорее всего, тесты начнут упираться в эти лимиты. Есть вероятность, что GitHub заблокирует компьютер, с которого идут запросы</li>
6 <li>У<em>github.com</em>и других подобных сервисов установлены временные ограничения на запросы - в секунду, в час и так далее. Скорее всего, тесты начнут упираться в эти лимиты. Есть вероятность, что GitHub заблокирует компьютер, с которого идут запросы</li>
7 <li>Реальные данные на GitHub не статичны, они могут меняться. Это опять же приведет к ошибкам и необходимости править тесты</li>
7 <li>Реальные данные на GitHub не статичны, они могут меняться. Это опять же приведет к ошибкам и необходимости править тесты</li>
8 </ol><p>В этом примере HTTP-запрос воспринимается как помеха к тому, чтобы протестировать нашу основную логику. Мы доверяем PyGithub и его библиотеке<em>github</em>- то есть нам не нужно проверять, что она работает правильно.</p>
8 </ol><p>В этом примере HTTP-запрос воспринимается как помеха к тому, чтобы протестировать нашу основную логику. Мы доверяем PyGithub и его библиотеке<em>github</em>- то есть нам не нужно проверять, что она работает правильно.</p>
9 <p>Из предыдущего урока мы узнали о нескольких способах выхода из этой ситуации и теперь можем применить один из них.</p>
9 <p>Из предыдущего урока мы узнали о нескольких способах выхода из этой ситуации и теперь можем применить один из них.</p>
10 <h2>Инверсия зависимостей</h2>
10 <h2>Инверсия зависимостей</h2>
11 <p>Чтобы использовать инверсию зависимостей, добавим вторым аргументом функции сам клиент<em>github</em>. Так мы сможем подменить его в тестах:</p>
11 <p>Чтобы использовать инверсию зависимостей, добавим вторым аргументом функции сам клиент<em>github</em>. Так мы сможем подменить его в тестах:</p>
12 <p>Нам нужно реализовать в тестах фейковый клиент, который ведет себя примерно так же, как и реальный<em>Github</em>. Разница только в том, что наш клиент не выполняет сетевых запросов.</p>
12 <p>Нам нужно реализовать в тестах фейковый клиент, который ведет себя примерно так же, как и реальный<em>Github</em>. Разница только в том, что наш клиент не выполняет сетевых запросов.</p>
13 <p>Мы даже можем упростить задачу, и реализовать лишь тот функционал, что используется в тестах: get_user() и get_repos(). В таком случае мы сможем протестировать, что функция get_private_fork_names() работает корректно:</p>
13 <p>Мы даже можем упростить задачу, и реализовать лишь тот функционал, что используется в тестах: get_user() и get_repos(). В таком случае мы сможем протестировать, что функция get_private_fork_names() работает корректно:</p>
14 <p>Посмотрим на сам тест с использованием этого клиента:</p>
14 <p>Посмотрим на сам тест с использованием этого клиента:</p>
15 <p>В тестировании подобные фейковые объекты или функции используются часто. У них есть специальное название - стаб.</p>
15 <p>В тестировании подобные фейковые объекты или функции используются часто. У них есть специальное название - стаб.</p>
16 <p>Стаб заменяет реальный объект или функцию, чтобы мы могли избежать побочных эффектов или сделать код детерминированным. Стаб не используется для проверки чего-либо - он лишь позволяет изолировать ту часть, которая мешает тестированию основной логики.</p>
16 <p>Стаб заменяет реальный объект или функцию, чтобы мы могли избежать побочных эффектов или сделать код детерминированным. Стаб не используется для проверки чего-либо - он лишь позволяет изолировать ту часть, которая мешает тестированию основной логики.</p>