Тестировать базу данных не так сложно, как вы думаете - знание того, как это сделать, может спасти

Тестирование - очень важная часть жизненного цикла разработки программного обеспечения. Предотвращая и обнаруживая ошибки во всей кодовой базе, он предотвращает множество переделок.

Почти все приложения в той или иной форме используют базу данных. Так можно ли протестировать базу данных? Конечно, может. Если получение и отправка данных - это требование приложения, почему бы не проверить и это? Есть несколько библиотек, которые можно использовать для выполнения этих задач, но в этой части, посвященной тестированию базы данных, 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

Полный пример

Если вы хотите получать больше подобных сообщений, подпишитесь на мою рассылку, чтобы получать последние новости. "Подписаться на рассылку"