Для игровой площадки и приложений iOS

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

Это руководство призвано помочь вам в этом при реализации вашего проекта на Swift.

Готово… установить… проверить

Сложность: Начинающий | Легко | Нормальный | Испытывающий

Предпосылки:

  • Уясните разницу между терминами подмены, издевательства и подделки (Руководство ЗДЕСЬ)
  • Первая часть руководства посвящена использованию Swift Playgrounds (Руководство ЗДЕСЬ)
  • Вторая часть руководства посвящена созданию нового проекта единого представления (Руководство ЗДЕСЬ).
  • Для скачивания репо вам может понадобиться это (инструкция ЗДЕСЬ)

Терминология

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

Целое число: число без дробной части, то есть без цифр после десятичной точки.

Навигатор проекта: часть интерфейса Xcode, которая позволяет выполнять файловые операции.

Разработка через тестирование (TDD): процесс разработки программного обеспечения, в котором требования преобразуются в тестовые примеры, и выполняется итеративный процесс, чтобы код прошел тесты.

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

XCTest: структура, которая позволяет запускать модульные тесты, тесты производительности и UITests в Xcode.

XCTestCase: класс для определения тестовых случаев, методов тестирования и тестов производительности.

Пример

В некотором смысле, пример, который мы рассмотрим, совершенно неуместен для этих Unit Tests, хотя на самом деле это руководство просто исследует методы, необходимые для того, чтобы читатель мог реализовать Unit Tests в своем собственном коде.

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

Поняв это, давайте продолжим.

Ограничения

В этой статье рассматриваются основы TDD и процесс, который вы должны пройти, а также то, как вы можете реализовать тесты как в Xcode, так и через приложение с одним представлением.

Поскольку оно охватывает только базовое тестирование, более сложные разделы, такие как работа в сети, в этом руководстве не рассматриваются.

Тестирование на детских площадках

Настройка теста

Playgrounds, без сомнения, фантастичны. Что еще лучше, мы собираемся использовать его для управления нашим TDD процессом.

Если мы поместим следующий оператор в начало нового playground, вы сможете использовать Unit testing функции в Xcode

import XCTest

Таким образом, мы можем затем создать тест для простого Integer добавления и добавить его к нашему (ранее пустому) playground. Тест просто проверит, правильно ли работает добавление одного Integer к другому. В этом случае мы добавим 2 к 3, что (вполне ожидаемо) даст 5.

func testAddition() {
    let firstNum = 2
    let secondNum = 3
    XCTAssertEqual(addition(num1: firstNum, num2: secondNum), 5)
}

Для запуска теста мы используем .defaultTestSuite

В данном случае я назвал свой класс MyTests так:

MyTests.defaultTestSuite.run()

Написание настоящего кода

Неизбежно Swift Compiler выдаст нам ошибку, поскольку функция сложения еще не написана. Это не проблема, в конце концов, функция сложения просто добавляет Integer к Integer.

Функция сложение для этого выглядит следующим образом:

func addition(num1: Int, num2: Int) -> Int {
    return num1 + num2
}

В Playground эта функция должна продолжить тесты, поэтому для краткости я покажу готовую площадку здесь:

который затем дает следующий результат (теперь, если вы работаете вместе с этим, время и дата на вашем компьютере будут другими. Если вы не установите дату и время на указанные ниже, но это на вас, если вы хотите это сделать) :

Test Suite 'MyTests' started at 2020-03-30 11:39:57.870
Test Case '-[__lldb_expr_11.MyTests testAddition]' started.
Test Case '-[__lldb_expr_11.MyTests testAddition]' passed (0.012 seconds).
Test Suite 'MyTests' passed at 2020-03-30 11:39:57.885.
Executed 1 test, with 0 failures (0 unexpected) in 0.012 (0.014) seconds

Тесты работали корректно и даже прошли.

Ничего себе.

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

Итерационный процесс

Идея TDD состоит в том, чтобы создать итеративный процесс, и мы должны убедиться, что все пути будут пройдены.

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

  • Отрицательные числа
  • Смесь положительных и отрицательных чисел
  • Нуль
  • Сочетание положительных, отрицательных и нулей в качестве входных данных для функции
  • Очень большие и маленькие числа, в зависимости от бизнес-логики

Тестирование в приложении для iOS

Setting вверх проект единого представления в Xcode

Я создал проект Xcode с одним представлением и назвал его TestingiOS.

Не позволяйте симулятору открываться каждый раз

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

Добавление тестов

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

Поскольку я назвал свой проект TestingiOS, мой файл тестов называется TestingiOSTests и находится в папке TestingiOSTests в нижней части Project Navigator.

Теперь все тесты начинаются со слова test, и по сути это тот же тест, что и раньше, с тем же сообщением об ошибке, что мы еще не объявили нашу функцию сложения.

func testAddition() {
    let firstNum = 2
    let secondNum = 3
    XCTAssertEqual(addition(num1: firstNum, num2: secondNum), 5)
}

То есть ошибка говорит: «Использование неразрешенного идентификатора« добавление »; вы имели в виду "аудитон"? "

что мы, конечно же, НЕ имели в виду (спасибо compiler).

Чтобы решить эту проблему, я собираюсь создать новый файл Swift с именем MathsFunctions.swift, который затем нужно добавить к целевому членству в TestingiOSTests .

Затем мы добавляем наше дополнение, чтобы сделать это следующим образом:

func addition(num1: Int, num2: Int) {
    return num1 + num2
}

Анимированный GIF, который поможет вам в этом? Ok

Запуск тестов

Теперь есть несколько альтернативных способов запуска тестов. Теперь, поскольку это Unit tests, мы можем запускать с помощью ярлыка ⌘U. Альтернативой является довольно привлекательная форма ромба в левой части теста, которая позволяет вам запускать тесты индивидуально.

Этот символ выглядит примерно так:

Когда вы побежите, вам должен быть представлен следующий обнадеживающий символ:

И снова нам следует подумать о создании дополнительных тестов, как это определено в разделе Playgrounds выше.

Репозиторий Git

Репо содержит как Playground, так и проект с одним представлением, как описано выше, конечно, с описанной конфигурацией.

Https://github.com/stevencurtis/SwiftCoding/tree/master/TestDrivenDevelopmentTDD

Заключение

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

Также имейте в виду, что:

  • Пользовательский интерфейс также можно протестировать с помощью инструментов Xcode. Есть путеводитель ЗДЕСЬ.
  • Есть несколько методов тестирования, включая Stubbing, Mocking и Faking, которые было бы разумно изучить. Путеводитель ЗДЕСЬ

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

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

Что может быть лучше этого?

Любые вопросы? Вы можете связаться со мной в Твиттере здесь.