Software will always do what 'it was designed to do'
But we need to validate that software will always do what 'we expect it to do'
This is where testing fits in.
Testing each component for accuracy of function
Test the new changes connect and interact with the dependencies
Criteria by which the end user validates the system or solution as fit for purpose
Does the solution meet specification of metrics
By pushing the system with throughput we can learn the limitations and behaviour of the system as it fails
Testing the performance of a solution running an expected workload over an extended period of time to uncover failures. e.g. memory leaks, disk fills etc.
Quick and basic tests to provide assurance that all major functions of the solution are functioning as expected. We can consider this a high level health check of operation
End to end
These are behavioural tests that focus on scenarios rather than tests. It does this by replicating user behaviour and verifying user workflows. They can be expensive to maintain and extend which is why it is normal to have fewer but broader end to end tests and more lower level tests