Fit Cat is an Android Wear watch face that shows the time with a different cat depending on how many steps you walked that day. How do you test something like that? Walk a lot while looking at your watch all the time?
I wrote Fit Cat with a modular structure that allows both unit testing and instrumentation testing.
All Android Wear apps have two modules,
wear. I made them both depend on a
ui module, which has the implementation for rendering the bitmap for the watch face. This in turn depends on a
lib module, which is a pure Java library.
lib module contains the pure Java class
ActionStore, which has the logic to determine which image to show depending on the time, steps and randomizer value:
- The number of steps decides the action level, each mapping to multiple actions.
- Within that level, an action is picked randomly.
- Within that action, the time determines the image for the animation frame.
The watch face calls
actionStore.getImage(time, steps, randomizerValue) to get the image file name. In the junit tests, various values of
randomizerValue are passed to that function, and the resulting image file names are verified.
Besides verifying the logic, I also want to visually inspect the rendered bitmaps. The
ui module has a
Renderer class with a function
drawWatchFace(canvas, steps, action, time, batteryPercent). I test this function by adding an
InstrumentationTestCase to the
mobile module, which enumerates all possible actions and write the animation frames to sdcard. I then combine them into animated gifs for visual inspection.
wear module also uses this
Renderer class from the
ui module, I am confident that the layout for all the different animation frames are good. Plus, I get to see all the cute actions Fit Cat does!