As an occasional poetry/tales writer, I tend (except in certain times) to reread my works before marking them as concluding. Not only to check spelling or logical mistakes, but to check the quality of them. Well, software developing is the same.
Software testing is crucial for functional software. Why? Because we tend to make mistakes. If we were able to write flawless code, then we might not need testing. But given that only Jeff Dean may be like this, we, the mortal programmers & engineers, must test.
Testing helps us finding bugs and fixing them. Bugs are those little errors in the code, which may be unnoticed at first. But, when you notice them, they are a big headache. So, detecting them during development is extremelly better than detecting them during production.
There are two big types of testing: static and dynamic. The first one consists on reading the code, checking out documentation, asking others to review your code. Basic stuff. However, dynamic testing is more complex. Dynamic testing consists in the opposite of static testing: do not read. Work. Try. Experiment.
Some examples of dynamic testing are:
- Alpha & beta testing: give your project to a limited number of users. They will find bugs for you, because users are the worst enemy of programs.
- Destructive testing: try to break the program. If you succeed, then you must fix it.
- Regression test: when you modify the code a lot, test, because it will probably fail.
- A/B testing: given two inputs which are different, see how both outputs change.
As for the levels of testing, we can find:
- Unit testing: as it name suggests, it focuses on units, simple modules, each small brick of the big building.
- Integration testing: it focuses on the integration between units.
- Component interface testing: it focuses on grouping several units and testing its integration with other groups.
- System testing: a bit obvious.
- Operationa acceptance testing: it focuses on the integration with other systems.