Banner

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

  • 10 апреля, 14:38
  • 4032
  • 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 комментариев
Сортировка:
Добавить комментарий