All Projects → sergio-sastre → FontSizeTestRule

sergio-sastre / FontSizeTestRule

Licence: Apache-2.0 license
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

Programming Languages

kotlin
9241 projects

Projects that are alternatives of or similar to FontSizeTestRule

gradle-android-emulator
Gradle plugin for starting the Android Emulator when running instrumentation tests
Stars: ✭ 30 (+57.89%)
Mutual labels:  instrumentation-tests
fastlane-plugin-run tests firebase testlab
Runs Android tests in Firebase Test Lab 🚀
Stars: ✭ 46 (+142.11%)
Mutual labels:  instrumentation-tests
marathon
Cross-platform test runner written for Android and iOS projects
Stars: ✭ 398 (+1994.74%)
Mutual labels:  instrumentation-tests

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.
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].