Тесты 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файл рядом с основным исходным файлом: его легче найти.


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

15

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

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


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 - оставлять тестовые файлы в папках с пакетами.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.