Тестирование API — это форма тестирования программного обеспечения, которая включает тестирование API напрямую и как часть интеграционного тестирования, чтобы определить, соответствуют ли они ожиданиям в отношении функциональности, надежности, производительности и безопасности.

Предварительные требования:

  1. Базовые знания JavaScript.
  2. Node.js установлен на вашем компьютере. Если нет, то скачать здесь.
  3. npm (менеджер пакетов Node), который поставляется с Node.js.
  4. Базовое понимание 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. Вот несколько шагов, которые следует учитывать при планировании:

  1. Понимание API. Вам необходимо понимать, что делает тестируемый API. Это может быть что-то простое, например, управление входом в систему, или такое сложное, как управление обменом данными для большой системы.
  2. Определите результат. Прежде чем приступить к тестированию, вы должны знать, каких результатов вы ожидаете. Без этого понимания вы не узнаете, работает ли API так, как задумано, или нет.
  3. Определите свои тесты: определите, что вы будете тестировать. Вы можете тестировать функциональность, надежность, безопасность и/или производительность API. Каждый из них потребует особого подхода.
  4. Подготовка среды тестирования. Настройте среду тестирования перед запуском тестов. Это включает в себя наличие всех необходимых баз данных и серверов, а также обеспечение доступности API.
  5. Создание тестовых наборов. Тестовый набор включает этапы тестирования, условия и входные данные. Важно подготовить их заранее.

Глава 3: Передовой опыт тестирования API

Чтобы обеспечить эффективное тестирование API, следуйте этим рекомендациям:

  1. Проверка на типичные, максимальные и минимальные значения. Всегда проверяйте, как API ведет себя в типичных, пиковых и минимальных условиях нагрузки.
  2. Приоритет вызовов функций API. Приоритизация тестирования API в зависимости от частоты использования, критичности и сложности реализации.
  3. Группировать тестовые наборы API по категориям: это обеспечивает последовательное выполнение всех тестовых наборов категории, что экономит время.
  4. Используйте автоматизацию для регрессионного, нагрузочного и производительного тестирования. Ручное тестирование может занимать много времени и подвержено ошибкам, поэтому рекомендуется автоматизировать его, когда это возможно.
  5. Наблюдение за рабочими 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. Помните, что по мере роста вашего приложения будут расти и ваши тесты и методологии. Удачного тестирования!