The different ways to test software can be divided into two groups:
In static analysis, we first have the result of the compiler, either in the form of errors or warnings. Second, we find the semantic analysis based on best practices, such as those provided by ReSharper, StyleCop, or FxCop. Finally, we have the formal verification of programs, a branch with a deep theoretical base that is used above all, in protocol verification. Its effectiveness is very high as it checks all possibilities, but at the same time, it needs plenty of resources and specific languages for its execution.
On the other hand, dynamic analysis needs code execution and is able to focus either on isolated parts, or on the whole application. In the first case, we mainly refer to unit testing, where results are executed and verified individually, in an isolated way. Another program...