Alex Zhukovich

@alexzh.com

Android Engineer & author at alexzh.com.

Mastering Android Screenshot Testing gets a new release next week, with 4 new chapters covering testing across devices & configurations, testing animations, and addressing common challenges. The price increases on release. Buy now and get the next updates for free. leanpub.com/mastering-a...

Mastering Android Screenshot Testing

This comprehensive guide explores automated screenshot testing in Android development. Learn the fundamental principles, frameworks, and best practices to catch visual regressions across devices and configurations before they reach production.

leanpub.com

Did you know that buttons in Jetpack Compose have predefined constants for button height and icon size for these button sizes: • Extra small • Medium • Large • Extra large Knowing the button size, you can calculate the recommended font size based on the button height. #AndroidDev #JetpackCompose

Bild

A nice surprise this morning: my book Mastering Android Screenshot Testing is being featured on the Leanpub homepage 🎉 Thank you to everyone who grabbed an early copy. More chapters are on the way! The 10% launch discount is still available: leanpub.com/mastering-a...

Bild

Mastering Android Screenshot Testing is now available. 10 chapters (50% of the full book). Here's what's inside ⬇️ • Why and when to use screenshot testing • Framework comparison: Android Testify, ComposePreview Screenshot Testing, Dropshots, Paparazzi, Roborazzi, Shot

Bild

2% threshold on a Pixel 10? That's 52,358 pixels. Many developers set this number in screenshot tests without understanding what it actually permits.

2.5 years: 1,000+ hours of writing, 2 full drafts, and over 50,000 words, and that's not even counting the code. I'm writing a book on Android screenshot testing, and the first release is coming in April 2026. Here's what it covers ⬇️

Bild

Just found out you can now generate widget previews using Jetpack Compose. Override "providePreview" in your widget class. ⚠️ Android 15+ only (Glance 1.2.0-rc01). For older versions, combine with XML (12+) or images as a fallback.

Your date formatter may work locally, but break elsewhere. SimpleDateFormat(...) and DateTimeFormatter.ofLocalizedDate(...) do not guarantee the result your users expect. Use DateFormat.getBestDateTimePattern() for the right locale pattern. #AndroidDev

Bild

"Just display the number. What could go wrong?" Localize your app into Arabic and find out. Instead of using raw numbers in your UI, use NumberFormat. Not only digits depend on the locale, but also decimal separators, thousand groupings, and many other formatting conventions.

Bild

Last week I published a short article about a small but annoying problem with PreviewParameterProvider in Jetpack Compose. If you've ever used PreviewParameterProvider, you know the pain: your previews have names like "uiState 0", "uiState 1", "uiState 2". Here's how to fit ⬇️

Bild

If you use PreviewParameterProvider in Jetpack Compose, you know the frustration of seeing index-based preview names, like uiState 1. Good news: ui-tooling-preview:1.10.0 finally lets you add custom names to your preview states. Here's how to use it: alexzh.com/how-to-fix-...

How to fix the Compose preview naming problem

If you use PreviewParameterProvider, you've probably struggled with index-based names like "uiState 0" and "uiState 1." Starting with ui-tooling-preview:1.10.0, you can finally add custom display names to your preview states.

alexzh.com

Screenshot testing is no longer optional. Most devs never check out your branch; instead, they read the diff and approve. Now AI writes code faster than humans can review. As a result, more and more UI bugs go to production. Catch them before your users do. #AndroidDev

Do you use the "material-icons" library for Jetpack Compose? Important news: Google team will no longer publish updates for this library, as it's not the recommended way for displaying Material Icons in Compose. Recommended way: Downloading a Vector Drawable XML from the official website (link ⬇️).

Compose Preview Screenshot Testing forces moving your previews into the "screenshotTest" source set, which leads to code duplication or losing your previews. Instead, reuse your preview functions in the screenshotTest source set. Previews + screenshot tests. No duplication. #AndroidDev

Bild

"How do we make our E2E tests fast and stable?" I've answered this question after every UI testing talk I've ever given, and my response always surprises people.

Did you know that the OutputTransformation API lets you format text fields in Jetpack Compose in real time? Here's how to improve entering a card number. You can also use it for phone numbers, dates, postcodes, and more. Do you already use OutputTransformation in your project?

“We don’t have time for visual testing.” That’s what many Android developers say. Many developers think that creating visual tests is hard, as they require separate test cases, learning new frameworks and approaches, and dealing with flaky CI pipelines.

I’ll be speaking at @droidcon.it in Turin about Android UI testing. Here’s what I’ll cover: • Getting started with natural language UI tests • A technical comparison between Journeys, Espresso, UiAutomator, and Compose UI Test Spoiler: There’s no one-size-fits-all solution.

Droidcon Italy@droidcon.it · 11mo ago

👤🟢 Welcome back @alexzh.com to Droidcon Italy 2025! Mobile Engineer, Educator & Author 🇮🇹🎤 🔎 “The Complete Android UI Testing Landscape: From Journey to Traditional Approaches” it.droidcon.com/2025/agenda/ 👉🏻 Curious who else is speaking at hashtag#DroidconItaly25? it.droidcon.com/2025/speakers/

The ButtonGroup component from Material 3 Expressive replaces the SegmentedButtons component. It supports more shapes and includes overflow buttons for additional components that can't fit on the screen. #JetpackCompose

Bild

Building global software isn't just about translation - it's about understanding cultural context. Here are 3 critical locale pitfalls to solve before shipping globally: 1. Currency formatting 2. Date interpretation 3. Number separators Details 🔽