Как написать примеры тестов на Go?

Я пишу тестовую среду и хотел бы поместить примеры в свою документацию. Для удобства обслуживания я хотел бы протестировать эти примеры, но я не могу понять, как это сделать.

В идеале мне нужен проверенный пример, который выглядит так:

func TestFoo(t *testing.T) {
    f := mytestframework.FromT(t)
    // code using f
}

Обтекание приведенного выше фрагмента в func ExampleFoo() { } не работает, поскольку определения функций не могут быть вложенными (это синтаксическая ошибка).

Я пытался поместить это в отдельный файл example_test.go, однако godoc ошибочно примет его за тестовый файл, как, согласно блогу go.dev, на примерах целых файлов (выделено мной):

Полный пример файла — это файл, оканчивающийся на _test.go и содержащий ровно одну функцию-пример, без тестовых или эталонных функций и по крайней мере еще одно объявление на уровне пакета.

Я просмотрел документы для пакета Go doc, но не смог понять, полезен ли он мне.

Я мог бы просто вставить пример как блок кода уценки куда-нибудь в документацию, но тогда это не будет тестироваться и в будущем может незаметно устаревать.

Есть ли способ протестировать примеры тестов или, по крайней мере, проверить тип?

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
3
0
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пакет testing не поддерживает исполняемые примеры с использованием *testing.T. В настоящее время по определению целые примеры файлов не должны включать функции Test*.

Лучший вариант — просто добавить пример кода в виде блока с отступом в документацию по пакету или функции. Вот как пакет тестирования предоставляет пример документации

// Using test framework:
//
//      func TestFoo(t *testing.T) {
//          framework(t)
//      }

Другой вариант — использовать функции Example и объявить тестовую функцию анонимной.

func ExampleTesting() {
    _ = func(t *testing.T) {
        framework(t)
    }
}

Боюсь, это не сработает для меня, так как я хочу TestFoo присутствовать в примере, потому что мне нужно показать людям, как использовать мои вещи в модульном тесте Go.

kcza 06.02.2023 15:42

Кроме того, хотя я согласен с тем, что пакет testing не следует использовать в развернутом коде, я не думаю, что место, где будет использоваться код, влияет на потребность пользователя в примерах.

kcza 06.02.2023 16:16

лол, мне нравится, насколько это даже не касается вопроса. Для тестовой библиотеки производственный код является тестом. Это единственное место, где он может столкнуться!

marco6 06.02.2023 17:26

Ой, я пропустил это было для тестовых фреймворков. Обновлено, чтобы предоставить лучшие доступные варианты.

mpx 06.02.2023 21:48

Другие вопросы по теме