Перейти к содержимому
шпаргалка.
Esc
навигацияоткрыть⌘Jпредпросмотр
На этой странице

Основы тестирования

Все темы Go Developer

Что такое unit тесты?

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

Основные характеристики:

  1. Мелкомасштабные:

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

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

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

Пример:

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

Что такое интеграционные тесты?

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

Основные характеристики:

  1. Масштабные:

    • Проверяют корректность работы системы или ее частей в совокупности.
  2. Интеграция компонентов:

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

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

Пример:

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:

  1. Создайте тестовый файл:

    • Тестовые файлы должны оканчиваться на _test.go.

    • Пример: main_test.go

  2. Импортируйте пакет testing:

    • Импортируйте testing в тестовом файле.
  3. Напишите тестовую функцию:

    • Имя функции должно начинаться с 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:

  1. 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")
      }
  2. 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)
      }
  3. 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)?

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

Основные характеристики:

  1. Имитируют поведение:

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

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

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

Пример использования с 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)
    }
}

Эта страница была полезной?