Skip to content

An ActivityScenario extension and a Junit4 TestRule to simulate changing the font size on a device/emulator, as it would be done by going to Settings > display > Font size

License

Notifications You must be signed in to change notification settings

sergio-sastre/FontSizeTestRule

Repository files navigation

FontSizeActivityScenario and FontSizeTestRule

An ActivityScenario and a Junit4 TestRule to be used together with its org.junit.runners.Parameterized. It simulates changing the font size on a device/emulator, as it would be done by going to "Settings > display > Font size"

This helps to write snapshot tests that can catch visual regression bugs like this one

FONT SIZE NORMAL FONT SIZE HUGE

This library has been mentioned in

  1. Kotlin Weekly #266

You can read more about it in my series on snapshot testing, featured in :

  1. Android Weekly #479
  2. .kotlinTesting (September 2021)
  3. Software Testing Notes #20
  4. Test Automation Weekly #8

Integration

To integrate FontSizeTestRule into your project:

Add jitpack to your root build.gradle file:

allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}

Add a dependency to build.gradle

dependencies {
    androidTestImplementation 'com.github.sergio-sastre:FontSizeTestRule:v1.1.1'
}

What to keep in mind

Prefer FontSizeActivityScenario to FontSizeTestRule. That is because Google deprecated resources.updateConfiguration(resources.configuration, metrics) on API 25+, and the test rule is based on that method. Therefore, previous to v1.1.0-SNAPSHOT, the TestRule does not work on devices/emulators running 25+. In order to solve this, from 25+, the rule will execute the corresponding adb shell command to change the font size:
"settings put system font_scale ${fontScale.value}
However, this has the drawback that the font size change does not happen immediately, making your tests run more slow.

This issue is overcome by using FontSizeActivityScenario.launchWith(fontScale), available since 'com.github.sergio-sastre:FontSizeTestRule:v1.1.0-SNAPSHOT'. The only inconvenient is that you cannot snapshot-test your own activities with it. That is because in order to use resources.updateConfiguration(resources.configuration, metrics) replacement, we need to override attachBaseContext() in an activity.

Summary

FontSizeActivityScenario FontSizeTestRule
Any API < API 25, otherwise might be more slow
Cannot snapshot-test Activities Can snapshot-test any View
Preferred over FontSizeTesRule Recommended only to snapshot Activites

Usage

If you are using FontSizeActivityScenario you need to add the following activities to your debug/manifest

<application
        ...
   <activity android:name="sergio.sastre.fontsize.activityscenario.SmallFontSizeActivity"></activity>
   <activity android:name="sergio.sastre.fontsize.activityscenario.NormalFontSizeActivity"></activity>
   <activity android:name="sergio.sastre.fontsize.activityscenario.LargeFontSizeActivity"></activity>
   <activity android:name="sergio.sastre.fontsize.activityscenario.HugeFontSizeActivity"></activity>
</application>

or if you are using v1.1.0-SNAPSHOT

<application
        ...
   <activity android:name="sergio.sastre.fontsize.SmallFontSizeActivity"></activity>
   <activity android:name="sergio.sastre.fontsize.NormalFontSizeActivity"></activity>
   <activity android:name="sergio.sastre.fontsize.LargeFontSizeActivity"></activity>
   <activity android:name="sergio.sastre.fontsize.HugeFontSizeActivity"></activity>
</application>

in order to test Jetpack Compose views, use createEmptyComposeRule() together with FontSizeActivityScenario as follows:

@get:Rule
val composeTestRule = createEmptyComposeRule()

@Test
fun composeWithFontSizeTest() {
    FontSizeActivityScenario.launchWith(testItem.fontScale).onActivity {
            it.setContent {
                myComposeView()
            }
        }

    compareScreenshot(composeTestRule, name = testItem.testName)
}

You can find some test samples of FontSizeActivityScenario and FontScaleTestRule in the Road to Effective Snapshot Testing repo:

  1. FontActivityScenario -> in the DeleteDialogWithFontSizeActivityScenarioTest.kt and TrainingViewHolderTest.kt files.
  2. FontScaleTestRule -> also in the DeleteDialogWithFontSizeTestRuleTest.kt file.

About

An ActivityScenario extension and a Junit4 TestRule to simulate changing the font size on a device/emulator, as it would be done by going to Settings > display > Font size

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages