Создавайте безошибочные приложения для Android

Представьте, что мы хотим построить дом, нам понадобится много рабочих разных профессий, каждый из которых выполняет свою работу. Например, электрик реализует электрическую инфраструктуру домов, а краснодеревщик проектирует и изготавливает шкафы и т. д.

Каждый из них выполняет свою работу (назовем это блоком), а также гарантирует, что он работает нормально (тест). В будущем, если какие-то блоки потребуют обслуживания, мы вызовем конкретного специалиста для обслуживания этого блока и обеспечения его правильной работы.

В разработке программного обеспечения у нас та же идея. У нас есть юниты, каждый юнит выполняет определенную работу, и нам нужно убедиться, что эти юниты работают нормально (как и ожидалось). Итак, модульное тестирование вступает в игру.

Что такое модульное тестирование

Модуль: модуль — это отдельная тестируемая часть программной системы (класс на языке oop).

Тестирование: Убедитесь, что это устройство работает должным образом.

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

Например, проект Android состоит из:

  • Единица: что является производственным кодом или обычным кодом, который мы обычно пишем.
  • Тест. Какие тестовые классы проверяют эти модули.

Преимущества модульного тестирования

«Именно модульные тесты делают наш код гибким, ремонтопригодным и пригодным для повторного использования».

Роберт С. Мартин, Чистый код: руководство по Agile Software Craftsmanship

Гибкость и ремонтопригодность!Как это? Проще говоря, мы можем изменить производственный код, не опасаясь, что изменения повлияют на другие части кода. Вы будете меняться с уверенностью.

Следовательно, это уменьшит затраты и количество ошибок при изменении существующей функциональности.

Возможность повторного использования. Когда мы пишем модульные тесты, особенно если мы используем TDD (разработка через тестирование), мы вынуждены сохранять слабую связанность нашего кода, поэтому его можно использовать повторно.

Кроме того, если юнит-тесты чистые, это будет очень хорошая документация системы.

Вам не кажется, что стоит начать использовать модульное тестирование в своем коде?
Давайте рассмотрим пример.

Пример первого модульного теста

У нас есть класс калькулятора, который мы хотим протестировать:

Я намеренно скрыл реализацию, чтобы мы не относились к ней предвзято, когда будем писать тест.

Это очень простой пример, в сложном случае, если вы увидите реализацию производственного кода перед написанием модульного теста, вы обнаружите, что пишете ошибки как требование в своем модульном тесте.

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

Теперь давайте создадим тестовый класс для калькулятора. Мы можем сделать это, щелкнув правой кнопкой мыши на вашем class -> Generate -> Test

Затем выберите JUnit4. Мы будем использовать его, так как это самая популярная версия.

Теперь нажмите «ОК» и выберите тестовый пакет (не androidTest).

Впоследствии Android Studio сгенерирует CalculatorTest как пустой класс. Мы будем использовать библиотеку JUnit для тестирования нашего класса.

JUnit: это среда модульного тестирования для языка программирования Java.

Вот! Я также добавил несколько переопределенных методов, которые мы объясним чуть позже.

  • @Test: означает, что следующий метод является методом тестирования.
  • @Before: выполняется перед каждым тестом.
  • assertEquals: чтобы убедиться, что ожидаемый результат совпадает с фактическим. Если да, то тест будет пройден, иначе тест будет провален.
  • sut: означает System Under Test, что означает класс, который мы хотим протестировать.

Итак, мы инициализировали класс, который хотим test (sut) в методе setUp().
затем мы вызываем sut.add() в методе testAdd() и берем его результат (actual), чтобы сравнить его с ожидаемым методом through assertEquals().

Давайте запустим этот тест, чтобы увидеть результат. Чтобы запустить тест, вы можете сделать, как показано ниже.

Это запустит тест только для текущего метода. Кроме того, вы можете щелкнуть значок рядом с классом, чтобы запустить все методы тестирования в классе.

Результат:

Как видите, ожидаемый результат отличается от фактического, а это значит, что в нашей реализации есть ошибка. Теперь вернемся к классу Calculator и посмотрим на реализацию:

Здесь мы можем решить проблему, просто вернув x + y.

Итак, класс Calculator после исправления будет выглядеть следующим образом:

Давайте перезапустим тест после того, как исправим ошибку

Наконец, наш тест прошел.

Чтобы сделать наш код гибким, удобным в сопровождении и повторном использовании, мы можем использовать модульное тестирование. Это может занять больше времени и усилий. но это сэкономит наше время позже, а также даст нам все свои преимущества.