What is the difference between UI/GUI testing, functional testing and E2E testing?

UI testing: user interface testing. In other words, you have to make sure that all buttons, fields, labels and other elements on the screen work as assumed in a specification.

GUI testing: graphical user interface. You have to make sure that all elements on the screen work as mentioned in a specification and also color, font, element size and other similar stuff match design.

Functional testing: the process of quality assurance of a product that assumes the testing of the functions/functionalities of component or system in general, according to specification requirements.

E2E testing: it needs for identifying system dependencies and ensuring that the right information is passed through multiple components and systems.


Please make yourself familiar with Hermetic Testing.

hermetic-testing

You have two ways to access systems in your test:

  1. You have a local service. For example an in memory database instead of the real database
  2. You mock the system.

For me UI-tests work like in above picture: All tests use local resources. They are hermetic.

But End-to-end Tests involve other systems. Example: Your SUT (system under test) creates an email. You want to be sure that this email gets send to a server and later arrives in an Inbox. For me this contradicts with "separation of concerns". This mixes two distinct topics. First: Your application creates an email and sends it to an server. This could be handled with a mocked mail server. But end-to-end tests mix it with a second concern: You want the mail server to be alive and receive and forward mails correctly. This is not software testing, this is monitoring.

My advice: Do hermetic UI-Testing of code and do check/monitor your production system. But don't mix both concepts. I think for small environments end-to-end-tests are not needed.