Today I visited a seminar where different testing methods were classified. The speaker introduced several ways of classifying software testing approaches. The first one divides tests into groups by their scale.
Testing methods by their scale:
- Unit testing
- System testing
- Integration testing
Of course many of us are familiar with unit testing (and tools as xUnit). It is carried out for rather small parts of the system, such as classes, units, etc. These tests are quite low-level and usually done by developers. System testing is performed for the whole system and is often done by customers/testers but not developers. For this reason system testing is often referred to as acceptance testing. Integration testing is done to assure the proper interaction between systems.
Since a system consists of units, a question may arise: isn't unit testing enough to assure the whole system quality? The answer comes from a philosofphical statement that the whole is more then its parts. Similary a whole system is more then the sum of its units and hence requires its own testing.
Another testing methods classification offers breaking tests by their execution manner:
Testing methods by the execution manner:
- Exploratory testing
- Scripted testing
The difference here is simlple. With the scripted testing the test scenarios are known before the tesing begins, and the test is done by the already prepared sequence of steps. During an exploratory testing the tester makes test scenarios on the fly, simultaneously learning the system. With the exploratory testing there is no prepared test script, everything happens "live". Scripted tests may be automated while exploratory tests are the prerogative of good testers.
And again, as it is with unit and system testing, there should be a proper balance between exploratory and scripted testing. One may not rely on a single approach. In my opinion such search of right balance turns the software development from technics into art.