Как проводить тестирования в Go

Встроены мощные инструменты для написания и запуска тестов. Тестирование — важная часть разработки ПО, так как помогает убедиться, что код работает правильно и что изменения не приводят к регрессиям. 

Основные компоненты

1. Создание тестовых файлов:

  • Тестовые файлы в Go должны оканчиваться на `_test.go`. Это позволяет инструменту тестирования Go автоматически распознавать их как тесты.
  • Тестовые функции должны начинаться с `Test` и принимать один аргумент типа `*testing.T`.

2. Написание простого теста:

  • Рассмотрим простой пример, в котором тестируется функция, добавляющая два числа:
   ```go
   // main.go
   package main

   func Add(a, b int) int {
       return a + b
   }
   ```
   ```go
   // main_test.go
   package main

   import "testing"

   func TestAdd(t *testing.T) {
       result := Add(2, 3)
       expected := 5
       if result != expected {
           t.Errorf("Add(2, 3) = %d; want %d", result, expected)
       }
   }
   ```

3. Запуск тестов:

  • Чтобы запустить тесты, используйте команду `go test` в терминале. Она автоматически найдет и выполнит все тесты в текущем пакете.
   ```sh
   $ go test
   ```

4. Тестирование с таблицей (table-driven tests):

  • Table-driven tests — это подход, при котором вы пишете тесты в виде таблицы входных и ожидаемых значений. Это позволяет легко добавлять новые тестовые случаи и улучшает читаемость.
   ```go
   // main_test.go
   package main

   import "testing"

   func TestAdd(t *testing.T) {
       tests := []struct {
           a, b, expected int
       }{
           {1, 2, 3},
           {0, 0, 0},
           {-1, -1, -2},
           {2, 2, 4},
       }

       for _, tt := range tests {
           result := Add(tt.a, tt.b)
           if result != tt.expected {
               t.Errorf("Add(%d, %d) = %d; want %d", tt.a, tt.b, result, tt.expected)
           }
       }
   }
   ```

Другие виды

1. Тестирование с использованием `testing` и `testing/quick`:

  • Go предоставляет возможность писать тесты на основе свойств с использованием пакета `testing/quick`.
   ```go
   package main

   import (
       "testing"
       "testing/quick"
   )

   func TestAddProperties(t *testing.T) {
       f := func(a, b int) bool {
           return Add(a, b) == a + b
       }
       if err := quick.Check(f, nil); err != nil {
           t.Error(err)
       }
   }
   ```

2. Бенчмаркинг:

  • Для измерения производительности кода используйте функции, начинающиеся с `Benchmark` и принимающие `*testing.B`.
   ```go
   package main

   import "testing"

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

3. Примерные тесты (Example Tests):

  • Показывают, как использовать функцию, и результаты их выполнения включаются в документацию.
   ```go
   package main

   import "fmt"

   func ExampleAdd() {
       fmt.Println(Add(2, 3))
       // Output: 5
   }
   ```

Запуск с дополнительными параметрами

1. Запуск всех тестов с подробным выводом:

   ```sh
   $ go test -v
   ```

2. Запуск бенчмарков:

   ```sh
   $ go test -bench=.
   ```

3. Покрытие кода:

  • Чтобы увидеть покрытие тестами, используйте флаг `-cover`.
   ```sh
   $ go test -cover
   ```

Тестирование включает написание тестов в файлах с суффиксом `_test.go`, использование функции `go test` для запуска тестов и написание различных типов тестов, включая простые, табличные и бенчмарк-тесты. Это помогает убедиться, что ваш код работает правильно и эффективно.

June 2, 2024, easyoffer