Как выполнить модульное тестирование в Kotlin / Native Multiplatform? - PullRequest
2 голосов
/ 23 мая 2019

Я следовал учебному пособию https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html и хотел провести модульное тестирование общего теста, созданного мной в SharedModule.

enter image description here

То, что я пробовал:

Я пытался использовать kotlin.test в общем файле. Я исследую в Интернете, что вы можете использовать JUnit5, но когда я импортировал в зависимости в общем тесте, я не могу получить доступ к библиотеке kotlin.test. Теперь я успешно реализовал kotlin.test в общем тесте, но как мне его запустить?

Я попробовал gradlew commonTest.kt, но он не работает. Пожалуйста, помогите спасибо!

Коды Gradle моего SharedModule:

    apply plugin: 'kotlin-multiplatform'

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

        fromPreset(iOSTarget, 'iOS') {
            binaries {
                framework('SharedCode')
            }
        }

        fromPreset(presets.jvm, 'android')
    }

    sourceSets {
        commonMain.dependencies {
            api 'org.jetbrains.kotlin:kotlin-stdlib-common'
            api 'org.jetbrains.kotlin:kotlin-stdlib'
            //implementation("com.ionspin.kotlin:bignum:0.0.8")

            //Testing
            //implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutines_version"
            //implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serialization_version"
/*
            implementation "io.ktor:ktor-client-core:$ktor_version"
            implementation "io.ktor:ktor-client-json:$ktor_version"
            implementation "io.ktor:ktor-client-logging:$ktor_version"*/

        }

        commonTest.dependencies{
            //implementation ("org.junit.jupiter:junit-jupiter-api:5.2.0")
            //implementation ("org.junit.jupiter:junit-jupiter-engine:5.0.3")
            //implementation 'junit:junit:4.12'
            implementation 'org.jetbrains.kotlin:kotlin-test-junit5:1.3.31'
            implementation 'org.jetbrains.kotlin:kotlin-test:1.3.31'
            //implementation "io.mockk:mockk-common:1.9.3"
            //implementation 'io.kotlintest:kotlintest-runner-junit5:3.3.0'

            //Testing
            //implementation "org.jetbrains.kotlin:kotlin-test-common"
            //implementation "org.jetbrains.kotlin:kotlin-test-annotations-common"

            //implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
            implementation "io.mockk:mockk:1.8.13.kotlin13"
            implementation "io.mockk:mockk-common:1.8.13.kotlin13"
            implementation 'org.amshove.kluent:kluent:1.42'
        }

        androidMain.dependencies {
            api 'org.jetbrains.kotlin:kotlin-stdlib'
        }
    }
}

// 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'
    final def framework = kotlin.targets.iOS.binaries.getFramework("SharedCode", mode)

    inputs.property "mode", mode
    dependsOn framework.linkTask

    from { framework.outputFile.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

1 Ответ

1 голос
/ 23 мая 2019

Мне удалось заставить это работать на основе mpp-example git repo.Мой файл Gradle выглядит так:

kotlin {
    sourceSets {
        commonTest {
            dependencies {
                implementation kotlin('test-common')
                implementation kotlin('test-annotations-common')
            }
        }
        iosTest {
            dependsOn commonTest //possibly not needed
        }
    }
}
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
        }
    }
}

Основным недостатком является то, что тесты должны выполняться в терминале, и они не выводят красивый HTML-файл впоследствии.Все результаты отображаются в терминале.

...