Тестирование - очень сложный процесс. Наверняка, когда вы спрашиваете других разработчиков, многие вообще не пишут модульные тесты. Модульные тесты являются важным инструментом для создания высококачественных приложений для iOS и позволяют проводить разрушительный рефакторинг без нарушения функциональности.
Основными преимуществами написания юнит-тестов являются:
- Код становится рефакторируемым.
- Меньше вероятности введения регрессии в код с хорошим тестом.
- Написание тестов вначале часто облегчает реализацию новой функции, потому что вы намеренно делаете очень маленькие шаги.
- Тесты - это живая документация. Имеется ввиду, что менее вероятно, что она станет асинхронной с реальным кодом, как это часто случается с традиционной документацией на каком-либо веб-сайте.
Окей, тесты хороши и важны. Предположим, вы готовы начать писать тесты для своего кода. Как начать?
Допустим, у нас есть 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 комментариев
Добавить комментарий