87. Переходим с XCTest на Testing

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: использует самые разные методы типа XCTAssertEqualXCTAssertTrueи т.д.
  • 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) в одном проекте, так что миграция может проходить постепенно и удобно. Мне нравятся оба подхода, а в пет-проектах уже перехожу на новый ✅

Код для этой статьи можно посмотреть тут, другие статьи по разработке - тут, а про инвестиции - тут.

Report Page