РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
988 of 1593 menu

Тип testing.M

Тип testing.M представляет собой структуру, которая используется в функции TestMain для управления процессом выполнения тестов. С помощью testing.M можно выполнить настройку глобального состояния перед запуском тестов, запустить сами тесты, а затем выполнить очистку после их завершения. Основной метод типа - Run, который запускает все тесты в пакете и возвращает код завершения.

Синтаксис

type M struct { // содержит скрытые поля } func (m *M) Run() int

Чтобы использовать testing.M, необходимо определить функцию TestMain в пакете с тестами. В этой функции создается экземпляр testing.M через вызов testing.Main или он передается автоматически при запуске тестов. Метод Run запускает все тесты и возвращает код завершения, который затем передается в os.Exit.

Пример с настройкой подключения к базе данных

Давайте рассмотрим пример использования testing.M для инициализации и очистки ресурсов перед выполнением тестов:

package main import ( "fmt" "os" "testing" ) func TestMain(m *testing.M) { // Инициализация ресурсов fmt.Println("Подготовка к тестированию...") setup() // Запуск тестов code := m.Run() // Очистка ресурсов cleanup() fmt.Println("Тестирование завершено") // Выход с кодом завершения os.Exit(code) } func setup() { // Настройка подключения к базе данных fmt.Println("Соединение с БД установлено") } func cleanup() { // Закрытие подключения fmt.Println("Соединение с БД закрыто") } func TestExample(t *testing.T) { // Пример теста if 2+2 != 4 { t.Error("Ошибка в вычислениях") } }

Результат выполнения кода при запуске go test:

"Подготовка к тестированию..." "Соединение с БД установлено" "Соединение с БД закрыто" "Тестирование завершено"

Пример с обработкой флагов командной строки

testing.M позволяет обрабатывать пользовательские флаги командной строки перед запуском тестов:

package main import ( "flag" "fmt" "os" "testing" ) var ( verbose = flag.Bool("v", false, "Подробный вывод") host = flag.String("host", "localhost", "Адрес сервера") ) func TestMain(m *testing.M) { // Парсинг пользовательских флагов flag.Parse() fmt.Printf("Хост: %s, Подробный вывод: %t\n", *host, *verbose) // Запуск тестов code := m.Run() os.Exit(code) } func TestServer(t *testing.T) { // Проверка подключения к серверу if *host == "" { t.Error("Адрес хоста не указан") } }

Результат выполнения кода с флагом:

"Хост: example.com, Подробный вывод: true"

Пример с отложенной очисткой ресурсов

Используем defer для обеспечения гарантированной очистки ресурсов при любом исходе тестов:

package main import ( "fmt" "os" "testing" ) func TestMain(m *testing.M) { // Создание временной директории tmpDir := "/tmp/testdata" fmt.Printf("Создана директория: %s\n", tmpDir) // Отложенная очистка defer func() { fmt.Printf("Удалена директория: %s\n", tmpDir) }() // Запуск тестов code := m.Run() os.Exit(code) } func TestTempFile(t *testing.T) { // Проверка работы с временной директорией if 1+1 != 2 { t.Error("Ошибка в вычислениях") } }

Результат выполнения кода:

"Создана директория: /tmp/testdata" "Удалена директория: /tmp/testdata"

Смотрите также

  • тип testing.T,
    который используется для управления тестами
  • тип testing.B,
    который используется для бенчмарков
  • функцию TestMain,
    которая является точкой входа для управления тестами
  • функцию testing.Short,
    которая проверяет флаг короткого режима тестирования
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить