In day and out, I come across testers, programmers, managers, and management having efforts on fixing all the crashes. Yes, all the crashes. In a way I see, if the app did not crash, I will not know the areas that is not being handled well enough. My testing focus areas will also have tasks noted in such areas to test and learn as much as possible. I do that task provided I can make/given time for it as it is unplanned task.
The common checks to handle crash!?
I learn, an exception if unhandled at runtime, it leads to crash. There are multiple exception that app can witness which we never thought of during development. In my initial days of testing, I was in assumption, if we can have -- null checks, index check, illegal argument check, and state check for an activity, we have handled most of the exceptions. I learned, I'm wrong! How many checks can I write in the code. I'm not a programmer by job. I'm a tester.
I see these checks are not enough and few more got added to my test strategies eventually -- race conditions, unexpected data, wrong data, environment factors, and many more. The collection of these checks is continuing to grow. Do I cover all these possible crash inducer collections in my testing? No, I can't and I won't have that luxury of time as well. Technically, I will learn and prioritize what to use and when.
How the check looks in code, to me?
I write code for automation, which I need to assist my testing. Here I did write such checks. At a point of time, I saw, the automation code was full of checks. Is that a right way? Definitely not! A professional and skilled programmer might not do that. If a programmer has to have such check in each layers of the app architecture, will that sound good? Personally as a tester, I will not design my tests that way. As I'm not a programmer, I'm not aware of the pros and cons of doing so. At least I know that is not a better practice to have checks in each layer of architecture of the app.
By handling the exception in my automation code, I print stacktrace of exception. But will I learn from it to be a better tester? That's the question I have asked and continue to ask myself. The exception fix I'm doing, is it stopping me from learning the problem which I have introduced by the actions I'm doing on the app? Is that exception blocking me from learning the underlying problem in my automation code and app? If yes, then I have a fundamental problem which I have to work upon is my thought.
Why it crashes?
Why at all the app gets into crash? I learn, if the app gets into a state it was not designed for, it will and should crash. As a tester, I will have to learn this state (and such states) at the earliest when I experience crash and on reading the crash stacktrace. I will be happy and not make a fuss about it, if I see a crash for first.
I learn what is the priority and impact of the crash? Should I invest my time and test investigate further to provide as much as details to programmer? Or should I report it with good enough details and continue my testing? I will answer this question to me. All I wish is, I don't want the user of the app to experience the crash. If there is a crash, as a member from development team my intent is to keep it to minimal number having little or no impact. I see the crash is a great source of learning about my work in the app.
I used to be fussy about crash years back be it on desktop applications, database, web applications and mobile apps. Now, I have come to point, I love them and it is absolutely okay for an app to crash and it should crash. What I do post crash in fixing, that tells the bigger story. In my work, the crashes have made the app better because the team was serious about those crashes.
What on having the crash?
Should the user lose the data what she or he entered on experiencing the crash? I personally, don't want this to happen for me. If it happens, I will be annoyed! That said, how to handle it? That's something we will have to sit with the programmers and team, for discussion.
At what point in app, encountering the crash, should we close the app and start over again. At what point in app, it is okay to note the crash and pull the stacktrace, and let continue the user using the app with data entered intact. At what point in app, I should not show UI in view on entering crash and what to show, then resume over safely from there on. Personally I feel this is a team effort and not just a programmer's effort in making it happen.
Few testing strategies hack to uncover crash
Here are few things I do and I ask my fellow testers to do when testing mobile apps:
- Using the test data which will check the data integrity in app at -- entry point, during processing and post processing.
- Identifying the states of the app and passing the invalid states in app at -- entry point, during processing and post processing.
- Identify the input which is not from a tester and user. Classify the input on which I don't have control. For example -- the incoming intent; the app responding to APIs (default values, entered values and processed values); the app receiving the response from APIs; the device state; app's activity life cycle state and data/state exchange, and many more as this.
- Depending on Android or iOS app, much more strategies can be narrowed down to be specific and work. At the end, what time I'm left with in the test cycle and what do business want, directs me on what to do.
Debugging and Investigation skills
There are libraries which collects the crash on exception along with other details as -- device info, user info and network info. I have been with programmers and had difficulty in reproducing the crash and experience it in development environment. This said, are the logs enough to fix crash? May be, so we handle the exception and continue the flow of app in runtime. But did we solve the root problem that caused the crash? No! This is where, I feel, the skill of a tester comes in and it is very much needed.
This skill defines me what I'm as a tester and value I bring to the system.