Интерактивный учебник по MongoDB для QA

Практическая шпаргалка по NoSQL: от основ до сложных запросов и алгоритмов для тестировщиков.

1. Что такое NoSQL и MongoDB?

NoSQL ("Not only SQL") — это класс баз данных, которые хранят информацию не в виде таблиц со строками (как SQL), а в других форматах. MongoDB — одна из самых популярных NoSQL баз данных.

Ключевые отличия от SQL:

  • Гибкая структура: Вам не нужно заранее определять все "столбцы". Каждый документ может иметь свой собственный уникальный набор полей.
  • Хранение данных: Вместо таблиц и строк, MongoDB использует коллекции и документы.
  • Формат документов: Документы хранятся в формате BSON (бинарный JSON), что позволяет хранить вложенные структуры (объекты в объектах) и массивы.

Терминология: SQL vs MongoDB

SQL MongoDB Описание
База данных (Database) База данных (Database) Контейнер для коллекций.
Таблица (Table) Коллекция (Collection) Группа документов.
Строка (Row) Документ (Document) Запись в формате BSON (ключ-значение).
Столбец (Column) Поле (Field) Ключ в документе.

2. Создание документов (Create)

Перед созданием документов, нужно выбрать базу данных и коллекцию. MongoDB создаст их автоматически при первом использовании.

// Переключаемся на базу 'staff'. Если ее нет, она будет создана. use 'staff';

// Коллекция 'users' также будет создана при первой вставке данных.

insertOne: Вставить один документ

QA-кейс: Создать одного тестового пользователя для проверки функции логина.

db.users.insertOne({
    "name": "Иван Петров",
    "email": "ivan@test.com",
    "age": 30,
    "is_active": true,
    "roles": ["user", "reader"]
});

insertMany: Вставить несколько документов

QA-кейс: Подготовить набор тестовых данных (например, несколько товаров) для проверки страницы каталога.

db.users.insertMany([
    { "name": "Анна Сидорова", "email": "anna@test.com", "age": 25 },
    { "name": "Сергей Иванов", "email": "sergey@test.com", "age": 35, "tags": ["vip"] }
]);

3. Поиск документов (Read)

Чтение данных — самая частая операция для тестировщика, позволяющая проверить результат действий.

find: Найти все документы

QA-кейс: Посмотреть все документы в коллекции, чтобы получить общее представление о данных.

// .pretty() форматирует вывод в удобном для чтения виде db.users.find({}).pretty();

find с критерием: Найти конкретные документы

QA-кейс: После регистрации пользователя "Иван Петров", найти его в базе по email, чтобы убедиться, что запись создана.

db.users.find({ "email": "ivan@test.com" });
Результат:
{
    "_id": ObjectId("..."),
    "name": "Иван Петров",
    "email": "ivan@test.com",
    "age": 30,
    ...
}

findOne: Найти первый попавшийся документ

QA-кейс: Быстро проверить, есть ли в коллекции хотя бы один пользователь с ролью "admin".

db.users.findOne({ "roles": "admin" });

4. Обновление документов (Update)

Для обновления используется оператор $set, который изменяет значение указанного поля.

updateOne: Обновить один документ

QA-кейс: Проверить функцию смены email. Найти пользователя по старому email и установить ему новый.

db.users.updateOne(
    { "email": "ivan@test.com" },  // Фильтр: какой документ ищем
    { $set: { "email": "ivan.new@test.com" } } // Действие: что обновляем
);

updateMany: Обновить несколько документов

QA-кейс: Протестировать массовую акцию. Всем неактивным пользователям (is_active: false) добавить поле `promo_notified: true`.

db.users.updateMany(
    { "is_active": false },
    { $set: { "promo_notified": true } }
);

5. Удаление документов (Delete)

Важный шаг для "очистки" тестовой среды после выполнения тестов.

deleteOne: Удалить один документ

QA-кейс: После завершения теста, удалить созданного тестового пользователя "Иван".

db.users.deleteOne({ "email": "ivan.new@test.com" });

deleteMany: Удалить несколько документов

QA-кейс: Перед запуском набора автотестов, удалить всех пользователей, созданных предыдущими прогонами (например, у которых email содержит "test.com").

db.users.deleteMany({ "email": /test\.com$/ }); // Используется регулярное выражение

6. Операторы запросов

Операторы позволяют строить сложные запросы для поиска данных.

  • $eq (equal) — равно (используется по умолчанию, можно опускать).
  • $ne (not equal) — не равно.
  • $gt (greater than) — больше чем.
  • $gte (greater than or equal) — больше или равно.
  • $lt (less than) — меньше чем.
  • $lte (less than or equal) — меньше или равно.
  • $in — значение находится в указанном массиве.
  • $nin (not in) — значение не находится в указанном массиве.

Пример сложного запроса

QA-кейс: Найти всех активных пользователей старше 25 лет, у которых есть роль "vip" или "editor".

db.users.find({
    "age": { $gt: 25 },
    "is_active": true,
    "roles": { $in: ["vip", "editor"] }
});

7. Практический алгоритм для QA

Вот как выглядит типичный рабочий процесс тестировщика с MongoDB.

Шаг 0: Получение доступа

Запросите у системного администратора или тимлида строку подключения (Connection String). Она выглядит примерно так:

mongodb+srv://user:password@cluster-address.mongodb.net/database_name

Эту строку вы будете использовать в вашем клиенте для подключения (MongoDB Compass, Studio 3T, NoSQLBooster).

Пример: Тестирование добавления товара в корзину

  1. Подготовка: Убедимся, что у нашего тестового пользователя пустая корзина. Находим пользователя и проверяем его поле `cart`.
    db.users.findOne({ "email": "qa-user@test.com" });

    Ожидаемый результат: поле `cart` либо отсутствует, либо является пустым массивом `[]`.

  2. Действие: Идем в интерфейс приложения под тестовым пользователем, находим товар с ID "abc-123" и добавляем его в корзину.
  3. Проверка и Валидация: Снова находим нашего пользователя в базе и проверяем, что в его массиве `cart` появился новый объект.
    db.users.findOne({ "email": "qa-user@test.com" });
    Ожидаемый результат (документ пользователя):
    {
        ...,
        "email": "qa-user@test.com",
        "cart": [
            { "product_id": "abc-123", "quantity": 1, "added_at": ISODate("...") }
        ]
    }

    Мы валидируем, что в корзине появился именно нужный товар (`product_id`) в нужном количестве (`quantity`).

  4. Очистка: Чтобы тест можно было повторить, "очищаем" корзину пользователя, устанавливая для поля `cart` пустой массив.
    db.users.updateOne(
        { "email": "qa-user@test.com" },
        { $set: { "cart": [] } }
    );