Автор оригинала: Osinachi Chukwujama.
Тестирование является важной частью любого проекта по разработке программного обеспечения. Тестирование дает нам уверенность в нашем кодексе и помогает нам ловусать ошибки перед развертыванием. Добро пожаловать в часть 5 этой серии. Мы написали окончательные API в части 4. Теперь мы напишем функциональные тесты для наших API. Если вам понравится пропустить предыдущие шаги, клонировать репо и оформить заказ к Больше отношения и семя Филиал, затем код вместе.
Функциональное тестирование
По словам Википедии
Функциональное тестирование – это процесс обеспечения качества (QA), а также тип тестирования черного ящика, который основывает свои тестовые случаи по техническим характеристикам программного компонента.
В основном функциональные тесты написаны таким образом, чтобы соответствовать, как реальный пользователь будет взаимодействовать с приложением. Возьмите, например, мы хотим тестировать дополнение курса с нуля. Мы будем
- Откройте безголовый или настоящий браузер
- Перейдите на страницу регистра
- Зарегистрируйте пользователя
- Перейдите к форме дополнения курса
- Заполнить детали
- Сумить форму У нас будет тест, который проведет эти шаги и убедитесь, что ошибка не бросится. Если ошибка брошена, то наши тесты не удаются, и нам придется расследовать, что пошло не так.
Начало работы Тестирование приложений 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, так что это означает, что наш тест работает. Теперь верните утверждение в предыдущее состояние и снова запустите тесты.
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 😂. Но это было довольно путешествие. Я надеюсь, что вы понравились все это. Пожалуйста, мне нужен ваша честная отзыва на
- Учебный стиль
- Если я объяснил слишком много
- Минимальное использование изображений и мем. Не стесняйтесь добавить комментарий. Я действительно хочу расти как писатель, и ваша обратная связь имеет много времени. Спасибо за следующее вместе. Adios ✌🏾🧡.