Рубрики
Без рубрики

CGPA Calculator с Adonisjs: тестирование API

Если вы хотите узнать, как создавать API, используя Adonisjs в моде на основе проекта, ваше желание было выполнено. Учитесь создавать реальный API (CGPA Calculator) с использованием Adonisjs.

Автор оригинала: Osinachi Chukwujama.

Тестирование является важной частью любого проекта по разработке программного обеспечения. Тестирование дает нам уверенность в нашем кодексе и помогает нам ловусать ошибки перед развертыванием. Добро пожаловать в часть 5 этой серии. Мы написали окончательные API в части 4. Теперь мы напишем функциональные тесты для наших API. Если вам понравится пропустить предыдущие шаги, клонировать репо и оформить заказ к Больше отношения и семя Филиал, затем код вместе.

Функциональное тестирование

По словам Википедии

Функциональное тестирование – это процесс обеспечения качества (QA), а также тип тестирования черного ящика, который основывает свои тестовые случаи по техническим характеристикам программного компонента.

В основном функциональные тесты написаны таким образом, чтобы соответствовать, как реальный пользователь будет взаимодействовать с приложением. Возьмите, например, мы хотим тестировать дополнение курса с нуля. Мы будем

  1. Откройте безголовый или настоящий браузер
  2. Перейдите на страницу регистра
  3. Зарегистрируйте пользователя
  4. Перейдите к форме дополнения курса
  5. Заполнить детали
  6. Сумить форму У нас будет тест, который проведет эти шаги и убедитесь, что ошибка не бросится. Если ошибка брошена, то наши тесты не удаются, и нам придется расследовать, что пошло не так.

Начало работы Тестирование приложений Adonis

@ adonisjs/кровь Стандартная библиотека, построенная для рамки, использует Chai под капотом для утверждений. Мы будем в основном быть тестированием с использованием утверждений. Начните, установив обет

adonis install @adonisjs/vow

Установка добавляет три файла в ваш проект. Добавьте конфигурацию в массив ACEProviders app.js

const aceProviders = [
  // ...other providers
  '@adonisjs/vow/providers/VowProvider'
]

Вы можете увидеть, как тестирование работает при испытаниях .spec.js

adonis test

Выход

  Example
    ✓ make sure 2 + 2 is 4 (2ms)

   PASSED 

  total       : 1
  passed      : 1
  time        : 6ms

Предварительная проверка контрольного списка: люксы и черты

Ниже приведен содержимое примера тестового файла.

'use strict'

const { test } = use('Test/Suite')('Example')

test('make sure 2 + 2 is 4', async ({ assert }) => {
  assert.equal(2 + 2, 4)
})

Обратите внимание, что мы разрушили тестовую функцию от Тест/Люкс Отказ Поскольку мы тестируем API, нам нужна версия Postman JS. Это предоставляется Тест/apiclient , черта. Черты были реализованы для сохранения тестового бегуна Scean, поэтому требуется любая желаемая функциональность при необходимости.

По сути, мы получаем черта из Suite и требовать Тест/apiclient черта характера. Поскольку некоторые из наших маршрутов требуют аутентификации, мы также требуем Auth/Client черта характера.

const { test, trait } = use("Test/Suite")("Example");

trait("Test/ApiClient");
trait("Auth/Client");

Чтобы понять больше о люксах и чертах, я предлагаю вам прочитать Документы Отказ Команда Adonis провела работу, объясняя люксы и черты.

Наши первые тесты

Мы будем структурировать наши тесты, такие что каждый контроллер будет содержать тесты для каждого метода. Идите вперед и удалите example.spec.js, затем запустите это

adonis make:test User -f
# output: create: test/functional/user.spec.js

Заменить содержимое пользователя .spec.js с этим

"use strict";

const { test, trait } = use("Test/Suite")("User");

trait("Test/ApiClient");
trait("Auth/Client");

const User = use("App/Models/User");

Тестирование регистрации

Мы будем следовать Конвенции об использовании настоящего времени на тестовых случаях. Здесь мы проверяем маршрут реестра и утверждаю, что статус 201.

