HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Для Python существует много хороших тест-инструментов. Один из них -<a>Tavern</a>. Он представляет собой фреймворк тестирования API и работает на основе pytest. Tavern открывает широкие возможности по созданию и запуску API-тестов и имеет хорошую<a>документацию</a>, что тоже немаловажно.</p>
1 <p>Для Python существует много хороших тест-инструментов. Один из них -<a>Tavern</a>. Он представляет собой фреймворк тестирования API и работает на основе pytest. Tavern открывает широкие возможности по созданию и запуску API-тестов и имеет хорошую<a>документацию</a>, что тоже немаловажно.</p>
2 <p>Устанавливать Tavern лучше всего через<strong>pip</strong>, используя простую команду:</p>
2 <p>Устанавливать Tavern лучше всего через<strong>pip</strong>, используя простую команду:</p>
3 <p>Сами тесты пишутся в<strong>YAML-файлы</strong>. Для наглядности давайте напишем тест, извлекающий данные о местоположении для индекса США 90210 из<a>API Zippopotam.us</a>и проверяющий, что код HTTP-ответа равен 200:</p>
3 <p>Сами тесты пишутся в<strong>YAML-файлы</strong>. Для наглядности давайте напишем тест, извлекающий данные о местоположении для индекса США 90210 из<a>API Zippopotam.us</a>и проверяющий, что код HTTP-ответа равен 200:</p>
4 test_name: Get location for US zip code 90210 and check response status code stages: - name: Check that HTTP status code equals 200 request: url: http://api.zippopotam.us/us/90210 method: GET response: status_code: 200<p>Для запуска теста вызовем pytest и сообщим, что тесты, которые хотим запустить, находятся в YAML-файле, который мы создали:</p>
4 test_name: Get location for US zip code 90210 and check response status code stages: - name: Check that HTTP status code equals 200 request: url: http://api.zippopotam.us/us/90210 method: GET response: status_code: 200<p>Для запуска теста вызовем pytest и сообщим, что тесты, которые хотим запустить, находятся в YAML-файле, который мы создали:</p>
5 <p>Как видим,<strong>тест пройден</strong>.</p>
5 <p>Как видим,<strong>тест пройден</strong>.</p>
6 <p>Также нам может понадобиться проверить значения для конкретных заголовков ответа. Следует убедиться, что content-type ответа равен "application/json", плюс пользователю API сообщается, что ответ необходимо интерпретировать как<strong>JSON</strong>:</p>
6 <p>Также нам может понадобиться проверить значения для конкретных заголовков ответа. Следует убедиться, что content-type ответа равен "application/json", плюс пользователю API сообщается, что ответ необходимо интерпретировать как<strong>JSON</strong>:</p>
7 test_name: Get location for US zip code 90210 and check response content type stages: - name: Check that content type equals application/json request: url: http://api.zippopotam.us/us/90210 method: GET response: headers: content-type: application/json<p>Можно проверить и<strong>тело ответа</strong>. В следующем примере мы увидим, что местоположение, связанное с упомянутым выше почтовым индексом, ассоциируется с "Beverly Hills":</p>
7 test_name: Get location for US zip code 90210 and check response content type stages: - name: Check that content type equals application/json request: url: http://api.zippopotam.us/us/90210 method: GET response: headers: content-type: application/json<p>Можно проверить и<strong>тело ответа</strong>. В следующем примере мы увидим, что местоположение, связанное с упомянутым выше почтовым индексом, ассоциируется с "Beverly Hills":</p>
8 test_name: Get location for US zip code 90210 and check response body content stages: - name: Check that place name equals Beverly Hills request: url: http://api.zippopotam.us/us/90210 method: GET response: body: places: - place name: Beverly Hills<p>Поскольку все API касаются данных, можно повторить один и тот же тест более одного раза, но с разными значениями для входных параметров и ожидаемых результатов (то есть выполнить тестирование на основе данных). Фреймворк Tavern поддерживает этот подход через специальный маркер pytest -<strong>parametrize</strong>:</p>
8 test_name: Get location for US zip code 90210 and check response body content stages: - name: Check that place name equals Beverly Hills request: url: http://api.zippopotam.us/us/90210 method: GET response: body: places: - place name: Beverly Hills<p>Поскольку все API касаются данных, можно повторить один и тот же тест более одного раза, но с разными значениями для входных параметров и ожидаемых результатов (то есть выполнить тестирование на основе данных). Фреймворк Tavern поддерживает этот подход через специальный маркер pytest -<strong>parametrize</strong>:</p>
9 test_name: Check place name for multiple combinations of country code and zip code marks: - parametrize: key: - country_code - zip_code - place_name vals: - [us, 12345, Schenectady] - [ca, B2A, North Sydney South Central] - [nl, 3825, Vathorst] stages: - name: Verify place name in response body request: url: http://api.zippopotam.us/{country_code}/{zip_code} method: GET response: body: places: - place name: "{place_name}"<p>Как видите, мы написали один тест, который состоит из одного этапа. Однако применение маркера parametrize и 3-х вариантов данных позволит<strong>pytest успешно прогнать 3 теста</strong>(это напоминает работу @DataProvider в<a>TestNG</a>для Java):</p>
9 test_name: Check place name for multiple combinations of country code and zip code marks: - parametrize: key: - country_code - zip_code - place_name vals: - [us, 12345, Schenectady] - [ca, B2A, North Sydney South Central] - [nl, 3825, Vathorst] stages: - name: Verify place name in response body request: url: http://api.zippopotam.us/{country_code}/{zip_code} method: GET response: body: places: - place name: "{place_name}"<p>Как видите, мы написали один тест, который состоит из одного этапа. Однако применение маркера parametrize и 3-х вариантов данных позволит<strong>pytest успешно прогнать 3 теста</strong>(это напоминает работу @DataProvider в<a>TestNG</a>для Java):</p>
10 <p>Пока мы выполняли лишь GET-операции, позволяющие получать данные от поставщика API, поэтому мы не описывали содержание тела запроса. Однако если вы, как потребитель API, желаете отправить поставщику какие-либо данные (к примеру, посредством операций PUT или POST), то через Tavern это реализуется следующим образом:</p>
10 <p>Пока мы выполняли лишь GET-операции, позволяющие получать данные от поставщика API, поэтому мы не описывали содержание тела запроса. Однако если вы, как потребитель API, желаете отправить поставщику какие-либо данные (к примеру, посредством операций PUT или POST), то через Tavern это реализуется следующим образом:</p>
11 test_name: Check response status code for a very simple addition API stages: - name: Verify that status code equals 200 when two integers are specified request: url: http://localhost:5000/add json: first_number: 5 second_number: 6 method: POST response: status_code: 200<p>Вышеописанный тест отправит JSON-документ посредством POST-запроса {'first_number': 5, 'second_number': 6} к поставщику API, который работает по адресу<strong>localhost: порт 5000</strong>. Учтите, что по вполне понятным причинам этот тест упадёт, когда вы попытаетесь его запустить (правда, можете создать API либо заглушку, что позволит тесту пройти успешно - кстати говоря, это станет прекрасной практикой).</p>
11 test_name: Check response status code for a very simple addition API stages: - name: Verify that status code equals 200 when two integers are specified request: url: http://localhost:5000/add json: first_number: 5 second_number: 6 method: POST response: status_code: 200<p>Вышеописанный тест отправит JSON-документ посредством POST-запроса {'first_number': 5, 'second_number': 6} к поставщику API, который работает по адресу<strong>localhost: порт 5000</strong>. Учтите, что по вполне понятным причинам этот тест упадёт, когда вы попытаетесь его запустить (правда, можете создать API либо заглушку, что позволит тесту пройти успешно - кстати говоря, это станет прекрасной практикой).</p>
12 <p>Пожалуй, на этом можно закончить наше краткое введение в Tavern. Все описанные примеры доступны на<a>GitHub</a>.</p>
12 <p>Пожалуй, на этом можно закончить наше краткое введение в Tavern. Все описанные примеры доступны на<a>GitHub</a>.</p>
13 <p><a>Источник</a></p>
13 <p><a>Источник</a></p>
14  
14