Тестировать базу данных не так сложно, как вы думаете - знание того, как это сделать, может спасти
Тестирование - очень важная часть жизненного цикла разработки программного обеспечения. Предотвращая и обнаруживая ошибки во всей кодовой базе, он предотвращает множество переделок.
Почти все приложения в той или иной форме используют базу данных. Так можно ли протестировать базу данных? Конечно, может. Если получение и отправка данных - это требование приложения, почему бы не проверить и это? Есть несколько библиотек, которые можно использовать для выполнения этих задач, но в этой части, посвященной тестированию базы данных, Jest будет использоваться для тестирования, а Mongoose - для связи с базой данных Mongo.
Загрузить зависимости
$ yarn add jest mongoose dotenv
Библиотека DotEnv
используется для значений, которые будут использоваться при тестировании. Также есть предостережение при использовании Mongoose с Jest, но есть обходной путь. Создайте файл jest.config.js
и добавьте приведенный ниже код.
+ jest.config.js module.exports = { testEnvironment: 'node' };
Создайте сценарий для тестирования и переменные среды, которые будут включены в тесты. Эти переменные важны для выполнения тестов.
+ package.json "scripts": { "test": "./node_modules/.bin/jest --no-cache" } + .env DATABASE=shop COLLECTION=customers CUSTOMER_NAME=John [email protected] [email protected]
Создайте тестовый файл с блоком описания
Блок описания группирует тесты, чтобы упорядочить их. В этом примере блок описания помечен как «Customer CRUD». Тесты, созданные для представления конечных точек, которые используются для связи с базой данных. Всего будет выполнено пять тестов.
+ database.test.js const mongoose = require('mongoose'); require('dotenv').config(); describe('Customer CRUD',() => { });
Настроить соединение с базой данных
Перед запуском тестов необходимо установить соединение с базой данных с некоторыми другими настройками. У Jest есть две функции, которые нужно включить в блок описания: beforeAll
и afterAll
. Функция beforeAll
выполнит все действия до выполнения тестов, а функция afterAll
выполнит свои действия после завершения тестов.
Установка включает подключение к базе данных, создание базы данных и создание коллекции. База данных будет тестовой базой данных - копией базы данных, используемой в производстве. В этом примере тестовая база данных помечена test_shop
. Действия по удалению включают удаление тестовой базы данных.
beforeAll(async () => { connection = await mongoose.connect('mongodb://localhost:27017/test_'+process.env.DATABASE,{useNewUrlParser: true, useUnifiedTopology: true }); db = mongoose.connection; const collection = process.env.COLLECTION; await db.createCollection(collection); }); afterAll(async () => { const collection = "test_"+process.env.COLLECTION; await db.dropCollection(collection); await db.dropDatabase(); await db.close(); await connection.close(); });
Постановочные тесты
Первый тест - разместить одного покупателя в коллекции покупателя. Это во-первых, потому что следующий тест завершится неудачно, если этот шаг не будет повторен, но цель состоит в том, чтобы тесты оставались компактными. Итак, заказчик добавлен, и ответ проверяется.
test("Add Customer POST /customers",async () => { const response = await customers.create({ name: process.env.CUSTOMER_NAME, email: process.env.CUSTOMER_EMAIL}); await response.save(); expect(response.name).toBe(process.env.CUSTOMER_NAME); });
Затем тест проверит, есть ли клиенты из ответа. Поскольку ответ представляет собой массив объектов, тест ожидает, что длина массива будет больше нуля.
test("All Customers GET /customers", async () => { const response = await customers.find({}); expect(response.length).toBeGreaterThan(0); });
Тест на обновление записи разбит на две части. Один тест проверяет отправленное электронное письмо при сохранении, а другой тест запрашивает обновленную запись, чтобы проверить ее текущий адрес электронной почты. Это должен быть любой альтернативный адрес электронной почты.
test("Update Customer PUT /customers/:id", async () => { const response = await customers.updateOne({name: process.env.CUSTOMER_NAME},{email: process.env.CUSTOMER_EMAIL_ALT}); expect(response.ok).toBeTruthy(); }); test("Customer update is correct", async () => { const responseTwo = await customers.findOne({name: process.env.CUSTOMER_NAME}); expect(responseTwo.email).toBe(process.env.CUSTOMER_EMAIL_ALT); });
Последний тест прост. Тестирование удаления записи с ожиданием правильного ответа:
test("Delete Customer DELETE /customers/:id", async() => { const response = await customers.deleteOne({name: process.env.CUSTOMER_NAME}); expect(response.ok).toBe(1); });
Запустить тест
Теперь, когда тест выполняется, отчет должен вернуть набор и пять тестов пройдены.
$ yarn test
Полный пример
Если вы хотите получать больше подобных сообщений, подпишитесь на мою рассылку, чтобы получать последние новости. "Подписаться на рассылку"