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

Корзина с фруктами: Проверка правил игры

После конфигурации, полной “дыр в коде”, и обсуждения того, что, если что, нам нужно было добавить в нашу o… С тегами тестирования, java, agile.

После конфигурации, полной “дыр в коде”, и обсуждения того, что нам нужно было добавить в наш исходный стек, если что-то нужно, мы были готовы начать нашу первую историю пользователя: целевую страницу.

Наша начальная страница предназначена для отображения навигационной панели вместе со списком всех фруктов в нашей базе данных. История пользователя довольно проста, выполнена в формате “Как, хочет, так что”: Как пользователь, я хочу посетить целевую страницу, чтобы увидеть список всех текущих фруктов. У нас есть контекст (пользователь), действие (посещение целевой страницы) и значение (просмотр текущих результатов).

Критерии принятия немногочисленны и одинаково просты: если фруктов нет, пользователь должен увидеть сообщение “Добавить фрукты”; если есть фрукты, пользователь должен увидеть фрукты. (Оглядываясь назад, обработка ошибок также должна была быть AC: если страница не загружается, отображается сообщение об ошибке.)

В настоящее время у фруктов есть только идентификатор, имя и описание – довольно простые данные. Теперь навигационная панель – это отдельная карточка, поэтому мы просто сосредоточимся на списке фруктов.

Следующий шаг: решите эту задачу. Что нам нужно сделать и к каким файлам нам нужно прикоснуться, чтобы выполнить ACS и завершить карту?

С включенной базой данных нам нужна модель fruit (наш сервер объектно-ориентированный), репозиторий fruit для обработки сопоставления SQL с моделью, служба fruit для обработки бизнес-логики и контроллер fruit для предоставления фактических конечных точек и обработки вызовов. Нам придется создать каталоги и папки для всего этого в одном пакете. Но сначала самое главное: тесты.

Основная цель этого проекта – создать простое приложение CRUD с использованием TDD, или разработки тест-драйва. Вот что это означает на практике:

  • Сначала мы пишем тесты Тесты – это первые строки кода, которые мы пишем всякий раз, когда запускаем новую функциональность. Следовательно…
  • Тесты определяют производственный код Они определяют, какой код написан в первую очередь. Они управляют кодом. Например: мы знаем, что наша служба доставки фруктов должна возвращать товар с именем “яблоко”, когда они получают все фрукты() вызывается метод. Поэтому мы пишем тест, который вызывает get All Fruits() , и ожидается, что результат будет включать строку “яблоко”. Это позволяет нам учитывать результаты и ожидания и, в конечном счете, становиться более ориентированными на ценность. В конце концов, если вы не знаете, что вы хотите, чтобы ваш код делал, зачем писать его в первую очередь?
  • Тесты так же важны, как и производственный код Мы тратим одинаковое время на написание хороших тестов и хорошего кода. Они не являются запоздалой мыслью, и они позволяют нам писать более чистый, более целенаправленный код поэтапным способом, называемым…
  • Детские шаги Мы делаем это шаг за шагом. Если проще всего заставить сервис пройти вышеуказанный тест, жестко запрограммировав возвращаемое значение строки “apple”, то это то, что мы делаем. Тест пройдет, и мы сможем перейти к следующему шагу: рефакторингу.
  • Красный, Зеленый, Рефакторинг Ах, ядро TDD. Напишите свой тест, сделайте так, чтобы он провалился (красный). Напишите свой код и, как можно проще, сделайте так, чтобы он прошел (зеленый). Изначально это может означать жесткое кодирование, как в приведенном выше примере. Затем выполните рефакторинг своего кода. Жесткое кодирование значений – это запах кода, поэтому в этом случае вы бы его переработали. Каждый раз, когда вы вносите изменения, которые могут изменить возвращаемое значение, запускайте тесты.
  • Измените либо свой тест, либо код, но не оба Теперь тесты могут быть переработаны так же, как и код. Но вы не хотите вносить изменения в оба, запускать свои тесты и наблюдать, как они терпят неудачу. Тогда вы не будете знать, что на самом деле не удалось: недавно переработанный код или недавно переработанные тесты. Кроме того, вы можете на самом деле изменить поведение, ожидаемое вашими тестами, что приведет к сбою ранее надежного кода.
  • Пирамида Тестирования Мы будем следовать классической пирамиде тестирования.

    • Модульные тесты составят основную часть нашего набора тестов Эти тесты проводятся с использованием дискретных методов и имеют конкретные ожидания. Например, если я запускаю метод get All Fruits() , который получает всю информацию о фруктах из базы данных, у меня должно быть твердое ожидание его возвращаемого значения (например. массив фруктовых объектов, один из которых содержит название “яблоко”). Их преимущества в том, что они быстры и малы: когда они терпят неудачу, они быстро терпят неудачу, поэтому мы получаем почти мгновенную обратную связь (при условии, что мы регулярно проводим наши тесты); и когда они терпят неудачу, они терпят неудачу для одной части функциональности, поэтому довольно легко определить, какая строка кода не удалась. Кроме того, для их запуска требуется меньше ресурсов. JUnit с библиотекой Hamcrest будут нашими друзьями здесь для бэкенда, наряду с Jest и Enzyme для интерфейса React.
    • Интеграционные тесты формируют наши средние ряды Они немного дороже с точки зрения вычислительных ресурсов, но они проверяют соединения между движущимися частями. Например, наши тесты контроллеров на самом деле являются интеграционными тестами – когда мы достигаем конечной точки, контроллер вызывает службу, которая вызывает хранилище, которое вызывает базу данных, чтобы получить результаты. Здесь вызывается несколько методов из нескольких классов, и мы хотим убедиться, что все работает. Они больше, требуют насмешек и заглушек (к которым мы вернемся в другом посте) и охватывают несколько классов. Они следят за тем, чтобы все работало вместе, но когда они терпят неудачу, на это уходит больше времени, и бывает трудно сказать, что именно терпит неудачу. Мы добавим Mockito в JUnit для этих тестов.
    • Функциональные тесты или тесты пользовательского интерфейса находятся вверху Они тестируют все – пользовательский интерфейс, базу данных, сервисы и т. Д. – Чтобы убедиться, что все это работает правильно. Например, когда пользователь заходит на нашу страницу, он должен видеть все перечисленные фрукты. Это передняя и задняя части, которые работают вместе для достижения единого результата. Эти тесты занимают больше времени и могут потребовать запуска веб-браузера зомби и имитации взаимодействия с пользователем. Когда они терпят неудачу, бывает чрезвычайно трудно сказать, почему. Селен будет нашим предпочтительным инструментом для их автоматизации.

Таковы правила! Пусть (фруктовые) игры начнутся!

Оригинал: “https://dev.to/sleepycecy/fruit-cart-testing-rules-of-the-game-1k0”