Запуск тестов пакетов Swift в режиме выпуска в Xcode

#swift #xcode #swift-package-manager

#swift #xcode #swift-package-manager

Вопрос:

Я пытаюсь запустить целевой объект тестирования пакета Swift в Xcode в режиме выпуска без создания проекта Xcode.

Однако, когда я устанавливаю конфигурацию сборки схемы тестирования на release, сборка завершается неудачно из-за отсутствия -enable-testing флага, который должен быть передан компилятору при @testable import использовании.

Как я могу добавить этот флаг в Xcode для пакета Swift? Обратите внимание, что традиционные параметры конфигурации сборки недоступны, поскольку проект Xcode не существует. Добавление -Xswiftc -enable-testing в качестве аргументов запуска для схемы тестирования не работает.

Комментарии:

1. какие версии xcode и swift вы используете?

2. Xcode 12.0 (но у меня также была эта проблема с версиями 11.x)

3. Я могу скомпилировать для выпуска. Пожалуйста, поделитесь ошибкой, которая у вас есть?

4. Проблема не в компиляции для выпуска. Но запуск тестов пакетов в режиме выпуска не работает, потому что, если вы используете @testable импорт, MyLibrary was not compiled for testing выдается ошибка.

5. @Palle вы хотите запускать тесты с терминала или внутри Xcode?

Ответ №1:

Вы можете передавать флаги компилятора swift, используя swiftSettings параметр target(name:dependencies:path:exclude:sources:publicHeadersPath:cSettings:cxxSettings:swiftSettings:linkerSettings: ) функция в вашем файле манифеста SPM:

 import PackageDescription

let package = Package(
    name: "MyPackage",
    targets: [
        .target(name: "MyPackage", swiftSettings: [.unsafeFlags(["-enable-testing"])]),
        .testTarget(name: "MyPackageTests", dependencies: ["MyPackage"]),
    ]
)
  

Если, с другой стороны, вы хотите запускать свои тесты с терминала, вы можете использовать -Xswiftc опцию, как обычно:

 swift test -c release -Xswiftc -enable-testing
  

Комментарии:

1. Отлично! Теперь было бы неплохо, если -enable-testing бы это было предусмотрено только при запуске тестов.

2. К сожалению, я больше не могу устанавливать пакет как зависимость в проекте iOS, потому что там запрещены небезопасные лаги.

3. @Palle это прискорбно. Боюсь, вам придется придерживаться второй части моего ответа: используйте терминал для запуска тестов в выпуске. По крайней мере, на данный момент.

4. Да, я уже делал это раньше, но мне было любопытно, доступно ли это и в Xcode.

Ответ №2:

Вы можете скомпилировать свои тесты для выпуска, удалив @testable атрибут import инструкции:

 // MyPackageTests.swift
import XCTest
import MyPackage
...
  

Это частичное решение, потому что ваши тесты не имеют доступа к внутренним объектам в вашем модуле, но оно отлично работает для общедоступных.

Комментарии:

1. Это не вариант для меня, так как я хочу протестировать материал с внутренней видимостью.