Тесты Golang в подкаталоге

122

Я хочу создать пакет в Go с тестами и примерами для пакета в виде подкаталогов, чтобы рабочее пространство было чище. Возможно ли это, и если да, то как?

Вся документация всегда помещает тестовый код в то же место, что и другой код, это лучше в чем-то или просто соглашение?

Изящный пингвин
источник
5
Примечание: go test ./...будет запускать тесты для текущей папки и всех вложенных папок. См. Мой ответ ниже
VonC
я думал о том же. возникли проблемы с размещением тестов в отдельном каталоге, потому что у директора на том же уровне есть подкаталоги.
filthy_wizard

Ответы:

204

Обратите внимание, что вы можете запускать go test«рекурсивно»: вам нужно перечислить все пакеты, которые вы хотите протестировать .

Если вы находитесь в корневой папке проекта Go, введите:

go test ./...

./...Обозначение " " описано в разделе " Описание списков пакетов " " командыgo ":

Путь импорта является шаблоном, если он включает один или несколько " ..." подстановочных знаков, каждый из которых может соответствовать любой строке, включая пустую строку и строки, содержащие косую черту.

Такой шаблон распространяется на все каталоги пакетов, найденные в GOPATHдеревьях с именами, соответствующими шаблонам.

Как особый случай, x/...совпадения, xа также xподкаталоги.
Например, net/...расширяется до netпакетов и в своих подкаталогах.


Если вы храните _test.goфайлы во вложенной папке, команда « go test ./...» сможет их забрать.
Но:

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

При этом я все же предпочел бы хранить _test.goфайл рядом с основным исходным файлом: его легче найти.

VonC
источник
4
Некоторые могут утверждать, что отсутствие доступа к личным данным - это нормальное тестирование методом черного ящика и лучше. Что касается необходимости квалифицировать общедоступные символы, вы всегда можете импортировать _ "...".
ddevienne
15

Поместите свои тесты вместе с кодом в тот же каталог в файле с именем, file_test.goгде «файл» - это имя файла исходного кода, который вы тестируете. Это условность, и я на собственном опыте убедился, что это лучше всего.

Если go testинструмент недостаточно автоматизирован для вас, вы можете изучить GoConvey , у которого есть веб-интерфейс, который автоматически обновляет и запускает традиционные тесты Go, а также тесты GoConvey (которые основаны на поведении и являются более самодокументированными. чем традиционные тесты Go).

Matt
источник
2
GoConvey потрясающий (и я с нетерпением жду нового пользовательского интерфейса). Я использую его в своем текущем проекте, например, в github.com/VonC/asciidocgo/blob/master/abstractNode_test.go ). Однако go testтакже может работать с вложенными папками. См. Мой ответ ниже
VonC
Вы правы. На самом деле, вероятно, это более актуально, чем мой ответ на этот вопрос.
Мэтт,
10

отредактированный

Основываясь на ответе VonC,

Этот ответ действителен в go1.11. Пока не тестировал в старших goверсиях.

Для тех из вас, кто любит хранить свои тесты в подпапке, скажем test, запустив

go test ./...

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

Бег

go test ./.../test

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

ВНИМАНИЕ

Помните, что использование подпапок с тестами предотвратит вычисление отчета о покрытии. Философия go - оставлять тестовые файлы в папках с пакетами.

avi.elkharrat
источник
1
Хороший совет в дополнение к моему пятилетнему ответу. Проголосовали за
VonC
дорогая анна, объясните пожалуйста, что не работает? а какая у тебя версия го? Что ты пытаешься сделать? Впоследствии я понял, что этот метод не позволяет вычислять покрытие кода, а это очень жалко. Это то, что вы имеете в виду?
avi.elkharrat
1
go test ./.../testвозвращает go: warning: "./.../test" matched no packages// не только целевые тестовые папки. go версия go1.13 darwin / amd64
анна
1
@Madeo, это будет разумно, потому что golang не поощряет разделение тестов и кода. Аномалия заключалась в том, чтобы допускать это в предыдущих версиях.
avi.elkharrat
1
@ avi.elkharrat, и на самом деле я решил больше не использовать этот подход, хотя мне нравилось хранить свои тесты в отдельном пакете / папке = (
Мадео
-4

Обычно я не тестирую, но вы можете сгруппировать свой файл в каталоги и использовать импорт, например

import "./models"если это один уровень,
import "../modelsесли один уровень и один уровень

Например, для:
./models/todo.go
./test/todo_test.go

испытанию todo.goот todo_test.go, ваш импорт в todo_test.goбудет

import "../models"

Феликс Зилла
источник
Этот метод импорта кода работает только для открытых функций. Не похоже, что они находятся в одном пакете, даже если вы явно поместили их в один и тот же пакет. Так что это решение не решает проблему модульного тестирования.
The Graceful Penguin