---
title: Основы тестирования
seo:
  title: Основы тестирования — Go Developer
  description: Тема «Основы тестирования» для собеседования Go Developer. Что такое unit тесты? Что такое интеграционные тесты?
---

[Все темы Go Developer](/go-developer)

## <strong>Что такое</strong> <code>unit</code> <strong>тесты?</strong> [#q-14bee738d69b813ab138d086384f7f75]

<code>Unit</code> <strong>тесты</strong> — это тесты, которые проверяют
отдельные единицы кода (функции, методы) на корректность работы.

#### Основные характеристики&#58;

{/* prettier-ignore */}
1. <strong>Мелкомасштабные</strong>&#58;

    - Проверяют маленькие, изолированные части кода.

1. <strong>Автоматизированные</strong>&#58;

    - Выполняются автоматически для проверки правильности кода.

1. <strong>Быстрые</strong>&#58;

    - Быстро выполняются, что позволяет часто их запускать.

#### Пример&#58;

```go
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)
    }
}
```

:::note[Ссылки для изучения]

1. [Основы тестирования в Go](https://habr.com/ru/companies/otus/articles/739468/)
   :::

---

## <strong>Что такое интеграционные тесты?</strong> [#q-14bee738d69b811b9cb9e2e9622756b7]

<strong>Интеграционные тесты</strong> — это тесты, которые проверяют
взаимодействие между различными компонентами системы.

#### Основные характеристики&#58;

{/* prettier-ignore */}
1. <strong>Масштабные</strong>&#58;

    - Проверяют корректность работы системы или ее частей в совокупности.

1. <strong>Интеграция компонентов</strong>&#58;

    - Тестируют взаимодействие между модулями, базами данных, внешними сервисами и другими зависимостями.

1. <strong>Обнаружение ошибок</strong>&#58;

    - Помогают выявить проблемы, которые возникают при интеграции различных компонентов.

#### Пример&#58;

```go
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")
    }
}
```

Интеграционные тесты проверяют взаимодействие между различными частями системы, обеспечивая их корректную работу в совокупности и выявляя проблемы интеграции.

:::note[Ссылки для изучения]

1. [Основы тестирования в Go](https://habr.com/ru/companies/otus/articles/739468/)
   :::

---

## <strong>Как в Go пишут</strong> <code>unit</code> <strong>тесты со стандартным пакетом</strong> <code>testing</code><strong>?</strong> [#q-14bee738d69b81f085cde0f8a861b2d5]

Писать unit тесты в Go с пакетом <code>testing</code>&#58;

{/* prettier-ignore */}
1. <strong>Создайте тестовый файл</strong>&#58;

    - Тестовые файлы должны оканчиваться на <code>&#95;test&#46;go</code>.

    - Пример&#58; <code>main&#95;test&#46;go</code>

1. <strong>Импортируйте пакет</strong> <code>testing</code>&#58;

    - Импортируйте <code>testing</code> в тестовом файле.

1. <strong>Напишите тестовую функцию</strong>&#58;

    - Имя функции должно начинаться с <code>Test</code>.

    - Функция принимает t \*testing.T&#58; func TestName(t \*testing.T). Файл должен оканчиваться на \_test.go, а суффикс имени после Test не должен начинаться со строчной буквы.

#### Пример&#58;

```go
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)
    }
}
```

#### Запуск тестов&#58;

Используйте команду <code>go test</code> в директории с тестовыми файлами.

```bash
go test
```

:::note[Ссылки для изучения]

1. [Основы тестирования в Go](https://habr.com/ru/companies/otus/articles/739468/)
   :::

---

## <strong>Какие есть библиотеки, например,</strong> <code>testify</code><strong>?</strong> [#q-14bee738d69b81e29c0cc78d1ee45dc2]

Библиотеки для тестирования в Go&#58;

{/* prettier-ignore */}
1. <code>Testify</code>&#58;

    - Предоставляет утверждения (assertions) и мок-объекты (mocking).

    - Упрощает написание тестов и делает их более читаемыми.

    - Пример использования&#58;

        ```go
        import (
            "testing"
            "github.com/stretchr/testify/assert"
        )

        func TestAdd(t *testing.T) {
            assert.Equal(t, 5, Add(2, 3), "they should be equal")
        }
        ```

1. <code>GoMock</code>&#58;

    - Фреймворк для создания мок-объектов.

    - Генерирует мок-объекты на основе интерфейсов.

    - Пример использования&#58;

        ```go
        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)
        }
        ```

1. <code>Ginkgo</code> <strong>и</strong> <code>Gomega</code>&#58;

    - Ginkgo&#58; BDD-фреймворк для написания выразительных тестов.

    - Gomega&#58; Библиотека утверждений, используемая с Ginkgo.

    - Пример использования&#58;

        ```go
        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))
            })
        })
        ```

Библиотеки <code>Testify</code>, <code>GoMock</code>, <code>Ginkgo</code> и <code>Gomega</code> предоставляют расширенные возможности для написания тестов в Go, улучшая читаемость, создание утверждений и работу с мок-объектами.

:::note[Ссылки для изучения]

1. [Основы тестирования в Go](https://habr.com/ru/companies/otus/articles/739468/)
   :::

---

## <strong>Что такое моки (</strong><code>mocks</code><strong>)?</strong> [#q-14bee738d69b81eab1a2d9b743a5fff7]

<strong>Моки</strong> — это объекты, используемые в тестировании, которые
имитируют поведение реальных объектов или компонентов.

#### Основные характеристики&#58;

{/* prettier-ignore */}
1. <strong>Имитируют поведение</strong>&#58;

    - Моки позволяют имитировать поведение зависимостей в тестах, возвращая заранее определенные ответы.

1. <strong>Изолированное тестирование</strong>&#58;

    - Используются для тестирования кода в изоляции от внешних зависимостей (например, баз данных, сетевых сервисов).

1. <strong>Контроль взаимодействий</strong>&#58;

    - Моки могут проверять, какие методы были вызваны и с какими аргументами, обеспечивая контроль над взаимодействиями.

#### Пример использования с GoMock&#58;

```go
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)
    }
}
```

:::note[Ссылки для изучения]

1. [Основы тестирования в Go](https://habr.com/ru/companies/otus/articles/739468/)
   :::
