Функция testing.Coverage
Функция testing.Coverage возвращает процент покрытия кода тестами
в текущем процессе в виде числа типа float64. Она позволяет
программно получить информацию о том, какая часть кода была выполнена
во время запуска тестов. Функция полезна для автоматического
отслеживания качества тестирования и генерации отчетов.
Синтаксис
testing.Coverage()
Функция не принимает параметров и возвращает значение типа
float64, представляющее процент покрытия. Значение возвращается
в диапазоне от 0 до 1, где 1 означает 100% покрытие.
Пример
Давайте создадим простую функцию и напишем тест для нее, затем получим процент покрытия:
package 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)
}
Результат выполнения кода:
"0.00"
Обратите внимание: при обычном запуске программы без флагов покрытия функция возвращает 0.
Пример
Давайте запустим тесты с флагом -cover для получения
реального процента покрытия:
package 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)
}
}
Пример
Давайте используем функцию для вывода покрытия в процессе выполнения тестового пакета:
package 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)
}
}
Результат выполнения кода:
"Coverage: 100.00%"
Смотрите также
-
функцию
testing.CoverMode,
которая возвращает режим покрытия кода -
тип
testing.B,
который используется для бенчмарков -
функцию
testing.Short,
которая проверяет запуск в сокращенном режиме -
функцию
testing.Verbose,
которая проверяет подробный режим вывода