Unit testing is where individual units/ components of a software are tested. A unit is the smallest testable part of software. It usually has one or a few inputs and usually a single output. In procedural programming a unit may be an individual program, function, procedure, etc. In object-oriented programming, the smallest unit is a method. The purpose is to validate that each unit of the software performs as designed.
Integration tests verify that different parts of an application work correctly together. Unlike unit testing, integration tests frequently involve application infrastructure concerns, such as a database, file system, network resources, or web requests and responses. Unit tests use fakes or mock objects in place of these concerns, but the purpose of integration tests is to confirm that the system works as expected with these systems.
End to end testing is performed by the testing team and the focus is to test end to end flows e.g. right from order creation till reporting or order creation till item return etc and checking. End to end testing is usually focused on mimicking real life scenarios and usage. End to end testing involves testing information flow across applications.
Acceptance testing is a testing technique performed to determine whether or not the software system has met the requirement specifications. The main purpose of this test is to evaluate the system’s compliance with the business requirements and verify if it is has met the required criteria for delivery to end users.
Functional tests check a particular feature for correctness by comparing the results for a given input against the specification. Functional tests don’t concern themselves with intermediate results or side-effects, just the result (they don’t care that after doing x, object y has state z). They are written to test part of the specification such as, “calling function Square(x) with the argument of 2 returns 4”.