HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Когда тестов и файлов с тестами становится много, возникают новые вопросы:</p>
1 <p>Когда тестов и файлов с тестами становится много, возникают новые вопросы:</p>
2 <ul><li>Как группировать тесты?</li>
2 <ul><li>Как группировать тесты?</li>
3 <li>Как запустить на выполнение все тесты из одной директории?</li>
3 <li>Как запустить на выполнение все тесты из одной директории?</li>
4 <li>Если тестов очень много и они долгие, можно ли запустить их параллельно?</li>
4 <li>Если тестов очень много и они долгие, можно ли запустить их параллельно?</li>
5 </ul><p>Для решения этих вопросов используют специальные тестовые фреймворки. Они помогают организовать структуру тестов и дают много полезного, например, удобный вывод. С большинством из этих возможностей мы познакомимся далее по курсу.</p>
5 </ul><p>Для решения этих вопросов используют специальные тестовые фреймворки. Они помогают организовать структуру тестов и дают много полезного, например, удобный вывод. С большинством из этих возможностей мы познакомимся далее по курсу.</p>
6 <p>В Python-мире популярен фреймворк Pytest, на котором мы сосредоточимся в этом уроке.</p>
6 <p>В Python-мире популярен фреймворк Pytest, на котором мы сосредоточимся в этом уроке.</p>
7 <h2>Что такое Pytest</h2>
7 <h2>Что такое Pytest</h2>
8 <p>Python - один из немногих языков, в стандартную библиотеку которого уже включен тестовый фреймворк (он называется unittest). Было бы логично рассмотреть его здесь, но он глубоко завязан на классы, которые вы можете не знать. Поэтому здесь мы рассматриваем Pytest, который все равно популярнее встроенного фреймворка.</p>
8 <p>Python - один из немногих языков, в стандартную библиотеку которого уже включен тестовый фреймворк (он называется unittest). Было бы логично рассмотреть его здесь, но он глубоко завязан на классы, которые вы можете не знать. Поэтому здесь мы рассматриваем Pytest, который все равно популярнее встроенного фреймворка.</p>
9 <p>Далее мы создадим проект с нуля и добавим в него тесты.</p>
9 <p>Далее мы создадим проект с нуля и добавим в него тесты.</p>
10 <h2>Настройка и запуск</h2>
10 <h2>Настройка и запуск</h2>
11 <p>Создайте где-нибудь на вашем компьютере директорию с названием<em>hexlet_pytest</em>. Зайдите в нее и выполните команды:</p>
11 <p>Создайте где-нибудь на вашем компьютере директорию с названием<em>hexlet_pytest</em>. Зайдите в нее и выполните команды:</p>
12 <p>Мы инициализируем новый проект и добавляем в него директорию для будущих тестов<em>tests</em>. Установите pytest с помощью uv в девелопмент зависимости с помощью команды uv add --dev pytest. Проверьте, что все работает правильно:</p>
12 <p>Мы инициализируем новый проект и добавляем в него директорию для будущих тестов<em>tests</em>. Установите pytest с помощью uv в девелопмент зависимости с помощью команды uv add --dev pytest. Проверьте, что все работает правильно:</p>
13 <p>Также добавьте в<em>pyproject.toml</em>блок. В строчках ниже мы задаем систему сборки пакета, а также указываем по какому пути взять файлы, что попадут в пакет. :</p>
13 <p>Также добавьте в<em>pyproject.toml</em>блок. В строчках ниже мы задаем систему сборки пакета, а также указываем по какому пути взять файлы, что попадут в пакет. :</p>
14 <p>Теперь добавим немного исходного кода. Создайте вложенную директорию<em>hexlet_pytest</em>, где будет храниться код проекта. Создайте в ней файл<em>example.py</em>.</p>
14 <p>Теперь добавим немного исходного кода. Создайте вложенную директорию<em>hexlet_pytest</em>, где будет храниться код проекта. Создайте в ней файл<em>example.py</em>.</p>
15 <p>В итоге, у вас должна получиться следующая структура:</p>
15 <p>В итоге, у вас должна получиться следующая структура:</p>
16 <p>Внутри файла запишем код:</p>
16 <p>Внутри файла запишем код:</p>
17 - <p>Pytest ожидает, что тесты находятся в директории<em>tests</em>, которую располагают в корне проекта. Внутри этого каталога можно созавать любую структуру - Pytest найдет все тесты, которые там лежат.</p>
17 + <p>Pytest ожидает, что тесты находятся в директории<em>tests</em>, которую располагают в корне проекта. Внутри этого каталога можно создавать любую структуру - Pytest найдет все тесты, которые там лежат.</p>
18 <p>Именование файлов с тестами должно быть таким:<em>test_&lt;name&gt;.py</em>. Как правило, в этой записи<em>&lt;name&gt;</em>соответствует имени файла, который тестируется.</p>
18 <p>Именование файлов с тестами должно быть таким:<em>test_&lt;name&gt;.py</em>. Как правило, в этой записи<em>&lt;name&gt;</em>соответствует имени файла, который тестируется.</p>
19 <p>Напишем наш первый тест. Создайте файл<em>tests/test_example.py</em>со следующим содержимым:</p>
19 <p>Напишем наш первый тест. Создайте файл<em>tests/test_example.py</em>со следующим содержимым:</p>
20 <p>Далее мы разберем структуру этого файла, а пока попробуем запустить тест на выполнение:</p>
20 <p>Далее мы разберем структуру этого файла, а пока попробуем запустить тест на выполнение:</p>
21 <h2>Структура</h2>
21 <h2>Структура</h2>
22 <p>Давайте еще раз посмотрим на файл с тестом:</p>
22 <p>Давайте еще раз посмотрим на файл с тестом:</p>
23 <p>Каждый тест внутри файла - это функция, начинающаяся с префикса<em>test_</em>. Тестовых функций можно делать любое количество, все уже зависит от сложности тестируемого кода. Внутри функций проверки выполняются с помощью инструкции assert.</p>
23 <p>Каждый тест внутри файла - это функция, начинающаяся с префикса<em>test_</em>. Тестовых функций можно делать любое количество, все уже зависит от сложности тестируемого кода. Внутри функций проверки выполняются с помощью инструкции assert.</p>
24 <p>Несмотря на схожесть со встроенной инструкцией в Python, инструкция assert в Pytest работает немного по-другому. Попробуйте внести ошибку в исходную функцию и запустите тесты заново:</p>
24 <p>Несмотря на схожесть со встроенной инструкцией в Python, инструкция assert в Pytest работает немного по-другому. Попробуйте внести ошибку в исходную функцию и запустите тесты заново:</p>
25 <p>Вывод Pytest содержит не только исходное утверждение, но и результат вызова функции:</p>
25 <p>Вывод Pytest содержит не только исходное утверждение, но и результат вызова функции:</p>
26 <ul><li>Плюсом помечается то, что пришло</li>
26 <ul><li>Плюсом помечается то, что пришло</li>
27 <li>Минусом помечается то, что ожидалось</li>
27 <li>Минусом помечается то, что ожидалось</li>
28 </ul><p>Благодаря такому выводу, найти и исправить ошибку становится значительно проще.</p>
28 </ul><p>Благодаря такому выводу, найти и исправить ошибку становится значительно проще.</p>
29 <p>В работе Pytest есть одна особенность. Если понадобится распечатать что-то на экран, то Pytest ничего не выведет. По умолчанию он перехватывает и подавляет весь вывод. Отключить это поведение можно с помощью флага -s:</p>
29 <p>В работе Pytest есть одна особенность. Если понадобится распечатать что-то на экран, то Pytest ничего не выведет. По умолчанию он перехватывает и подавляет весь вывод. Отключить это поведение можно с помощью флага -s:</p>
30  
30