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).
Пример: Тестирование добавления товара в корзину
- Подготовка:
Убедимся, что у нашего тестового пользователя пустая корзина. Находим пользователя и проверяем его поле `cart`.
db.users.findOne({ "email": "qa-user@test.com" });
Ожидаемый результат: поле `cart` либо отсутствует, либо является пустым массивом `[]`.
- Действие: Идем в интерфейс приложения под тестовым пользователем, находим товар с ID "abc-123" и добавляем его в корзину.
- Проверка и Валидация:
Снова находим нашего пользователя в базе и проверяем, что в его массиве `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`).
- Очистка:
Чтобы тест можно было повторить, "очищаем" корзину пользователя, устанавливая для поля `cart` пустой массив.
db.users.updateOne( { "email": "qa-user@test.com" }, { $set: { "cart": [] } } );