The tools we make use of fall into two types: static analyses tools and dynamic tools. Here is basically an example of the static analyses tools: simple syntax verification, variable declations and very initialisations. Often you can test these things without executing the codes.
The other tools are the dynamic analysis tools. These are usually in conjunction with the actual execution of the code. Now, these tools keep a log of what went during the training, which line, which branch, which failure has occurred, etc. Of course we also use something like test harness, test result comparators.