Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exactly what is integration testing - compared with unit

I am starting to use unit testing in my projects, and am writing tests that are testing at the method/function level.

I understand this and it makes sense.

But, what is integration testing? From what i read it moves the scope of testing up to test larger features of an application.

This implies that I write a new test suite to test larger things such as (on an e-commerce site) checkout functionality, user login functionality, basket functionality. So here i would have 3 integration tests written?

Is this correct - if not can someone explain what is meant.

Also, does integration test involve the ui (web application context here) and would employ the likes of selenium to automate. Or is integration testing still at the code level but tying together difference classes and areas of the code.

like image 563
Marty Wallace Avatar asked May 23 '13 18:05

Marty Wallace


People also ask

What is difference between unit and integration testing?

Unit Testing is a kind of white box testing, whereas Integration Testing is a kind of black-box testing. For Unit Testing, accessibility of code is required, as it tests the written code, while for Integration Testing, access to code is not required, since it tests the interactions and interfaces between modules.

Can we do integration testing without unit testing?

Integration tests can not be used with TDD approach. Integration tests are slow and can not be executed very often. In most cases integration tests do not indicate the source of the problem. it's more difficult to create test environment with integration tests.


2 Answers

Consider a method like this PerformPayment(double amount, PaymentService service);

An unit test would be a test where you create a mock for the service argument.

An integration test would be a test where you use an actual external service so that you test if that service responds correctly to your input data.

like image 145
Knaģis Avatar answered Sep 23 '22 10:09

Knaģis


Unit tests are tests that the tested code is inside of the actual class. Another dependencies of this class are mocked or ignored, because the focus is test the code inside the class.

Integration tests are tests that involves disk access, application service and/or frameworks from the target application. The integration tests run isolated from another external services.

I will give an example. You have a Spring application and you made a lot of unit tests to guarantee that the business logic is working properly. Perfect. But what kind of tests you have to guarantee:

  • Your application service can start
  • Your database entity is mapped correctly
  • You have all the necessary annotations working as expected
  • Your Filter is working properly
  • Your API is accepting some kind of data
  • Your main feature is really working in the basic scenario
  • Your database query is working as expected
  • Etc...

This can't be done with unit tests but you, as developer, need to guarantee that all things are working too. This is the objective of integration tests.

The ideal scenario is the integration tests running independent from another external systems that the application use in a production environment. You can accomplish that using Wiremock for Rest calls, a memory database like H2, mocking beans from some specific classes that call external systems, etc.

A little curiosity, Maven have a specific plugin for Integration Tests: the maven failsafe plugin, that execute test classes that the name ends with IT (by default). Example: UserIT.java.

The confusion about what Integration Test means

Some people understand the "integration test" as a test involving the "integration" to other external systems that the currently system use. This kind of tests can only be done in a environment where you have all the systems up and running to attend you. Nothing fake, nothing mocked.

This might be only a naming problem, but we have a lack of tests (what I understand as integration tests) that attends the necessity of the items described above. On contrary, we are jumping for a definition of unit tests (test class only) to a "integration" test (the whole real systems up). So what is in the middle of it if not the integration tests?

You can read more about this confusion on this article by Martin Fowler. He separates the "integration tests" term on two meanings: the "broad" and "narrow" integration tests:

narrow integration tests

  • exercise only that portion of the code in my service that talks to a separate service
  • uses test doubles of those services, either in process or remote
  • thus consist of many narrowly scoped tests, often no larger in scope than a unit test (and usually run with the same test framework that's used for unit tests)

broad integration tests

  • require live versions of all services, requiring substantial test environment and network access
  • exercise code paths through all services, not just code responsible for interactions

You can get even more details on this article.

like image 30
Dherik Avatar answered Sep 22 '22 10:09

Dherik