Как проводить тестирования в 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