Go: Автоматическое тестирование
Теория: Работа с временными файлами и каталогами
В реальном коде мы всё время крутимся вокруг файлов. Читаем конфиги, пишем логи, сохраняем результаты работы. В тестах это тоже нужно проверять. Но если тесты начнут писать настоящие файлы прямо в проект — начнётся полный бардак. Представь: один тест перезаписал файл, другой не смог его удалить, третий случайно затёр что-то важное. В итоге проект после прогона тестов похож на свалку.
Поэтому в тестах всегда работают с временными файлами и директориями. Они создаются в специальной системной директории tmp, имеют уникальные имена и исчезают после завершения теста. Это как одноразовая посуда: использовал, проверил — выкинул.
Директория tmp
У каждой операционной системы есть место под временные данные. На Linux и macOS это обычно /tmp, на Windows — C:\Users<имя>\AppData\Local\Temp. Туда можно писать что угодно, и система рано или поздно сама почистит.
Go знает, где этот каталог, через функцию os.TempDir(). Если её вызвать, она вернёт путь к текущему «времяному».
Когда мы вызываем os.CreateTemp("", "pattern") или os.MkdirTemp("", "pattern") и передаём пустую строку первым аргументом, Go автоматически создаёт файл или директорию именно там.
Временный файл: создаём, пишем, читаем
Допустим, у нас есть функция, которая должна записывать данные в файл. Мы хотим протестировать её, но писать в проект нельзя. Тогда используем временный файл.
Такой тест работает в изоляции: каждый запуск создаёт уникальный файл, тест проверяет его содержимое и удаляет. После тестов в проекте чисто, будто ничего и не было.
Временная директория: создаём и работаем внутри
Иногда одного файла мало. Например, если нужно проверить функцию, которая перебирает файлы в директории. Для этого в Go есть os.MkdirTemp.
Теперь тест создаёт целую «песочницу»: в ней можно создавать файлы, директории, проверять логику работы с файловой системой. В конце всё это удаляется одной строкой os.RemoveAll.
Современный способ: t.TempDir()
Писать вручную os.MkdirTemp и defer os.RemoveAll немного утомительно. Поэтому начиная с Go 1.15 у *testing.T есть метод TempDir(). Он делает всё то же самое, но за вас.
С t.TempDir тесты получаются чище: не нужно вручную писать RemoveAll, не нужно думать про порядок defer. Go всё делает за вас.
Зачем всё это
Временные файлы и директории нужны везде, где код взаимодействует с файловой системой:
- сохранить результат работы и проверить, что он записан правильно;
- проверить алгоритм, который читает директорию с файлами;
- временно создать лог или отчёт и убедиться, что он имеет правильный формат.
Тесты должны быть изолированными, и tmp — идеальный способ эту изоляцию обеспечить.
Итог
Вместо того чтобы засорять проект настоящими файлами, тесты работают с временными. Функция os.CreateTemp создаёт файл, os.MkdirTemp — директорию, t.TempDir делает то же самое, но сам убирает за собой. Все они создают уникальные имена внутри системного tmp, так что тесты не мешают друг другу.
Благодаря этому после прогонов тестов на диске не остаётся следов, проект чистый, а тесты надёжные.



