Slide 1

Slide 1 text

Why testing a framework for Android is different David Schreiber-Ranner / PSPDFKit © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 1

Slide 2

Slide 2 text

PSPDFKit • A commercial library for Android, iOS, Chrome OS, Web • Enables developers to build apps with PDFs • Several wrappers • SYNCKit © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 2

Slide 3

Slide 3 text

Try our beta app: pspdfk.it/ viewer © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 3

Slide 4

Slide 4 text

Numbers, numbers, numbers • 7 developers (on the Android stack) • Version 1.0, February 2015 • 39 releases • Currently v2.5.1 © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 4

Slide 5

Slide 5 text

A couple of tests • Android • 144 local unit tests • 814 instrumentation tests • C++ • 753 unit tests © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 5

Slide 6

Slide 6 text

How to test an app? © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 6

Slide 7

Slide 7 text

Example: App on Google Play © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 7

Slide 8

Slide 8 text

Testing setup • Local unit tests • JUnit • Robolectric • Instrumentation tests • Manual testing © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 8

Slide 9

Slide 9 text

Feedback loop • People using your app • Crash reports • Analytics • Feedback © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 9

Slide 10

Slide 10 text

How to test a library? © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 10

Slide 11

Slide 11 text

Example: Library via Maven repository © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 11

Slide 12

Slide 12 text

Testing setup • Local unit tests • JUnit • Robolectric • Instrumentation tests • Manual testing © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 12

Slide 13

Slide 13 text

Feedback loop • No immediate end-users • No runnable app • No analytics • Feedback © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 13

Slide 14

Slide 14 text

Second-hand feedback © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 14

Slide 15

Slide 15 text

Recipe for library testing Cooking with 4 ingredients © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 15

Slide 16

Slide 16 text

Ingredient 1 Write an app © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 16

Slide 17

Slide 17 text

Write an app! • Write an app that uses your library • Add a sample/ app to your project • Use it for development • Use it as documentation © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 17

Slide 18

Slide 18 text

Ingredient 2 Create a test app! © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 18

Slide 19

Slide 19 text

Usual structure my-project/ ├── library/ | ├── main/ | ├── test/ | └── androidTest/ ... © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 19

Slide 20

Slide 20 text

Resulting apk library-debug-tests.apk ├── classes.dex ├── assets/ ├── res/ ├── lib/ ... © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 20

Slide 21

Slide 21 text

Problems with that approach © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 21

Slide 22

Slide 22 text

! 65536 © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 22

Slide 23

Slide 23 text

! ... hmm, interesting. final Context context = InstrumentationRegistry.getContext(); final Context targetContext = InstrumentationRegistry.getTargetContext(); © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 23

Slide 24

Slide 24 text

Improved structure my-project/ ├── library/ | ├── main/ | └── test/ ├── library-tests/ | ├── main/ | └── androidTest/ ... © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 24

Slide 25

Slide 25 text

Resulting apk library-debug.apk ├── classes.dex ├── assets/ ├── res/ ├── lib/ ... library-debug-tests.apk ├── classes.dex ├── assets/ ├── res/ ├── lib/ ... © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 25

Slide 26

Slide 26 text

Ingredient 3 Test your end product © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 26

Slide 27

Slide 27 text

BuildConfig.java public final class BuildConfig { public static final boolean DEBUG = Boolean.parseBoolean("false"); public static final String BUILD_TYPE = "release"; // Your custom build config fields. public static final boolean IS_DEMO = false; public static final boolean IS_RELEASE_BUILD = true; ... } © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 27

Slide 28

Slide 28 text

app/build.gradle android { buildType.release { minifiedEnabled true ... } } © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 28

Slide 29

Slide 29 text

Ingredient 4 Dogfood your library © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 29

Slide 30

Slide 30 text

Dogfooding is short for “Eating your own dog food” which represents the practice of using your own products. © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 30

Slide 31

Slide 31 text

How to dogfood • Write apps using your library • Serve your apps to end users • Tests your app in different scenarios © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 31

Slide 32

Slide 32 text

Summary • Create apps • Split off your tests • Test your end product • Eat all your dog food! © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 32

Slide 33

Slide 33 text

So long, and thanks for all the dog food! © David Schreiber-Ranner 2016 / @flashmasterdash / pspdfkit.com 33