XCTest или Swift Testing ?
Возможно ты писал тесты с помощью XCTest и задумался о переходе на более современный подход. Swift Testing имеет как общие черты с XCTest, так и различия.
Данная глава включает в себя:
- Сранение функций и методов
- Сравнение XCT* с макросами
- Сравнение поддерживаемых типов данных
- Рекомендации по миграции из XCTest и недостатки Swift Testing
Сравнение функций

Тесты в XCTest — это любой метод начинающийся со слова test. Напротив, в Swift Testing ты указываешь атрибут @Test,
исключая неоднозначность в намерениях. Библиотека тестирования поддерживает больше вариантов функций: ты можешь использовать
не только методы, которые принадлежат этому типу данных, но и глобальные методы, а так же методы помеченные ключевым словом static.
В отличии от XCTest, Swift Testing подерживает трейты, чтобы указать информацию или добавить определенное поведение к типу данных или отдельным функциям.
В конце концов Swift Testing использует другой подход для конкурентного выполнения тестов: под капотом используется Structured Concurrency и поддерживаются физические устройства как iPhone или Apple Watch.
Сравнение XCT* с макросами
Взгляни на таблицу сравнения:

Сравнение результатов очень различаются в старом и новом подходах.
XCTest использует концепт различных проверок начинающихся с префикса XCAssert*.
Swift Testing имеет другой подход — существует только 2 макроса #expect и #require.

Вместо объявления множества различных проверок достаточно использовать операции сравнения языка Swift в этих макросах. Например, используй 2 знака равно ==
для проверки равенства или оператор больше чем > для сравнения 2 значений.

Кроме этого, ты можешь использовать оператор ! (восклицательный знак) для противоположной проверки.
Сравнение поддерживаемых типов данных

Говоря о типах данных, следует напомнить что XCTest поддерживает только классы,
которые наследуются от XCTestCase. В Swift Testing ты можешь использовать стуктуры, акторы и классы.
По возможности используй структуры, посколько они соответствуют value семантики и позволяют избегать ошибок с общим состоянием.
К каждому типу данных неявно применяется атрибут @Suite. Если ты хочешь задать
отображаемое имя или использовать трейт, то в таком случае ты можешь применить атрибут @Suite.
Для выполнения логики перед каждым запуском в XCTest используется метод setUp(..).
Аналогичным способом в Swift Testing используются инициализаторы, которые могут
быть помечены ключевым словом async и/или throws. Для добавления логики после
выполнения теста или типа данных ты можешь использовать деинициализатор deinit {...}.
deinitможно использовать в акторах и классах.~Copyableструктуры не поддерживаются Swift Testing, хоть и имеют возможность использоватьdeinit.
struct C: ~Copyable {
deinit {}
@Test("Ownership for sheep")
func sheepOwner() async throws {
#expect(UnicodeScalar(0x1F411) == "\u{1F411}")
}
}
❌ Ошибка — Noncopyable структуры не поддерживаются в Swift Testing.
Как я ранее упомянул, ты без каких-либо условий можешь делать вложенные типы данных.
Миграция из XCTest
Если ты задумался переписать тесты на современный подход, то у меня хорошие новости — тесты XCTest и Swift Testing могут существовать в одном таргете, поэтому ты можешь мигрировать постепенно и без создания нового таргета. Если класс XCTest содержит только 1 метод, рекомендую сделать его глобальной функцией с атрибутом @Test, это нормальная практика в Swift Testing. При именовании тестов больше не нужен префикс test.
Следует упомянуть о важном недостатке в Swift Testing.
В новой библиотеке отсутствует возможность создания автоматизации пользовательского
интерейса XCUIApplication, а так же тесты производительности XCTMetric.
important
XCUIApplication и XCTMetric не поддерживаются в Swift Testing.
Помимо этого, продолжай использовать XCTest если тесты написаны на
Objective-C, поскольку Swift Testing не поддерживает Objective-C совсем.
В конце концов избегай вызова функций из XCTest в функция Swift Testing или вызов макросов в XCTest.
important
Не вызывай функции из XCTest в Swift Testing.
Не вызывай макросы из Swift Testing в классах XCTest.
Не смешивай старый подход в новом и наоборот.