GO: Как протестировать создание файла? Есть ли руководство по тестированию?

Модератор: Модераторы разделов

Аватара пользователя
UnixNoob
Сообщения: 1390
ОС: Slackware

GO: Как протестировать создание файла? Есть ли руководство по тестированию?

Сообщение UnixNoob »

Приветствую. Хотел бы понять каким образом протестировать подобную функцию:

Код: Выделить всё

func createFile(dirPath, filename string) (*os.File, error) {
	dir, err := os.Stat(dirPath)
	if err != nil {
		return nil, err
	}
	if !dir.IsDir() {
		return nil, fmt.Errorf("could not save, the path is not directory")
	}
	d, err := filepath.Abs(dirPath)
	if err != nil {
		return nil, err
	}
	filePath := path.Join(d, filename)
	f, err := os.Create(filePath)
	return f, err
}

В интернете что-то находилось, но я не смог оценить правильность подхода и мой ли это случай, поэтому решил спросить здесь.

Так же хотел узнать нет ли каких-то книг/руководств конкретно по тестированию в Go, чтобы при необходимости написания тестов я мог понять как это правильно делать. Не на совсем простых примерах, из разряда "как проверить функцию сложения", а что-то более практичное.
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Спасибо сказали:
Аватара пользователя
Dionysius
Сообщения: 523
ОС: Manjaro

Re: GO: Как протестировать создание файла? Есть ли руководство по тестированию?

Сообщение Dionysius »

В тесте создавать/удалять файл и гонять тестируемую функцию.

Почитать про тестирование в Go:
1. Михалис Цукалос. Golang для профи. Глава 11. Тестирование, оптимизация и профилирование кода
2. Донован, Керниган. Язык программирования Go. Глава 11. Тестирование
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20834
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: GO: Как протестировать создание файла? Есть ли руководство по тестированию?

Сообщение Bizdelnick »

Помимо уже указанного, конечно же, надо читать https://pkg.go.dev/testing.
UnixNoob писал:
16.04.2023 20:04
Не на совсем простых примерах, из разряда "как проверить функцию сложения", а что-то более практичное.
Но ведь с созданием файла именно что совсем простой пример.

И у Вас, кстати, в нём много ошибок, заключающихся в том, что Вы делаете ненужные проверки. Во-первых, os.Create() и без того вернёт соответствующую ошибку, если каталог отсутствует или не является каталогом (точнее, вернёт выполняемый в конечном итоге системный вызов open). Во-вторых и главных, между временем Вашей проверки и собственно созданием файла проходит время, за которое каталог может быть удалён или переименован; в таком случае Вы получите совсем не тот результат, которого ожидали. См. wikipedia://time-of-check to time-of-use. Вы пытались «улучшить» os.Create() совершенно напрасно, эта обёртка не делает ничего полезного и только ведёт к дополнительным ошибкам. Если Вы хотите как-то отдельно обрабатывать ситуацию, когда каталог отсутствует, например, получайте информацию об ошибке из того, что возвращает os.Create(), и проверяйте с помощью errors.Is().
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
UnixNoob
Сообщения: 1390
ОС: Slackware

Re: GO: Как протестировать создание файла? Есть ли руководство по тестированию?

Сообщение UnixNoob »

Dionysius писал:
17.04.2023 00:46
В тесте создавать/удалять файл и гонять тестируемую функцию.
Забыл уточнить, я хотел найти способ протестировать её не создавая/удаляя файл, узнать возможно ли это в целом. С решением "в лоб" и правда было бы просто, а вот с фиктивной фс я не разобрался.
Bizdelnick писал:
17.04.2023 01:27
И у Вас, кстати, в нём много ошибок, заключающихся в том, что Вы делаете ненужные проверки
В моем представлении данные проверки мне нужны, т.к я не знаю в каком виде пользователь укажет путь и имя файла.
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20834
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: GO: Как протестировать создание файла? Есть ли руководство по тестированию?

Сообщение Bizdelnick »

UnixNoob писал:
17.04.2023 10:45
В моем представлении данные проверки мне нужны, т.к я не знаю в каком виде пользователь укажет путь и имя файла.
Эти проверки сделает ядро ОС, при этом исключив состояние гонки. Делать их так, как сделали Вы, — грубая ошибка, которая нередко приводит к уязвимостям (см. CWE-367).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: