← Назад к вопросам

Какие знаешь инструменты для написания тестов?

2.0 Middle🔥 241 комментариев
#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Инструменты для написания тестов в Java

Тестирование — критическая часть разработки. В Java экосистеме есть множество мощных инструментов и фреймворков для разных видов тестирования: unit тесты, интеграционные тесты, E2E тесты и тесты производительности.

Unit-тестирование

1. JUnit — стандарт unit-тестирования

Это самый популярный фреймворк для unit-тестирования в Java. JUnit 5 — текущая версия с поддержкой параметризованных тестов, динамических тестов и расширений.

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

public class CalculatorTest {
    private Calculator calculator = new Calculator();
    
    @Test
    public void testAddition() {
        int result = calculator.add(2, 3);
        assertEquals(5, result, "2 + 3 should equal 5");
    }
    
    @Test
    public void testDivisionByZero() {
        assertThrows(ArithmeticException.class, () -> {
            calculator.divide(5, 0);
        });
    }
}

2. TestNG — альтернатива JUnit

Оффер более мощные возможности для группировки тестов, параллельного выполнения и data-driven тестирования.

import org.testng.annotations.Test;
import org.testng.annotations.DataProvider;
import static org.testng.Assert.*;

public class CalculatorTestNG {
    @DataProvider
    public Object[][] additionData() {
        return new Object[][] {
            {2, 3, 5},
            {0, 0, 0},
            {-1, 1, 0}
        };
    }
    
    @Test(dataProvider = "additionData")
    public void testAddition(int a, int b, int expected) {
        Calculator calc = new Calculator();
        assertEquals(calc.add(a, b), expected);
    }
}

Mocking и Stubbing

1. Mockito — самая популярная библиотека для создания мок-объектов

Используется для изоляции компонентов и тестирования в отсутствии зависимостей.

import org.mockito.Mock;
import org.mockito.InjectMocks;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

public class OrderServiceTest {
    @Mock
    private PaymentService paymentService;
    
    @InjectMocks
    private OrderService orderService;
    
    @Test
    public void testOrderProcessing() {
        when(paymentService.charge(100)).thenReturn(true);
        
        boolean result = orderService.processOrder(100);
        
        assertTrue(result);
        verify(paymentService).charge(100);
    }
}

2. PowerMock — расширение Mockito для мокирования статических методов

import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;

@PrepareForTest(LocalDateTime.class)
public class TimeBasedServiceTest {
    @Test
    public void testWithMockedTime() {
        LocalDateTime mockTime = LocalDateTime.of(2024, 1, 1, 12, 0);
        PowerMockito.mockStatic(LocalDateTime.class);
        when(LocalDateTime.now()).thenReturn(mockTime);
        
        // Тест с мокированным временем
    }
}

Assertions и проверки

1. AssertJ — более удобный синтаксис проверок

import static org.assertj.core.api.Assertions.*;

public class AssertJTest {
    @Test
    public void testFluentAssertions() {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        
        assertThat(names)
            .hasSize(3)
            .contains("Alice", "Bob")
            .doesNotContain("David");
        
        assertThat(names)
            .filteredOn(n -> n.startsWith("A"))
            .containsOnly("Alice");
    }
}

2. Hamcrest — синтаксис для более выразительных проверок

import static org.hamcrest.Matchers.*;
import static org.hamcrest.MatcherAssert.assertThat;

public class HamcrestTest {
    @Test
    public void testHamcrest() {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        
        assertThat(numbers, hasItems(1, 2, 3));
        assertThat(numbers, everyItem(greaterThan(0)));
        assertThat("Test", containsString("es"));
    }
}

Интеграционное тестирование

1. Spring Boot Test — тестирование Spring приложений

import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;

@WebMvcTest(UserController.class)
public class UserControllerTest {
    @Autowired
    private MockMvc mockMvc;
    
    @Test
    public void testGetUser() throws Exception {
        mockMvc.perform(get("/users/1"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.name").value("John"));
    }
}

2. Testcontainers — запуск контейнеров Docker в тестах

import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.postgresql.PostgreSQLContainer;

@Testcontainers
public class DatabaseTest {
    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:13")
        .withDatabaseName("testdb")
        .withUsername("test")
        .withPassword("test");
    
    @Test
    public void testWithDatabase() {
        // Используем реальную БД в контейнере
        String jdbcUrl = postgres.getJdbcUrl();
        // Тест с использованием БД
    }
}

E2E и UI тестирование

1. Selenium — браузерная автоматизация

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

public class LoginTest {
    private WebDriver driver;
    
    @Before
    public void setUp() {
        driver = new ChromeDriver();
    }
    
    @Test
    public void testLogin() {
        driver.get("https://example.com/login");
        driver.findElement(By.id("email")).sendKeys("user@example.com");
        driver.findElement(By.id("password")).sendKeys("password");
        driver.findElement(By.id("login-btn")).click();
        
        assertTrue(driver.getCurrentUrl().contains("dashboard"));
    }
    
    @After
    public void tearDown() {
        driver.quit();
    }
}

2. Playwright — современная альтернатива Selenium

import com.microsoft.playwright.*;

public class PlaywrightTest {
    @Test
    public void testLogin() {
        try (Playwright playwright = Playwright.create()) {
            Browser browser = playwright.chromium().launch();
            Page page = browser.newPage();
            
            page.navigate("https://example.com/login");
            page.fill("#email", "user@example.com");
            page.fill("#password", "password");
            page.click("#login-btn");
            
            assertTrue(page.url().contains("dashboard"));
            browser.close();
        }
    }
}

Тестирование производительности

1. JMH (Java Microbenchmark Harness) — микробенчмарки

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class StringConcatenationBenchmark {
    @Benchmark
    public String testStringConcat() {
        String result = "";
        for (int i = 0; i < 10; i++) {
            result += "str";
        }
        return result;
    }
    
    @Benchmark
    public String testStringBuilder() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10; i++) {
            sb.append("str");
        }
        return sb.toString();
    }
}

Coverage и отчёты

1. JaCoCo — измерение покрытия кода

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.8</version>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Рекомендуемый stack для современного проекта

<!-- Unit тестирование -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.9.2</version>
    <scope>test</scope>
</dependency>

<!-- Mocking -->
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>5.2.1</version>
    <scope>test</scope>
</dependency>

<!-- Assertions -->
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.24.1</version>
    <scope>test</scope>
</dependency>

<!-- Spring тестирование -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>3.0.5</version>
    <scope>test</scope>
</dependency>

Выбор инструментов зависит от типа проекта, но JUnit + Mockito + AssertJ — это золотой стандарт для большинства Java приложений.