As briefly mentioned in the beginning, unit tests are used for testing single units that make up the code architecture. In practice, this means testing individual classes, especially the methods they contain and what they should be doing. Since the testing happens at such low level, they are by far the fastest tests that can be run.
The logic behind unit tests is quite simple--after providing input, the test asserts that the method output is correct. Typically, the more input -> output scenarios it covers, the more stable the tested code is. For example, tests should also cover unexpected scenarios as well as exercise all the code contained in the tested methods (such as forks created by if/else statements).
The programming pattern of dependency injection--objects should receive as dependency other objects they might need--becomes critical when it comes to unit testing...