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 regresion bugs like this one
FONT SIZE NORMAL | FONT SIZE HUGE |
---|---|
This library has been mentioned in
You can read more about it in my series on snapshot testing, featured in :
- Android Weekly #479
- .kotlinTesting (September 2021)
- Software Testing Notes #20
- 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.0.1'
}
or if you want to try the FontSizeActivityScenario
or use the FontScaleTestRules
reliably on any API level:
dependencies {
androidTestImplementation 'com.github.sergio-sastre:FontSizeTestRule:v1.1.0-SNAPSHOT'
}
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)
, currently available on '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.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:
- FontActivityScenario -> in the DeleteDialogTest.kt file.
- FontScaleTestRule -> also in the DeleteDialogTest.kt file.