Функция testing.Coverage

Функция testing.Coverage возвращает процент покрытия кода тестами в текущем процессе в виде числа типа float64. Она позволяет программно получить информацию о том, какая часть кода была выполнена во время запуска тестов. Функция полезна для автоматического отслеживания качества тестирования и генерации отчетов.

Синтаксис

gotesting.Coverage()

Функция не принимает параметров и возвращает значение типа float64, представляющее процент покрытия. Значение возвращается в диапазоне от 0 до 1, где 1 означает 100% покрытие.

Пример

Давайте создадим простую функцию и напишем тест для нее, затем получим процент покрытия:

gopackage main

import (
  "fmt"
  "testing"
)

func Sum(a, b int) int {
  return a + b
}

func TestSum(t *testing.T) {
  res := Sum(2, 3)
  if res != 5 {
    t.Errorf("Sum(2, 3) = %d; want 5", res)
  }
}

func main() {
  coverage := testing.Coverage()
  fmt.Printf("%.2f", coverage)
}

Результат выполнения кода:

go"0.00"

Обратите внимание: при обычном запуске программы без флагов покрытия функция возвращает 0.

Пример

Давайте запустим тесты с флагом -cover для получения реального процента покрытия:

gopackage main

import (
  "fmt"
  "os"
  "testing"
)

func IsPositive(x int) bool {
  return x > 0
}

func TestIsPositive(t *testing.T) {
  tests := []struct {
    name string
    arg  int
    want bool
  }{
    {"positive", 5, true},
    {"zero", 0, false},
    {"negative", -3, false},
  }
  for _, tt := range tests {
    t.Run(tt.name, func(t *testing.T) {
      if res := IsPositive(tt.arg); res != tt.want {
        t.Errorf("IsPositive(%d) = %v; want %v", tt.arg, res, tt.want)
      }
    })
  }
}

func main() {
  if len(os.Args) > 1 && os.Args[1] == "-test.coverprofile" {
    coverage := testing.Coverage()
    fmt.Printf("%.2f", coverage)
  }
}

Пример

Давайте используем функцию для вывода покрытия в процессе выполнения тестового пакета:

gopackage main

import (
  "fmt"
  "testing"
)

func Divide(a, b float64) float64 {
  if b == 0 {
    return 0
  }
  return a / b
}

func TestDivide(t *testing.T) {
  if res := Divide(10, 2); res != 5 {
    t.Errorf("Divide(10, 2) = %v; want 5", res)
  }
  if res := Divide(10, 0); res != 0 {
    t.Errorf("Divide(10, 0) = %v; want 0", res)
  }
}

func TestCoverage(t *testing.T) {
  coverage := testing.Coverage()
  if coverage > 0 {
    fmt.Printf("Coverage: %.2f%%", coverage*100)
  }
}

Результат выполнения кода:

go"Coverage: 100.00%"

Смотрите также

  • функцию testing.CoverMode,
    которая возвращает режим покрытия кода
  • тип testing.B,
    который используется для бенчмарков
  • функцию testing.Short,
    которая проверяет запуск в сокращенном режиме
  • функцию testing.Verbose,
    которая проверяет подробный режим вывода