Skip to content
@KakaoCup

KakaoCup

KakaoCup

KakaoCup ☕

Nice and simple Kotlin DSLs for UI testing. Write automated tests that read like a spec — and enjoy them like a cup of hot chocolate.

Telegram RU Telegram EN License Kotlin


Why KakaoCup?

Raw UI-testing APIs are powerful but noisy. A simple visibility check in plain Espresso looks like this:

onView(allOf(withId(R.id.price_item), hasDescendant(withText("Standard Rate"))))
        .check(matches(withEffectiveVisibility(Visibility.VISIBLE)));

KakaoCup libraries wrap these frameworks in a type-safe Kotlin DSL built around the Page Object pattern. You describe a screen once, then write tests against it:

onScreen<FormScreen> {
    phone { hasText("971201771") }
    submit { click() }
}

Every library in the family shares the same ideas:

  • Readability — tests describe what happens, not how to find it.
  • Reusability — screens and elements are declared once and shared across tests.
  • Extensibility — plug in your own matchers, actions, assertions and custom views.
  • Interceptors — hook into every call for logging, retries or reporting.

Projects

Library What it tests Docs
Kakao Android Views with Espresso kakaocup.github.io/Kakao
Compose Jetpack Compose UI kakaocup.github.io/Compose
Multiplatform Compose Multiplatform UI (early development) —
Appium Cross-platform apps via Appium —

Quick start

Kakao — Android Views

dependencies {
    androidTestImplementation("io.github.kakaocup:kakao:<latest version>")
}
class FormScreen : Screen<FormScreen>() {
    val phone = KEditText { withId(R.id.phone) }
    val submit = KButton { withId(R.id.submit) }
}

@Test
fun submitsForm() {
    onScreen<FormScreen> {
        phone { typeText("971201771") }
        submit { click() }
    }
}

Kakao Compose — Jetpack Compose

dependencies {
    androidTestImplementation("io.github.kakaocup:compose:<latest version>")
}
class MainScreen(provider: SemanticsNodeInteractionsProvider) :
    ComposeScreen<MainScreen>(
        semanticsProvider = provider,
        viewBuilderAction = { hasTestTag("MainScreen") }
    ) {
    val myButton: KNode = child { hasTestTag("myTestButton") }
}

@Test
fun showsButton() {
    onComposeScreen<MainScreen>(composeTestRule) {
        myButton {
            assertIsDisplayed()
            assertTextContains("Button 1")
        }
    }
}

See each repository's README for lists, lazy lists, custom views, interceptors and more.

Community

  • 💬 Chat with us on Telegram — English · Russian
  • 🐛 Found a bug or have an idea? Open an issue in the relevant repository.
  • 🏢 Using Kakao in production? Add your company to ADOPTERS.md.

Contributing

All KakaoCup projects are open source and driven by their users — contributions of any size are welcome, from typo fixes to new DSL elements. Start with the CONTRIBUTING.md and CODE_OF_CONDUCT.md in the repository you'd like to help with, and look for issues labelled help wanted.

License

All projects are licensed under the Apache License 2.0.

Thanks to JetBrains and Firebase for supporting open source.

Popular repositories Loading

  1. Kakao Kakao Public

    Nice and simple DSL for Espresso in Kotlin

    Kotlin 371 32

  2. Compose Compose Public

    Nice and simple DSL for Espresso Compose UI testing in Kotlin

    Kotlin 188 22

  3. Appium Appium Public

    Nice and simple DSL for Appium

    Kotlin 14

  4. Multiplatform Multiplatform Public

    Nice and simple DSL for Compose Multiplatform UI testing in Kotlin

    Kotlin 1

  5. .github .github Public

Repositories

Showing 5 of 5 repositories

Top languages

Loading…

Most used topics

Loading…