Я пишу тестовую среду и хотел бы поместить примеры в свою документацию. Для удобства обслуживания я хотел бы протестировать эти примеры, но я не могу понять, как это сделать.
В идеале мне нужен проверенный пример, который выглядит так:
func TestFoo(t *testing.T) {
f := mytestframework.FromT(t)
// code using f
}
Обтекание приведенного выше фрагмента в func ExampleFoo() { }
не работает, поскольку определения функций не могут быть вложенными (это синтаксическая ошибка).
Я пытался поместить это в отдельный файл example_test.go
, однако godoc ошибочно примет его за тестовый файл, как, согласно блогу go.dev, на примерах целых файлов (выделено мной):
Полный пример файла — это файл, оканчивающийся на _test.go и содержащий ровно одну функцию-пример, без тестовых или эталонных функций и по крайней мере еще одно объявление на уровне пакета.
Я просмотрел документы для пакета Go doc, но не смог понять, полезен ли он мне.
Я мог бы просто вставить пример как блок кода уценки куда-нибудь в документацию, но тогда это не будет тестироваться и в будущем может незаметно устаревать.
Есть ли способ протестировать примеры тестов или, по крайней мере, проверить тип?
Пакет testing не поддерживает исполняемые примеры с использованием *testing.T
. В настоящее время по определению целые примеры файлов не должны включать функции Test*
.
Лучший вариант — просто добавить пример кода в виде блока с отступом в документацию по пакету или функции. Вот как пакет тестирования предоставляет пример документации
// Using test framework:
//
// func TestFoo(t *testing.T) {
// framework(t)
// }
Другой вариант — использовать функции Example
и объявить тестовую функцию анонимной.
func ExampleTesting() {
_ = func(t *testing.T) {
framework(t)
}
}
Кроме того, хотя я согласен с тем, что пакет testing
не следует использовать в развернутом коде, я не думаю, что место, где будет использоваться код, влияет на потребность пользователя в примерах.
лол, мне нравится, насколько это даже не касается вопроса. Для тестовой библиотеки производственный код является тестом. Это единственное место, где он может столкнуться!
Ой, я пропустил это было для тестовых фреймворков. Обновлено, чтобы предоставить лучшие доступные варианты.
Боюсь, это не сработает для меня, так как я хочу
TestFoo
присутствовать в примере, потому что мне нужно показать людям, как использовать мои вещи в модульном тесте Go.