Testing Compose Multiplatform UI
UI testing in Compose Multiplatform is implemented using the same finders, assertions, actions, and matchers as the Jetpack Compose testing API. If you're not familiar with them, read the Jetpack Compose guide before you continue with this article.
How Compose Multiplatform testing is different from Jetpack Compose
Compose Multiplatform common test API does not rely on JUnit's TestRule class. Instead, you call the runComposeUiTest function and invoke the test functions on the ComposeUiTest receiver.
However, JUnit-based API is available for desktop targets.
Writing and running tests with Compose Multiplatform
First, add the source set for tests and the necessary dependencies to the module. Then, write and run the example test and try to customize it.
Create the test source set and add the testing library to dependencies
To provide concrete examples, the instructions on this page follow the project structure generated by the Kotlin Multiplatform wizard. If you are adding tests to an existing project, you may have to replace shared in paths and commands with the module name you are testing.
When you check the Include tests option in the Kotlin Multiplatform wizard, it generates the basic structure for tests, including *Test source sets.
Set up the UI testing library: In the shared/build.gradle.kts file, add the UI testing library to dependencies of the commonTest source set.
If you need to run instrumented (emulator) tests for Android, amend your Gradle configuration as follows:
In the
shared/build.gradle.ktsfile, add the following code to theandroidLibrary {}block to configure the instrumented test source set to depend on a common test source set.kotlin { //... androidLibrary { withDeviceTestBuilder { sourceSetTreeName = "test" } } }In the
androidApp/build.gradle.ktsfile, add the following code to theandroid.defaultConfig {}block to configure the Android test instrumentation runner:android { //... defaultConfig { //... testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } }In the
androidApp/build.gradle.ktsfile, add the required dependencies in the rootdependencies {}block:dependencies { androidTestImplementation("androidx.compose.ui:ui-test-junit4-android:1.11.1") debugImplementation("androidx.compose.ui:ui-test-manifest:1.11.1") }Select Build | Sync Project with Gradle Files in the main menu, or click the Gradle refresh button in the build script editor.
Remember to create the
shared/src/androidDeviceTestsource set for instrumented tests. Even if the bulk of your tests are incommonTest, theandroidDeviceTestdirectory should have at least theAndroidManifest.xmlfile that points to the general activity that the tests will use:<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application> <activity android:name="androidx.activity.ComponentActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Now, you are ready to write and run common tests for the Compose Multiplatform UI.
Write and run common tests
In the shared/src/commonTest/kotlin/<package> directory, create a file named ExampleTest.kt and copy the following code into it:
To run tests:
There are two options:
In IntelliJ IDEA, you can click the green run icon in the gutter next to the
myTest()function, choose Run | ExampleTest.myTest, then select the iOS target for the test.Run the following command in the terminal:
./gradlew :shared:iosSimulatorArm64Test
Run this command in the terminal:
Currently, you cannot run common Compose Multiplatform tests using android (local) test configurations, so gutter icons in Android Studio, for example, won't be helpful.
You have two options:
Click the green run icon in the gutter next to the
myTest()function and choose Run | ExampleTest.myTest, then select the JVM target.Run the following command in the terminal:
./gradlew :shared:jvmTest
Run this command in the terminal:
What's next
Now that you got the hang of Compose Multiplatform UI testing, you may want to check out more testing-related resources:
For a general overview of testing in a Kotlin Multiplatform project, see Understand basic project structure and the Test your multiplatform app tutorial.
For details on setting up and running JUnit-based tests for desktop targets, see Testing Compose Multiplatform UI with JUnit.
For localization tests, see Testing locales on different platforms.
More advanced testing in Android Studio, including automation, is covered in the Test your app article in the Android Studio documentation.