Разбор Unit testing, Race detector, Benchmarking, Profiling (pprof) Go vs Java | Testing, Debugging и Profiling

1. Unit testing

В Go встроенный пакет testing позволяет писать unit-тесты. Для Java-разработчиков это аналог JUnit/TestNG.


// Go: простой unit test
func Add(a, b int) int {
    return a + b
}

func TestAdd(t *testing.T) {
    got := Add(2, 3)
    if got != 5 {
        t.Errorf("Expected 5, got %d", got)
    }
}

// Java: JUnit 5
public class MathTest {
    @Test
    void testAdd() {
        int result = Math.addExact(2, 3);
        Assertions.assertEquals(5, result);
    }
}
Unit-тесты в Go просты и встроены в стандартную библиотеку. Для Java привычнее использовать JUnit или TestNG.

2. Race detector

Go имеет встроенный -race флаг для выявления гонок данных. Java разработчикам придётся использовать статический анализ или Thread-safe конструкции.


// Запуск теста с обнаружением гонок
go test -race ./...

// Java: Thread-safety вручную
List<Integer> list = Collections.synchronizedList(new ArrayList<>());
// или использовать ConcurrentHashMap / AtomicInteger
Race detector в Go позволяет быстро выявлять гонки данных во всех goroutine во время тестирования.

3. Benchmarking

Go поддерживает встроенные бенчмарки через testing.B. В Java используют JMH или System.nanoTime().


// Go benchmark
func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        _ = Add(2, 3)
    }
}

// Java benchmark (JMH)
@Benchmark
public void benchmarkAdd(Blackhole bh) {
    bh.consume(Math.addExact(2, 3));
}
Бенчмарки помогают измерять производительность функций. Go встроил это в testing package, Java использует JMH для точных измерений.

4. Profiling (pprof)

Go предоставляет pprof для анализа CPU, heap, блокировок и трассировки. В Java используют профилировщики (VisualVM, YourKit, JFR).


// Go: CPU profiling
f, _ := os.Create("cpu.prof")
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()

// Код для профилирования
for i := 0; i < 1000000; i++ {
    _ = i * i
}

// Java: JFR / VisualVM
// Профилирование CPU через JFR или профайлер в IDE
pprof позволяет получить полные профили CPU и памяти, а также анализировать блокировки и конкуренцию между goroutine.

5. Сводная таблица Go vs Java

Концепт Go Java Комментарий
Unit testing testing package, t.Errorf, go test JUnit/TestNG, Assertions Go имеет встроенные тесты, Java требует внешние библиотеки
Race detector -race флаг при тестировании Thread-safety, статический анализ Go позволяет автоматически выявлять гонки данных
Benchmarking testing.B JMH или System.nanoTime() Go встроено, в Java требуется JMH для точных измерений
Profiling pprof (CPU, heap, блокировки) JFR, VisualVM, YourKit Go имеет встроенный инструмент, Java использует внешние профайлеры

Итог

Go предоставляет **встроенные инструменты** для тестирования, выявления гонок, бенчмаркинга и профилирования, что позволяет быстрее и безопаснее писать конкурентный код. Для Java-разработчиков аналоги существуют, но часто требуют внешних библиотек и дополнительных настроек. Практическая рекомендация: использовать unit-тесты с race detector для выявления ошибок параллельности, бенчмарки для оценки производительности и pprof для анализа узких мест в Go.


Всего лайков:0
Мой канал в социальных сетях
Отправляя email, вы принимаете условия политики конфиденциальности

Полезные статьи:

Generics, Reflection и каналы - Go vs Java | Types - Language
В этой статье мы разберем продвинутые возможности системы типов в Go: generics (параметры типов), reflection (рефлексию) и типы каналов для работы с конкурентностью. Мы сравним подходы Go и Java, чтоб...
Как удержать легаси-проект от смерти и подарить ему ещё 10 лет
Признаки легаси-проекта: как распознать старый корабль Легаси — это не просто старый код. Это живой организм, который пережил десятки изменений, смену команд, устаревшие технологии и множество временн...
Рассуждение о том, почему полнота знаний недостижима и как выстроить личную архитектуру профессионального роста. Каждый разработчик хотя бы раз думал: «Как всё успеть?» Технологии растут быстрее,...

Новые статьи:

Resource cleanup, rate‑limiting strategies, bounded vs unbounded channels - в Go vs Java | Паттерны, идиомы и лучшие практики Go
Продолжаем серию статей для разработчиков, которые хотят изучить Go на основе знаний Java, и наоборот. В этой статье мы обсудим три ключевые темы: Resource Cleanup (освобождение ресурсов), Rate-Limiti...
Разбираем: Rate‑limiter, non‑blocking operations, scheduler  Go vs Java | Concurrency часть 4
Эта статья посвящена пониманию принципов работы с конкурентностью и синхронизацией в Go и Java. Мы рассмотрим ключевые подходы, такие как rate‑limiter, неблокирующие операции и планирование задач, сра...
Разбираем: Trace, Profiling, Integration Testing, Code Coverage, Mocking, Deadlock Detection в Go vs Java | Testing, Debugging и Profiling
Серия: Go для Java-разработчиков — разбор trace, профилирования и тестирования В этой статье мы разберем инструменты и практики для тестирования, отладки и профилирования в Go. Для Java-разработчика ...
Fullscreen image