87. Переходим с XCTest на Testing
Oleg991Недавно состоялся релиз Xcode 16, а также Swift 6.0 и Swift Testing. В этой статье мы перепишем тесты из статьи № 78 с использованием нового инструмента. Все тесты для статьи можно будет посмотреть в гитхабе по ссылке в заключении.
Как было
func testEmptyCollection() {
let model = ChipCollectionModel(items: [])
XCTAssertEqual(model.rows, 0)
XCTAssertTrue(model.itemsDict.isEmpty)
}
Как стало
@Test
func emptyCollection() {
let model = ChipCollectionModel(items: [])
#expect(model.rows == 0)
#expect(model.itemsDict.isEmpty)
}
Основные изменения
Структура тестов
- XCTest: тестовые функции должны начинаться с префикса "test" и находиться внутри класса, наследующего от
XCTestCase. - Swift Testing: тесты определяются с помощью макроса
@Test, и нет необходимости использовать префикс "test". Тесты могут быть определены в структуре.
Поддержка тегов и метаданных
- XCTest: не поддерживает теги для категоризации тестов.
- Swift Testing: включает возможность добавления тегов к тестам, что позволяет их группировать и управлять запуском. В моем примере тегов нет, но в официальной документации обо всем рассказывают.
Синтаксис
- XCTest: использует самые разные методы типа
XCTAssertEqual,XCTAssertTrueи т.д. - Swift Testing: предоставляет более лаконичный синтаксис с использованием
#expect, что делает код более читабельным и удобным.
Запустим все тесты
Вот что мы видим в консоли Xcode при запуске старых и новых тестов в одном проекте:
◇ Test run started. ↳ Testing Library Version: 94 (arm64-apple-ios13.0-simulator) ◇ Suite ChipCollectionModelTests started. ◇ Test emptyCollection() started. ◇ Test twoRowCollectionEvenCount() started. ◇ Test singleRowCollection() started. ◇ Test twoRowCollectionOddCount() started. ✔ Test singleRowCollection() passed after 0.001 seconds. ✔ Test emptyCollection() passed after 0.001 seconds. ✔ Test twoRowCollectionOddCount() passed after 0.001 seconds. ✔ Test twoRowCollectionEvenCount() passed after 0.001 seconds. ✔ Suite ChipCollectionModelTests passed after 0.001 seconds. ✔ Test run with 4 tests passed after 0.001 seconds. Test Suite 'ChipCollectionModelXCTests' started at 2024-10-04 21:11:10.777. Test Case '-[Shared_SwiftUI_ContentTests.ChipCollectionModelXCTests testEmptyCollection]' started. Test Case '-[Shared_SwiftUI_ContentTests.ChipCollectionModelXCTests testEmptyCollection]' passed (0.001 seconds). Test Case '-[Shared_SwiftUI_ContentTests.ChipCollectionModelXCTests testSingleRowCollection]' started. Test Case '-[Shared_SwiftUI_ContentTests.ChipCollectionModelXCTests testSingleRowCollection]' passed (0.001 seconds). Test Case '-[Shared_SwiftUI_ContentTests.ChipCollectionModelXCTests testTwoRowCollectionEvenCount]' started. Test Case '-[Shared_SwiftUI_ContentTests.ChipCollectionModelXCTests testTwoRowCollectionEvenCount]' passed (0.000 seconds). Test Case '-[Shared_SwiftUI_ContentTests.ChipCollectionModelXCTests testTwoRowCollectionOddCount]' started. Test Case '-[Shared_SwiftUI_ContentTests.ChipCollectionModelXCTests testTwoRowCollectionOddCount]' passed (0.001 seconds). Test Suite 'ChipCollectionModelXCTests' passed at 2024-10-04 21:11:10.781. Executed 4 tests, with 0 failures (0 unexpected) in 0.003 (0.004) seconds
Заключение
Как видно из примера, новый подход применяется очень просто.
Здорово, что Swift Testing может существовать вместе со старыми тестами (XCTest) в одном проекте, так что миграция может проходить постепенно и удобно. Мне нравятся оба подхода, а в пет-проектах уже перехожу на новый ✅
Код для этой статьи можно посмотреть тут, другие статьи по разработке - тут, а про инвестиции - тут.