Je travaille sur une bibliothèque multiplateforme Kotlin pour Android et iOS. Je veux écrire un test unitaire spécifique à la plate-forme. Les tests s'exécutent comme prévu pour le code partagé et Android mais pas pour iOS.
Sous le fichier build.gradle
du module de code partagé.
âââ src âââ commonMain â âââ kotlin âââ commonTest â âââ kotlin âââ androidMain â âââ kotlin âââ androidTest â âââ kotlin âââ iOSMain â âââ kotlin âââ iOSTest âââ kotlin
et la structure du module SharedCode
est:
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
Les tests ajoutés dans androidTest
et commonTest
fonctionnent comme prévu, mais ceux ajoutés dans iOSTest
ne fonctionnent pas.
Cependant, si je remplace la ligne fromPreset (iOSTarget , 'iOS') {compilations.main.outputKinds ('FRAMEWORK')}
pour fromPreset (presets.macosX64, 'macos')
et mettez à jour les noms de répertoires en conséquence, les tests dans le Le dossier macosTest
s'exécute comme prévu.
Pourquoi n'est-il pas possible d'exécuter un test iOS lors de la création de frameworks iOS? Une idée de ce que je fais mal ou comment je peux faire en sorte que cela fonctionne? :)
3 Réponses :
Actuellement, le plugin kotlin-multiplatform
ne prend en charge que l'exécution de tests pour les plates-formes hôtes (par exemple macOS ou Windows). Mais vous pouvez ajouter manuellement une tâche pour exécuter des tests iOS sur un simualtor:
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 } } }
Voir le script de construction complet ici .
Génial, @IlyaMatveev c'est ce que je cherchais. Merci! :RÉ
Ouvre-t-il le simulateur ios et exécute des tests? Dans mon cas, il n'ouvre pas le simulateur ios comme il le fait lorsque j'exécute un test dans un projet xcode.
@mkkrolik, non, cela n'ouvre pas le simulateur de périphérique mais les tests sont exécutés dans le processus du simulateur.
La réponse de @IlyaMatveev fonctionne parfaitement pour moi. Mais j'ai dû mettre à jour deux lignes en utilisant Kotlin Version 1.3.41:
dependOn 'linkTestDebugExecutableIos'
est maintenant
dependOn 'linkDebugTestIos'
def binary = kotlin.targets.ios.binaries.getExecutable ('test', 'DEBUG'). outputFile
est maintenant def binary = kotlin.targets.ios.binaries.getTest ("DEBUG"). outputFile
Comme je rencontrais des problèmes, je publierai ma solution ici.
Avec Kotlin 1.3.50
et XCode 11
j'ai dû changer ma ligne de commande arguments:
val iosTest: Task by tasks.creating { val device = project.findProperty("iosDevice")?.toString() ?: "iPhone 8" val testExecutable = kotlin.targets.getByName<KotlinNativeTarget>("iosX64").binaries.getTest("DEBUG") dependsOn(testExecutable.linkTaskName) group = JavaBasePlugin.VERIFICATION_GROUP description = "Runs tests for target 'ios' on an iOS simulator" doLast { exec { println(testExecutable.outputFile.absolutePath) commandLine( "xcrun", "simctl", "spawn", "--standalone", device, testExecutable.outputFile.absolutePath) } } } tasks.getByName("allTests").dependsOn(iosTest)
cela devrait être marqué comme réponse pour la dernière version de kotlin et xcode