Testes em Java: visão geral de frameworks e ferramentas
Testes de qualidade são uma parte essencial do desenvolvimento profissional em Java. Sem testes automatizados, é difícil manter grandes projetos, implementar novas funcionalidades e evitar erros de regressão. Neste artigo, abordaremos as principais ferramentas e frameworks para testar aplicações Java: desde testes unitários até verificações de integração e automação de UI.
Por que é importante testar código Java?
Os testes permitem:
- Detectar erros nas fases iniciais do desenvolvimento.
- Simplificar a refatoração — você vê imediatamente o que quebrou.
- Documentar o comportamento do código.
- Automatizar a verificação de regressões a cada commit.
JUnit 5 — a base dos testes unitários
JUnit 5 é o padrão de facto para testes unitários em Java. Ele consiste em três módulos: JUnit Platform, JUnit Jupiter e JUnit Vintage. O Jupiter fornece um novo modelo de programação com anotações e extensões.
Exemplo básico de teste com JUnit 5:
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;
class CalculatorTest { @Test void testAddition() { Calculator calc = new Calculator(); assertEquals(5, calc.add(2, 3), "2 + 3 deve ser 5"); }}Mockito — criação de stubs e mocks
Ao testar, muitas vezes é necessário isolar uma classe de suas dependências (banco de dados, APIs externas). O Mockito permite criar objetos mock e definir seu comportamento.
Exemplo de uso do Mockito com JUnit 5:
import org.junit.jupiter.api.Test;import org.junit.jupiter.api.extension.ExtendWith;import org.mockito.InjectMocks;import org.mockito.Mock;import org.mockito.junit.jupiter.MockitoExtension;import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)class UserServiceTest { @Mock private UserRepository repository;
@InjectMocks private UserService service;
@Test void testFindUser() { when(repository.findById(1L)).thenReturn(new User("Alice")); User result = service.findUser(1L); assertEquals("Alice", result.getName()); verify(repository).findById(1L); }}TestNG — alternativa ao JUnit com recursos avançados
TestNG (Test Next Generation) é um framework inspirado no JUnit, mas que adiciona suporte a grupos de testes, parametrização, dependências e execução paralela. Ele é especialmente popular em grandes projetos e em testes de integração.
Exemplo de teste parametrizado no TestNG:
import org.testng.annotations.DataProvider;import org.testng.annotations.Test;import static org.testng.Assert.assertEquals;
public class ParamTest { @DataProvider(name = "numbers") public Object[][] data() { return new Object[][] { {1, 2, 3}, {0, 0, 0}, {-1, 1, 0} }; }
@Test(dataProvider = "numbers") public void testAdd(int a, int b, int expected) { assertEquals(a + b, expected); }}Selenium — automação de interfaces web
Para testar aplicações web Java (por exemplo, em Spring Boot), frequentemente se utiliza o Selenium WebDriver. Ele permite emular ações do usuário no navegador: cliques, inserção de texto, verificação de elementos.
Exemplo mínimo de teste com Selenium:
import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import org.junit.jupiter.api.Test;
public class LoginTest { @Test public void testLoginPage() { WebDriver driver = new ChromeDriver(); driver.get("https://example.com/login"); driver.findElement(By.id("username")).sendKeys("admin"); driver.findElement(By.id("password")).sendKeys("pa