Настройка XCTestCase, очистка и методы тестирования
Структурируйте классы тестов с setUp/tearDown и давайте имена методам тестирования.
«Настройка XCTestCase, очистка и методы тестирования» — бесплатный урок Swift Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Основы XCTestCase
XCTestCase — базовый класс для всех модульных тестов Swift. Каждый метод, начинающийся с «тест», является тестовым случаем.
import XCTest
final class MathTests: XCTestCase {
func testAddition() {
XCTAssertEqual(2 + 2, 4)
}
}setUp и tearDown
setUp() выполняется перед каждым тестом. tearDown() выполняется после каждого теста. Используйте их для инициализации общего состояния и очистки.
final class UserServiceTests: XCTestCase {
var sut: UserService!
override func setUp() {
super.setUp()
sut = UserService()
}
override func tearDown() {
sut = nil
super.tearDown()
}
}setUpWithError и tearDownWithError
Варианты setUp/tearDown, которые могут выдавать ошибки: если настройка завершается ошибкой, тест автоматически помечается как не пройденный.
override func setUpWithError() throws {
sut = try UserService(config: loadTestConfig())
}
override func tearDownWithError() throws {
try sut.cleanup()
}Настройка на уровне класса
class setUp() и class tearDown() выполняются один раз до и после всех тестов в классе — это удобно для дорогостоящих общих ресурсов.
final class DBTests: XCTestCase {
static var db: TestDatabase!
override class func setUp() {
super.setUp()
db = TestDatabase.inMemory()
}
override class func tearDown() {
db.close()
super.tearDown()
}
}Именование методов тестов
Называйте тесты в формате test_methodName_condition_expectedResult, чтобы повысить читаемость и сделать сообщения об ошибках понятными.
func test_login_withValidCredentials_returnsUser() throws { ... }
func test_login_withInvalidPassword_throwsUnauthorized() throws { ... }addTeardownBlock
Регистрируйте блоки очистки для отдельных тестов непосредственно в коде, не переопределяя tearDown.
func testCreateFile() throws {
let url = FileManager.default.temporaryDirectory.appendingPathComponent("test.txt")
addTeardownBlock { try? FileManager.default.removeItem(at: url) }
// ... test
}Отключение тестов
Добавьте префикс _ к методу теста или закомментируйте его, чтобы пропустить тест. XCTest также поддерживает пропуск с помощью XCTSkipIf.
func testExperimentalFeature() throws {
try XCTSkipIf(ProcessInfo.processInfo.environment["CI"] != nil, "Skip on CI")
// ... test
}Методы тестов не могут выдавать ошибки (до Xcode 16)
В более ранних версиях Xcode методы тестов, объявленные с throws, передают ошибки как сбои тестов через XCTAssertNoThrow.
func testDecode() throws {
let user = try JSONDecoder().decode(User.self, from: validJSON)
XCTAssertEqual(user.name, "Alice")
}Явное проваливание теста
Вызовите XCTFail("reason"), чтобы принудительно завершить тест с ошибкой и описательным сообщением.
func testCallback() {
var called = false
service.doWork { called = true }
if !called { XCTFail("Callback was never invoked") }
}Планы тестирования
Планы тестирования Xcode позволяют запускать одни и те же тесты с разными конфигурациями (языком, переменными окружения и санитайзерами).
// File → New → Test Plan
// Add test targets and configure per-configuration env vars
// Useful for running localized UI tests or with Address SanitizerПараллельное тестирование
Включите параллельное тестирование в настройках схемы Xcode, чтобы одновременно запускать классы тестов и сокращать общее время тестирования.
// Product → Scheme → Test → Options → Execute in parallel
// Each XCTestCase class runs in a separate process
// Ensure tests are independent and don't share global stateБыстрая проверка
Какой метод XCTestCase выполняется один раз перед всеми тестами в классе, а не перед каждым отдельным тестом?
Итоги урока
Переопределяйте setUp/tearDown (или варианты, которые могут выдавать ошибки) для настройки и очистки перед каждым тестом. Используйте class setUp/tearDown для ресурсов, общих для всего класса. Давайте тестам описательные имена. Используйте addTeardownBlock для очистки непосредственно в коде и XCTSkipIf для условного пропуска.
Часто задаваемые вопросы
Урок «Настройка XCTestCase, очистка и методы тестирования» бесплатный?
Да — полный текст урока «Настройка XCTestCase, очистка и методы тестирования» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Настройка XCTestCase, очистка и методы тестирования»?
Структурируйте классы тестов с setUp/tearDown и давайте имена методам тестирования. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Настройка XCTestCase, очистка и методы тестирования»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Настройка XCTestCase, очистка и методы тестирования
- Семейство XCTAssert и утверждения с выбрасыванием ошибок
- Имитация на основе протоколов и внедрение зависимостей
- Асинхронные тесты и измерение производительности