# Overview

### Motivation

The software development process involves many stages, ranging from early design to deployment. Each and every stage in this process can and should be verified before proceeding to the next stage, The ultimate tool for this end is the unit testing which should simulate various scenarios and provide the fastest possible feedback. Ensuring unit testing integration as well as other types of automated testing is crucial for futher continuous delivery and deployment implementations.

### Fakes and Data&#x20;

There are various definitions of unit tests which depend on the person actually defining them yet one thing remains common: the dependencies which are external to the test scope should be substituted by the entities simulating the desired behavior. You may be familiar with them as **mocks**, **substitutes**, **stubs**. In this article they will be referred to as **fakes**. \
Another important aspect of writing successful tests is the ability to efficiently create and load the actual data during the **Arrange** test stage. This is needed to simulate even more complex scenarios.

### Testing

Every unit test has its own flow and so does the whole suite. The flow steps are the same independently of the domain and/or app being tested and they can be encapsulated into the correspondent abstractions.  These abstractions as well as the most common implementations can be reused across various testing suites and greatly reduce testing framework development time.
