Простые юнит-тесты в разработке под iOS

  • 10 апреля, 11:38
  • 5156
  • 0

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

Основными преимуществами написания юнит-тестов являются:

  1. Код становится рефакторируемым. 
  2. Меньше вероятности введения регрессии в код с хорошим тестом. 
  3. Написание тестов вначале часто облегчает реализацию новой функции, потому что вы намеренно делаете очень маленькие шаги. 
  4. Тесты - это живая документация. Имеется ввиду, что менее вероятно, что она станет асинхронной с реальным кодом, как это часто случается с традиционной документацией на каком-либо веб-сайте.

Окей, тесты хороши и важны. Предположим, вы готовы начать писать тесты для своего кода. Как начать? 

Допустим, у нас есть User структура с именем и фамилией:

struct User {   var firstname: String = ""   var lastname: String = "" }
Теперь нам нужно свойство name, которое firstname и lastname с пространством между ними.

Мы добавим эту функцию с помощью Test-Diven Development (TDD). В TDD вы пишете тест, прежде чем добавлять код для тестирования. Мы предполагаем, что у проекта уже есть цель тестирования. (Если это не так, просто добавьте контрольную цель.)

Теперь тест для функции, которую мы собираемся построить:

import XCTest @testable import MyApp class PropertyTests : XCTestCase {   var sut: User!   override func setUp() {     sut = User()   }   override func tearDown() {     sut = nil   }    func test_name_property() {     // Arrange     // Act     sut.firstname = "Foo"     sut.lastname = "Bar"     // Assert     XCTAssertEqual(sut.name, "Foo Bar")   } }

Попробуйте запустить тест с помощью ярлыка ⌘U. Тест не компилируется, потому что у пользователя нет свойства с именем name. Некомпилируемый тест - провальный тест. Давайте добавим достаточно кода для его компиляции.

struct User {   var firstname: String = ""   var lastname: String = ""   var name: String = "" }
Снова запустите тест с ⌘U. Теперь тест компилируется, но с ошибками. Это хороший знак, потому что мы не реализовали код, который тестируем. Если бы тест прошел до того, как мы реализовали эту функцию, вероятно, тест был бы положительным и поэтому был бы бесполезен.

Когда мы меняем структуру User на следующую, тест проходит:

struct User {   var firstname: String = "" {     didSet {       updateName(firstname: firstname,                  lastname: lastname)     }   }   var lastname: String = "" {     didSet {       updateName(firstname: firstname,                  lastname: lastname)     }   }   var name: String = ""   private mutating func updateName(firstname: String, lastname: String) {     name = "\(firstname) \(lastname)"   } }
Если вы запустите тест еще раз, вы увидите, что теперь он проходит. Потрясающие! Мы просто использовали разработку через тестирование, чтобы добавить функцию в структуру User.


0 комментариев
Сортировка:
Добавить комментарий

IT Новости

Смотреть все