Hey All , I am trying to write tests for a Kotlin ...
# announcements
a
Hey All , I am trying to write tests for a Kotlin MPP - for iOS testing found using a simulator - https://github.com/JetBrains/kotlin-native/issues/2426 -
Copy code
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.compilations.test.getBinary('EXECUTABLE', 'DEBUG')
        def infoPlistSrc = file("$rootProject.projectDir/src/iosTest/resources/Info.plist")
        def infoPlistDest = file("$binary.parentFile/Info.plist")

        Files.copy(infoPlistSrc.toPath(), infoPlistDest.toPath(), StandardCopyOption.REPLACE_EXISTING)

        exec {
            commandLine 'export', 'SIMCTL_CHILD_CFNETWORK_DIAGNOSTICS=3'
            commandLine 'xcrun', 'simctl', 'spawn', device, binary.absolutePath
        }
    }
}
- this simulator runs in a terminal and executes the tests. But I can't find any reports generated by it(html/xml ). Is it possible to have reports generated by this simulator ? or is there any other way to generate reports while unit testing a Kotlin iOS output ? . Pls help
b
I made a quick/dirty sed file you can use to convert their test output to junit https://gist.github.com/benasher44/b3cdf4060d4eac24eff85ef08816ffc0
it has some flaws: - If you add prints to your test, that can screw it up - Test durations are not included in the xml output
but, we've been using it since I created it, and it's served us well as a stopgap 🙂
a
In the above code we update the command line arguments as
Copy code
'xcrun', 'simctl', 'spawn', device, binary.absolutePath + --ktest_logger=GTEST | sed -E -f kn_gtest_to_junit.sed
. ?
b
it's a bit more complex. you have to setup a pipe:
Copy code
doLast {
        def originalOutputFile = 'test_report.txt'
        def reportFile = project.findProperty('jUnitReportFile')
        def isReportingToFile = (reportFile != null)
        def outputStream = reportFile == null ? System.out : new FileOutputStream(originalOutputFile)
        def testTask = exec {
            executable 'xcrun'
            args = [
                'simctl',
                'spawn',
                '-s',
                simulatorName,
                testExeTask.outputFile.get()
            ]
            standardOutput = outputStream
            ignoreExitValue = isReportingToFile
        }
        if (isReportingToFile) {
            exec {
                executable 'sed'
                args = [
                    '-E',
                    '-f','fastlane/kn_gtest_to_junit.sed',
                    originalOutputFile
                ]
                standardOutput = new FileOutputStream(reportFile)
            }
            if (testTask.exitValue != 0) {
                throw new GradleException("Tests failed. Exit code: ${testTask.exitValue}. See test report for more info.")
            }
        }
    }
You could also move some of this into a shell script and just invoke that from gradle 🙂
a
Hi - thanks for the suggestions🙂 - Sry for trying this late . what is
Copy code
def reportFile = project.findProperty('jUnitReportFile')
. I am getting it's value as null
b
ah yes this is where we want the file to be stored. it's up to you. for that, you can specify it on the cli to gradlew with
-PjUnitReportFile
or you can just replace that with a hard-coded path
def reportFile = 'path_to_final_xml'
a
oh ok🙂 - thanks again!!!!