Для игровой площадки и приложений 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
, вы начнете видеть преимущества создания программного обеспечения, которое должным образом протестировано и извлекает выгоду из размышлений о том, как функции должны работать , прежде чем писать код. .
Эти инструменты не только порадуют вашего менеджера, но и сэкономят ваше время и помогут создать отличное программное обеспечение.
Что может быть лучше этого?
Любые вопросы? Вы можете связаться со мной в Твиттере здесь.