Labs SD > Erros e Testes

Testes de integração com JUnit

Os testes de integração (integration tests) verificam o comportamento de vários componentes do sistema. Por outras palavras, verificam se componentes autónomos, como um servidor e um cliente, se estão a integrar bem um com o outro.

O JUnit é uma biblioteca Java para escrever testes ao código. A sua utilização mais comum é para testes unitários, mas também pode ser usada para fazer testes de integração.

Um conjunto (suite) de testes JUnit correspondem a uma classe Java.
A classe seguinte contém dois testes:

package example.it;

import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;

/** Integration test suite */
public class ExampleIT {

    @Test
    public void testSomething() {
        // do something ...
        Example example = new Example();
        String result = example.doSomething();

        // assertEquals(expected, actual);
        assertEquals("Hello", result);
        // if the assert fails, the test fails
    }

    @Test
    public void testSum() {
        Calculator calc = new Calculator();
        int result = calc.sum(22, 7);
        assertEquals(29, result);
    }

}

Os testes utilizam funções de assert para verificar o resultado esperado de cada teste.
A forma normal é assertEquals(expected, actual),em que expected é o valor esperado e actual é o valor que resultou da execução. No entanto, muitos outros existem, com nome que sugere qual a funcionalidade respetiva:


Anotações no código

Como muitas vezes os testes têm partes repetitivas de código, é possível ter métodos anotados que são executados antes/depois de todos os testes da suite ou antes/depois de cada teste.
Os testes de integração com JUnit 5 usam as seguintes anotações para o papel dos métodos durante a execução de testes:

A classe seguinte mostra todas as anotações referidas:

package example.it;

import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;

/** Integration test suite */
public class ExampleIT {

    // static members - shared
    // ...

    // one-time initialization and clean-up
    @BeforeAll
    public static void oneTimeSetUp() {
        // runs once before all tests in the suite
    }

    @AfterAll
    public static void oneTimeTearDown() {
        // runs once after all tests in the suite
    }

    // members
    // ...

    // initialization and clean-up for each test
    @BeforeEach
    public void setUp() {
        // runs before each test
    }

    @AfterEach
    public void tearDown() {
        // runs after each test
    }

    // tests
    @Test
    public void testSomething() {
        // do something ...

        // assertEquals(expected, actual);
        // if the assert fails, the test fails
    }
}

Configuração do Maven

Por convenção, as classes de testes de integração terminam com IT e devem ser arrumadas na pasta src/test/java do projeto.

Para executar testes de integração no Maven, é necessário configurar o plug-in failsafe no pom.xml:

<plugin>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>3.0.0-M4</version>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

O Maven executa os testes de integração na fase verify do ciclo de vida.

Os exemplos seguintes mostram como correr os testes de integração e como controlar quais os testes a executar.

// to compile and execute all integration tests
$ mvn verify

// to execute only a specific test class
$ mvn verify -Dit.test=PingIT

// to execute only a specific test
$ mvn verify -Dit.test=PingIT#testPing

// you can also use wildcards (the example below will match classes starting with P)
$ mvn verify -Dit.test=P*

// to skip integration tests
$ mvn install -Dit.test.skip=true

 


© Docentes de Sistemas Distribuídos, Dep. Eng. Informática, Técnico Lisboa