Kotlin-multiplatform: как выполнить модульные тесты iOS - PullRequest
0 голосов
/ 02 января 2019

Я работаю над мультиплатформенной библиотекой Kotlin для Android и iOS.Я хочу написать какой-нибудь платформенный модульный тест.Тесты выполняются в соответствии с ожиданиями для общего кода и Android, но не для iOS.

Ниже файла build.gradle модуля общего кода.

apply plugin: "kotlin-multiplatform"

kotlin {
    targets {
        final def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") \
                              ? presets.iosArm64 : presets.iosX64

        fromPreset(iOSTarget, 'iOS') {
            compilations.main.outputKinds('FRAMEWORK')
        }

        fromPreset(presets.jvm, 'android')
    }

    sourceSets {
        commonMain.dependencies {
            implementation "org.jetbrains.kotlin:kotlin-stdlib-common"
        }
        commonTest.dependencies {
            implementation 'org.jetbrains.kotlin:kotlin-test'
            implementation 'org.jetbrains.kotlin:kotlin-test-junit'
        }
        androidMain.dependencies {
            implementation "org.jetbrains.kotlin:kotlin-stdlib"
        }
        androidTest {
            dependencies {
                implementation 'org.jetbrains.kotlin:kotlin-test'
                implementation 'org.jetbrains.kotlin:kotlin-test-junit'
            }
        }
        iOSMain.dependencies {
        }
        iOSTest.dependencies {
            implementation 'org.jetbrains.kotlin:kotlin-test'
            implementation 'org.jetbrains.kotlin:kotlin-test-junit'
        }
    }
}

// workaround for https://youtrack.jetbrains.com/issue/KT-27170
configurations {
    compileClasspath
}

task packForXCode(type: Sync) {
    final File frameworkDir = new File(buildDir, "xcode-frameworks")
    final String mode = project.findProperty("XCODE_CONFIGURATION")?.toUpperCase() ?: 'DEBUG'

    inputs.property "mode", mode
    dependsOn kotlin.targets.iOS.compilations.main.linkTaskName("FRAMEWORK", mode)

    from { kotlin.targets.iOS.compilations.main.getBinary("FRAMEWORK", mode).parentFile }
    into frameworkDir

    doLast {
        new File(frameworkDir, 'gradlew').with {
            text = "#!/bin/bash\nexport 'JAVA_HOME=${System.getProperty("java.home")}'\ncd '${rootProject.rootDir}'\n./gradlew \$@\n"
            setExecutable(true)
        }
    }
}

tasks.build.dependsOn packForXCode

и структуры SharedCode module is:

└── src
    ├── commonMain
    │   └── kotlin
    ├── commonTest
    │   └── kotlin
    ├── androidMain
    │   └── kotlin
    ├── androidTest
    │   └── kotlin
    ├── iOSMain
    │   └── kotlin
    └── iOSTest
        └── kotlin

Тесты, добавленные в папки androidTest и commonTest, работают должным образом, но тесты, добавленные в iOSTest, не запускаются.

Однако, если я заменим строку fromPreset(iOSTarget, 'iOS') { compilations.main.outputKinds('FRAMEWORK') } на fromPreset(presets.macosX64, 'macos') и обновлю имена каталогов соответственно, тесты в папке macosTest будут работать, как и ожидалось.

Почему невозможно запустить тест iOS, когдасоздание iOS-фреймворков?Любая идея о том, что я делаю неправильно или как я могу сделать это работает?:)

Ответы [ 2 ]

0 голосов
/ 31 июля 2019

Ответ от @IlyaMatveev отлично подходит для меня.Но мне пришлось обновить две строки, используя Kotlin Версия 1.3.41:

dependsOn 'linkTestDebugExecutableIos' сейчас dependsOn 'linkDebugTestIos'

def binary = kotlin.targets.ios.binaries.getExecutable('test', 'DEBUG').outputFile сейчас def binary = kotlin.targets.ios.binaries.getTest("DEBUG").outputFile

0 голосов
/ 03 января 2019

В настоящее время плагин kotlin-multiplatform поддерживает только запущенные тесты для хост-платформ (например, macOS или Windows).Но вы можете вручную добавить задачу для выполнения тестов iOS на симуляторе:

task iosTest {
    def device = project.findProperty("iosDevice")?.toString() ?: "iPhone 8"
    dependsOn 'linkTestDebugExecutableIos'
    group = JavaBasePlugin.VERIFICATION_GROUP
    description = "Runs tests for target 'ios' on an iOS simulator"

    doLast {
        def binary = kotlin.targets.ios.binaries.getExecutable('test', 'DEBUG').outputFile
        exec {
            commandLine 'xcrun', 'simctl', 'spawn', device, binary.absolutePath
        }
    }
}

См. Полный скрипт сборки здесь .

...