- Static analysis
- type errors and typs
- Unit tests
- verifying that isolated parts of the system work as expected
- Integration tests
- verifying that several units work as intended when connected
- E2E (functional tests)
- army of robots that clicks around the app and verifies that the app works correctly as a whole system