Software testing is a partial verification procedure of a software system based on the execution of a suite of test scenarios and the comparison with the expected behaviour as described in a specification used to develop it.
Testing can be carried out at different integration level, from independant functions (unit testing), to system level (integration testing) or even considering the system in its environment (user acceptance testing).
Unlike formal verification techniques (proofs, model-checking) testing does not guarantee the absence of errors. The quality of a test suite can however be characterised by its coverage on the tested code.
Tests are most of the time written manually but there exists efficient techniques to deploy them. They can also be generated automatically based on a formal model (Model-Based Testing).