Тестирование API — это форма тестирования программного обеспечения, которая включает тестирование API напрямую и как часть интеграционного тестирования, чтобы определить, соответствуют ли они ожиданиям в отношении функциональности, надежности, производительности и безопасности.
Предварительные требования:
- Базовые знания JavaScript.
- Node.js установлен на вашем компьютере. Если нет, то скачать здесь.
- npm (менеджер пакетов Node), который поставляется с Node.js.
- Базовое понимание API и методов HTTP (GET, POST, PUT, DELETE).
Глава 1. Общие сведения о тестировании API
1.1 Что такое API?
API означает интерфейс прикладного программирования. Это набор правил, который позволяет программам общаться друг с другом. Разработчик создает API на сервере и позволяет клиенту общаться с ним.
1.2 Что такое тестирование API?
Тестирование API — это тип тестирования программного обеспечения, при котором тестируются интерфейсы прикладного программирования (API), чтобы определить, соответствуют ли они ожиданиям в отношении функциональности, надежности, производительности и безопасности. Поскольку в API отсутствует графический интерфейс, тестирование API выполняется на уровне сообщений.
1.3 Почему важно тестирование API?
Тестирование API имеет решающее значение для выявления типов дефектов, которые трудно обнаружить с помощью других уровней тестирования, например, проблем, связанных с интеграцией и функциональностью.
Глава 2. Планирование тестирования API
Планирование имеет решающее значение в тестировании API. Вот несколько шагов, которые следует учитывать при планировании:
- Понимание API. Вам необходимо понимать, что делает тестируемый API. Это может быть что-то простое, например, управление входом в систему, или такое сложное, как управление обменом данными для большой системы.
- Определите результат. Прежде чем приступить к тестированию, вы должны знать, каких результатов вы ожидаете. Без этого понимания вы не узнаете, работает ли API так, как задумано, или нет.
- Определите свои тесты: определите, что вы будете тестировать. Вы можете тестировать функциональность, надежность, безопасность и/или производительность API. Каждый из них потребует особого подхода.
- Подготовка среды тестирования. Настройте среду тестирования перед запуском тестов. Это включает в себя наличие всех необходимых баз данных и серверов, а также обеспечение доступности API.
- Создание тестовых наборов. Тестовый набор включает этапы тестирования, условия и входные данные. Важно подготовить их заранее.
Глава 3: Передовой опыт тестирования API
Чтобы обеспечить эффективное тестирование API, следуйте этим рекомендациям:
- Проверка на типичные, максимальные и минимальные значения. Всегда проверяйте, как API ведет себя в типичных, пиковых и минимальных условиях нагрузки.
- Приоритет вызовов функций API. Приоритизация тестирования API в зависимости от частоты использования, критичности и сложности реализации.
- Группировать тестовые наборы API по категориям: это обеспечивает последовательное выполнение всех тестовых наборов категории, что экономит время.
- Используйте автоматизацию для регрессионного, нагрузочного и производительного тестирования. Ручное тестирование может занимать много времени и подвержено ошибкам, поэтому рекомендуется автоматизировать его, когда это возможно.
- Наблюдение за рабочими API. Постоянно отслеживайте производительность API, чтобы обеспечить его функциональность, надежность и безопасность.
Глава 4: Настройка среды
Для начала настроим наш проект. Перейдите в каталог вашего проекта и инициализируйте новый проект Node.js:
npm init -y
Далее нам нужно установить jest
для тестирования и axios
для выполнения HTTP-запросов:
npm install --save-dev jest axios
Создайте новый файл для своих тестов, например, api.test.js
.
Глава 5: Написание базовых тестов
5.1 Тестовый GET-запрос
const axios = require('axios'); test('User with ID 1 exists', async () => { const response = await axios.get('https://jsonplaceholder.typicode.com/users/1'); expect(response.status).toBe(200); });
5.2 Содержание тестового ответа
test('User with ID 1 has name "Leanne Graham"', async () => { const response = await axios.get('https://jsonplaceholder.typicode.com/users/1'); expect(response.data.name).toBe('Leanne Graham'); });
5.3 Тестовый POST-запрос
test('Create a new user', async () => { const user = { name: "Test User", username: "testuser", email: "[email protected]" }; const response = await axios.post('https://jsonplaceholder.typicode.com/users', user); expect(response.status).toBe(201); });
Глава 6: Запуск тестов
Добавьте следующее в раздел «скрипты» вашего package.json
:
"scripts": { "test": "jest" }
Теперь вы можете запустить свои тесты с помощью следующей команды:
npm test
Это было базовое введение в тестирование API с помощью JavaScript. Помните, что по мере того, как ваша система становится все более сложной, ваши тесты должны становиться все более изощренными. Удачного тестирования!
Глава 7: Различные типы тестирования API
7.1 Валидационные испытания
Проверочное тестирование гарантирует, что API возвращает правильные данные в правильном формате.
test('User email is valid', async () => { const response = await axios.get('https://jsonplaceholder.typicode.com/users/1'); expect(response.data.email).toMatch(/\S+@\S+\.\S+/); });
7.2 Функциональное тестирование
Функциональное тестирование проверяет, что API работает должным образом и что все взаимодействия с конечными точками работают правильно.
test('Create a new post', async () => { const post = { title: 'foo', body: 'bar', userId: 1 }; const response = await axios.post('https://jsonplaceholder.typicode.com/posts', post); expect(response.data.title).toBe('foo'); expect(response.data.body).toBe('bar'); expect(response.data.userId).toBe(1); });
7.3 Тестирование безопасности
Тестирование безопасности подтверждает, что ваш API защищен от атак и уязвимостей.
test('Cannot access secured endpoint without token', async () => { try { await axios.get('https://myapi/secure'); } catch (error) { expect(error.response.status).toBe(401); } });
7.4 Обнаружение ошибок
Обнаружение ошибок проверяет, как API обрабатывает сбои. Это крах? Возвращает ли он осмысленные сообщения об ошибках?
test('Non-existent endpoint returns 404', async () => { try { await axios.get('https://jsonplaceholder.typicode.com/nonexistent'); } catch (error) { expect(error.response.status).toBe(404); } });
Глава 8: Автоматизация тестов API
Вы можете использовать GitHub Actions, CircleCI, Travis CI или любой другой инструмент CI/CD для автоматизации своих тестов. Каждый раз, когда вы отправляете изменения в код, инструмент автоматически запускает ваши тесты.
Глава 9: Имитация ответов API
Jest позволяет легко имитировать модули в ваших тестах. Вот пример имитации ответа axios get:
jest.mock('axios'); axios.get.mockResolvedValue({ data: { id: 1, name: 'Leanne Graham' } }); test('Get user with ID 1', async () => { const response = await axios.get('https://jsonplaceholder.typicode.com/users/1'); expect(response.data.name).toBe('Leanne Graham'); });
Глава 10: Расширенные концепции тестирования API
10.1 Отрицательное тестирование
Отрицательное тестирование заключается в предоставлении недопустимых входных данных в API, чтобы убедиться, что он может корректно их обрабатывать и возвращать соответствующие сообщения об ошибках.
test('Cannot create user without email', async () => { const user = { name: "Test User", username: "testuser" }; try { await axios.post('https://jsonplaceholder.typicode.com/users', user); } catch (error) { expect(error.response.status).toBe(400); } });
10.2 Цепочка API
Цепочка API включает в себя использование ответа на один вызов API для запуска другого. Это важно, когда последовательность API должна запускаться на основе ответа предыдущего.
test('Get posts by user with ID 1', async () => { const userResponse = await axios.get('https://jsonplaceholder.typicode.com/users/1'); const postsResponse = await axios.get(`https://jsonplaceholder.typicode.com/posts?userId=${userResponse.data.id}`); expect(postsResponse.data[0].userId).toBe(1); });
10.3 OAuth в API
Если ваши API используют OAuth для проверки подлинности и авторизации, вам может потребоваться обработка создания и обновления токена в ваших тестах.
test('Cannot access resource without token', async () => { try { await axios.get('https://myapi/resource'); } catch (error) { expect(error.response.status).toBe(401); } });
В этом руководстве были рассмотрены основы и некоторые дополнительные концепции тестирования API с использованием JavaScript. Помните, что по мере роста вашего приложения будут расти и ваши тесты и методологии. Удачного тестирования!