Giter VIP home page Giter VIP logo

fontsizetestrule's Introduction

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.

fontsizetestrule's People

Contributors

sergio-sastre avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

Forkers

akjaw

fontsizetestrule's Issues

Problem with Emulators with API 26+

Hello, I couldn't find any guidelines for issues so I'll just explain the problem I'm experiencing.

I have a Jetpack Compose project for which I want to try out Snapshot testing. I was following the README for the RoadToEffectiveSnapshotTesting project and created a parameterized test where the font changes.

Shot only supports API's 26+ to create a screenshot for composables. However when I tried using this TestRule on API 26, 28 and 30 the font did not change. Neither in my own project nor in the RoadToEffectiveSnapshotTesting one.

I'm not sure if this is a problem with my machine / emulators or the TestRule. I wasn't able to debug the TestRule because I only had access to the decompiled sources (maybe it would be possible to expose the source code through the library to make debugging easier?).

My current hack to change the font looks like this:

@Before
fun setUp() {
    InstrumentationRegistry
        .getInstrumentation()
        .uiAutomation
        .executeShellCommand("settings put system font_scale ${data.fontScale.value}")
        .apply {
            Thread.sleep(2000)
            close()
        }
}

@After
fun tearDown() {
    InstrumentationRegistry
        .getInstrumentation()
        .uiAutomation
        .executeShellCommand("settings put system font_scale 1.0")
        .apply {
            Thread.sleep(1000)
            close()
        }
}

But this is only an temporary solution ๐Ÿ˜„

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.