Основы тестирования
Что такое unit тесты?
Unit тесты — это тесты, которые проверяют
отдельные единицы кода (функции, методы) на корректность работы.
Основные характеристики:
-
Мелкомасштабные:
- Проверяют маленькие, изолированные части кода.
-
Автоматизированные:
- Выполняются автоматически для проверки правильности кода.
-
Быстрые:
- Быстро выполняются, что позволяет часто их запускать.
Пример:
package main
import "testing"
func Add(a, b int) int {
return a + b
}
func TestAdd(t *testing.T) {
result := Add(2, 3)
if result != 5 {
t.Errorf("expected 5, got %d", result)
}
}
Что такое интеграционные тесты?
Интеграционные тесты — это тесты, которые проверяют взаимодействие между различными компонентами системы.
Основные характеристики:
-
Масштабные:
- Проверяют корректность работы системы или ее частей в совокупности.
-
Интеграция компонентов:
- Тестируют взаимодействие между модулями, базами данных, внешними сервисами и другими зависимостями.
-
Обнаружение ошибок:
- Помогают выявить проблемы, которые возникают при интеграции различных компонентов.
Пример:
package main
import (
"testing"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
func TestDatabaseIntegration(t *testing.T) {
db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
t.Fatal(err)
}
defer db.Close()
result, err := db.Query("SELECT * FROM users")
if err != nil {
t.Fatal(err)
}
defer result.Close()
if !result.Next() {
t.Fatal("expected at least one row")
}
}
Интеграционные тесты проверяют взаимодействие между различными частями системы, обеспечивая их корректную работу в совокупности и выявляя проблемы интеграции.
Как в Go пишут unit тесты со стандартным пакетом testing?
Писать unit тесты в Go с пакетом testing:
-
Создайте тестовый файл:
-
Тестовые файлы должны оканчиваться на
_test.go. -
Пример:
main_test.go
-
-
Импортируйте пакет
testing:- Импортируйте
testingв тестовом файле.
- Импортируйте
-
Напишите тестовую функцию:
-
Имя функции должно начинаться с
Test. -
Функция принимает t *testing.T: func TestName(t *testing.T). Файл должен оканчиваться на _test.go, а суффикс имени после Test не должен начинаться со строчной буквы.
-
Пример:
package main
import "testing"
// Функция, которую тестируем
func Add(a, b int) int {
return a + b
}
// Unit тест
func TestAdd(t *testing.T) {
result := Add(2, 3)
expected := 5
if result != expected {
t.Errorf("expected %d, got %d", expected, result)
}
}
Запуск тестов:
Используйте команду go test в директории с тестовыми файлами.
go test
Какие есть библиотеки, например, testify?
Библиотеки для тестирования в Go:
-
Testify:-
Предоставляет утверждения (assertions) и мок-объекты (mocking).
-
Упрощает написание тестов и делает их более читаемыми.
-
Пример использования:
import ( "testing" "github.com/stretchr/testify/assert" ) func TestAdd(t *testing.T) { assert.Equal(t, 5, Add(2, 3), "they should be equal") }
-
-
GoMock:-
Фреймворк для создания мок-объектов.
-
Генерирует мок-объекты на основе интерфейсов.
-
Пример использования:
import ( "testing" "github.com/golang/mock/gomock" ) func TestSomething(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() mockObj := NewMockMyInterface(ctrl) mockObj.EXPECT().MyMethod().Return(nil) }
-
-
GinkgoиGomega:-
Ginkgo: BDD-фреймворк для написания выразительных тестов.
-
Gomega: Библиотека утверждений, используемая с Ginkgo.
-
Пример использования:
import ( "testing" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) func TestSuite(t *testing.T) { RegisterFailHandler(Fail) RunSpecs(t, "My Test Suite") } var _ = Describe("Add", func() { It("should add two numbers", func() { Expect(Add(2, 3)).To(Equal(5)) }) })
-
Библиотеки Testify, GoMock, Ginkgo и Gomega предоставляют расширенные возможности для написания тестов в Go, улучшая читаемость, создание утверждений и работу с мок-объектами.
Что такое моки (mocks)?
Моки — это объекты, используемые в тестировании, которые имитируют поведение реальных объектов или компонентов.
Основные характеристики:
-
Имитируют поведение:
- Моки позволяют имитировать поведение зависимостей в тестах, возвращая заранее определенные ответы.
-
Изолированное тестирование:
- Используются для тестирования кода в изоляции от внешних зависимостей (например, баз данных, сетевых сервисов).
-
Контроль взаимодействий:
- Моки могут проверять, какие методы были вызваны и с какими аргументами, обеспечивая контроль над взаимодействиями.
Пример использования с GoMock:
import (
"testing"
"github.com/golang/mock/gomock"
)
// Интерфейс для мокирования
type MyInterface interface {
MyMethod() string
}
// Тестовая функция с использованием моков
func TestSomething(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockObj := NewMockMyInterface(ctrl)
mockObj.EXPECT().MyMethod().Return("mocked response")
result := mockObj.MyMethod()
if result != "mocked response" {
t.Errorf("expected mocked response, got %s", result)
}
}