Разбор 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.


🌐 in English
Всего лайков:0

Оставить комментарий

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

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

Разбираем: Rate‑limiter, non‑blocking operations, scheduler  Go vs Java | Concurrency часть 4
Эта статья посвящена пониманию принципов работы с конкурентностью и синхронизацией в Go и Java. Мы рассмотрим ключевые подходы, такие как rate‑limiter, неблокирующие операции и планирование задач, сра...
Как удержать легаси-проект от смерти и подарить ему ещё 10 лет
Признаки легаси-проекта: как распознать старый корабль Легаси — это не просто старый код. Это живой организм, который пережил десятки изменений, смену команд, устаревшие технологии и множество временн...
Compiler, Build и Tooling в Go и Java: как устроены сборка, инициализация, анализ и диагностика в двух экосистемах
Эта статья посвящена общему обзору того, как в Go устроены compiler, build и tooling-практики, и как их удобнее понимать через сравнение с Java. Мы не будем уходить в узкоспециализированные детали каж...

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

Конкурентность — это не про «запустить много потоков». Это про договорённости между ними. Представь кухню ресторана: — повара (потоки / горутины) — заказы (задачи) — и главный вопрос: как они коорди...
История начинается не с академической теории, а с типичной production-проблемы. Представьте сервис: 48 CPU 300+ потоков нагрузка 200k операций в секунду много shared state Команда использует обы...
Когда HashMap начинает убивать продакшн: инженерная история ConcurrentHashMap
Представьте обычный продакшн-сервис. 32 CPU сотни потоков кэш конфигурации / сессий / rate limits десятки тысяч операций в секунду И где-то внутри — обычный Map. Сначала всё выглядит безобидно. Map&...
Fullscreen image