Метод testing.T.Cleanup

Метод testing.T.Cleanup регистрирует функцию очистки, которая будет вызвана после завершения теста или подтеста. Он принимает один параметр — функцию без аргументов и без возвращаемых значений, которая будет выполнена в порядке, обратном их регистрации (LIFO). Этот метод особенно полезен для освобождения ресурсов, закрытия файлов, удаления временных каталогов или сброса состояния между тестами.

Синтаксис

got.Cleanup(func())

Пример с временным файлом

Давайте создадим временный файл в тесте и удалим его после завершения с помощью Cleanup:

gopackage main

import (
  "fmt"
  "os"
  "testing"
)

func TestTempFile(t *testing.T) {
  file, err := os.CreateTemp("", "test-*.txt")
  if err != nil {
    t.Fatal(err)
  }

  t.Cleanup(func() {
    os.Remove(file.Name())
    fmt.Println("cleanup: file removed")
  })

  file.WriteString("test data")
  fmt.Println("test: file created")
}

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

go"test: file created"
"cleanup: file removed"

Пример с несколькими функциями очистки

Функции очистки выполняются в обратном порядке их регистрации. Давайте зарегистрируем несколько функций:

gopackage main

import (
  "fmt"
  "testing"
)

func TestMultipleCleanups(t *testing.T) {
  t.Cleanup(func() {
    fmt.Println("cleanup: third")
  })

  t.Cleanup(func() {
    fmt.Println("cleanup: second")
  })

  t.Cleanup(func() {
    fmt.Println("cleanup: first")
  })

  fmt.Println("test: running")
}

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

go"test: running"
"cleanup: first"
"cleanup: second"
"cleanup: third"

Пример с подтестами

Функции очистки выполняются после завершения каждого подтеста, что позволяет изолировать ресурсы между подтестами:

gopackage main

import (
  "fmt"
  "testing"
)

func TestSubtestCleanup(t *testing.T) {
  t.Cleanup(func() {
    fmt.Println("main cleanup")
  })

  t.Run("subtest1", func(t *testing.T) {
    t.Cleanup(func() {
      fmt.Println("subtest1 cleanup")
    })
    fmt.Println("subtest1 running")
  })

  t.Run("subtest2", func(t *testing.T) {
    t.Cleanup(func() {
      fmt.Println("subtest2 cleanup")
    })
    fmt.Println("subtest2 running")
  })
}

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

go"subtest1 running"
"subtest1 cleanup"
"subtest2 running"
"subtest2 cleanup"
"main cleanup"

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

  • метод testing.T.TempDir,
    который создает временный каталог и автоматически удаляет его
  • метод testing.T.Setenv,
    который устанавливает переменную окружения и восстанавливает ее
  • метод testing.T.Helper,
    который помечает функцию как вспомогательную для тестов
  • метод testing.T.Parallel,
    который указывает, что тест можно выполнять параллельно