test("registers a new user", async ({ client }) => {
  const response = await client
    .post(`/api/v1/register`)
    .send({
      email: "test-user@email.com",
      password: "some password",
      grade_system: "5",
    })
    .end();

  await response.assertStatus(201);
});

Кент C. Dodds всегда говорит, что ваш тест работает, кормите это неправильное утверждение. Итак, мы будем активать 200 и запустить наши тесты.

- response.assertStatus(201);
+ response.assertStatus(200);

Теперь запустите тесты

Неудачные тесты

Наши тесты заявили, что ожидали 201 до равных 200. Мы знаем, что это предназначено для 201, так что это означает, что наш тест работает. Теперь верните утверждение в предыдущее состояние и снова запустите тесты.

Скриншот с 2020-11-28 19-49-57.png

Huh 🤨? 400? Помните, что Регистрация () Способ в usercontroller.js Возвращает ошибки для неуникальных электронных писем. Мы, вероятно, должны написать тест на это тоже, а? Измените электронную почту и снова запустите тест.

Прохождение регистрации

Ура 🎊! Это сработало! Это войлочное руководство и не идеально. Вы знаете, что будет лучше? Отдельная база данных тестирования, которая будет перенесена и посеяна перед любыми тестами, выполняемыми и вернут миграции после выполнения всех испытаний.

Настройка настройки тестирования

Первые вещи сначала давайте создадим тестирование БД. Если вы используете SQLite, создайте один в каталоге базы данных.

touch database/testing.sqlite

Если вы используете другую БД, создайте тестовую базу данных. Назовите это все, что вы хотите.

В .env.testing, добавьте имя базы данных

DB_DATABASE=testing

.env.testing используется для переопределения значений по умолчанию .env при тестировании. Мы завершим нашу конфигурацию в Vowfile.js. Vowfile.js используется для предварительных испытаний и настройки после тестов. Прежде всего, безответный туза импорт: //const ('@ adonisjs/ace') Отказ В бегунке. Предпоследствие функции, безотчетное //await Ace.call («Миграция: RUN», {}, {Silent: True}) и добавьте это под ним

    await ace.call('seed', {}, { silent: true })

Аналогично, в Runner.after , безотчетное //await Ace.call («Миграция: сброс», {}, {Silent: True}) Отказ

Теперь запустите тесты несколько раз, чтобы убедиться, что мы не работаем в этом 400.

Тестирование авторизации только маршрута:

Давайте проверим маршрут, который требует аутентификации: Обновление/профиль Отказ Во-первых, мы создадим дело рядом с тестовым пользователем.

test("updates a user's profile", async ({ client }) => {
  const user = await User.create({
    email: "some-other-email@email.com",
    password: "some password",
  });
});

Затем мы называем API с loginvia метод прилагается. Обратите внимание, что мы не сможем использовать loginvia Не требуя Черта («auth/Client») Отказ Наконец, мы утверждаем, что статус 200 и возвращенные JSON содержать имена.

  response.assertStatus(200);

  response.assertJSONSubset({
    firstName: "John",
    lastName: "Doe",
  });

Мы могли бы также использовать Assertjson , но это потребует, чтобы мы включаем каждое поле возвращенного JSON. Это не может быть идеально для каждого случая. Узнайте больше о утверждениях здесь Отказ

Проверьте новый тестовый случай.

Два прохождения тестовых случаев

И что теперь?

Теперь вы тестируете другие маршруты. Напишите как можно больше тестовых случаев, когда вы считаете нужным. Если вы сравните свои тесты с моим, оформируйте оформление Главная ветвь на Это репо

Прощание

Это было 5 предметов храбрости и чести. Он не может отрицать, насколько я впечатлен, я хочу, чтобы ты стал героем Адониса моим молодым чернобоем. Нет, это не правильно, мы писали APIS 😂. Но это было довольно путешествие. Я надеюсь, что вы понравились все это. Пожалуйста, мне нужен ваша честная отзыва на

  1. Учебный стиль
  2. Если я объяснил слишком много
  3. Минимальное использование изображений и мем. Не стесняйтесь добавить комментарий. Я действительно хочу расти как писатель, и ваша обратная связь имеет много времени. Спасибо за следующее вместе. Adios ✌🏾🧡.