Functional Testing Types

The other day on QAForums, Mark Crowther posted an interesting question:

“If I asked “What Test Types sit under Non-Functional Testing?” you might reply with Accessibility, Compatibility, Performance, Load, Stress, Recovery and a bunch more.
So what sits under Functional (Testing)?”

His question is not trivial.
Maybe it is because we tend to think of Functional Testing simply as making sure the application does what it’s supposed to (and doesn’t do what is not supposed to). Or maybe because many times we confuse testing types with techniques and think that Equivalent Partitioning and Border Case Testing are examples of testing types. In either case, it is something that got me (and a couple of other QAF’s participants) thinking…

Playing the Devil’s Advocate I will start by questioning whether we should care about Functional Testing Types or Categories? Maybe Mark is simply wasting our time with this subject?

The answer is that Mark is not wasting anybody’s time, he is bringing forward a good point. If we don’t have a proper list of Functional Testing Types in hand when planning and/or executing our testing operations, how can we make sure we did not miss something important?

Think of it as a supermarket checklist, you don’t want to get home and then remember that you forgot to buy something important. That’s why you make a list and go over it during the shopping and most importantly before leaving the store.

If we agree that we need a defined list of test types, then what conforms such a list?
I’m sure we all work with multiple types and the problem may be that we call them by different names, so I will leave aside naming conventions and write down my personal Functional Testing Type List.

1. Function-based testing
This is the most straight forward test, where we take each piece of the application and test it individually. For example you can take a date field and try entering all the legal and illegal value types to asses its behavior as a standalone component.

2. Scenario-based testing.
Where we take end-to-end user scenarios and run them in order to review the behavior of the system. In this category or type it is important to work with simple as well as complex scenarios, thinking about all possible real-world situations.

3. Negative testing.
Looking at all the possible things that a user may do wrong in the system and making sure that a correct indication is displayed and no permanent damage is done to the system or its data.

4. Long-range testing.
These are all the scenarios where the system needs to work correctly over long periods of times, including all sorts of maintenance activities that take place only at certain times in the application life-cycle (e.g. log-file recycling).

By now I’m sure you noticed there is some overlapping between the different test types. If you think about it, this also happens in the non-functional test types; but most important is the fact that our objective is to assure we have the correct application coverage by combining (and sometimes even mixing!) all the Functional Test types above.

This list is only my personal list, based solely on my own experience.
If you have additional types add them in the comments section and help me (as well as the rest of the readers) to learn from your experience.