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
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
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'
}
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 |
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:
- FontActivityScenario -> in the DeleteDialogWithFontSizeActivityScenarioTest.kt and TrainingViewHolderTest.kt files.
- FontScaleTestRule -> also in the DeleteDialogWithFontSizeTestRuleTest.kt file.