There are no perfect techniques. Testing is a best effort activity.
Approaches
- Black box testing
- Covers as much specified behaviour as possible from software description
- White box testing
- Covers coded behaviour and is based on the code which reveals implementation errors
Black Box
- Checks conformance with specifications
- Scales up (different techniques at different granularity levels)
- Depends on the specification notation and degree of detail
- Does not tell us how much of the system is being tested
- What if the software performed some unspecified, undesirable task?
White Box
- Lets you be confident in test coverage
- Is based on control or data flow coverage
- Does not scale up (applicable at the unit level)
- Cannot reveal missing functionality
Levels of Software Testing
- Unit Testing
- Test individual functionality in isolation
- Integration Testing
- Test the interface of related units
- System Testing
- Test the entire software system and evaluate the systems compliance with the specified Requirements

Effectiveness
- The goal here is to find all bugs in a software. The state of the art way of testing is: Mutation Testing which should be used in conjunction with traditional testing techniques.