2013-10-05 4 views
52

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

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

Спасибо.

+3

Примечание: 'go test./...' будет запускать тесты в текущей папке * и * во всех подпапках. См. [Мой ответ ниже] (http://stackoverflow.com/a/21725603/6309) – VonC

+0

Возможный дубликат [Как проверить все тесты в моем проекте?] (Http://stackoverflow.com/ вопросы/16353016/how-to-go-test-all-testings-in-my-project) –

+0

Я думал об одном и том же. испытывая трудности с установкой тестов в отдельный каталог, потому что режиссер на том же уровне имеет вспомогательные устройства. –

ответ

86

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

Если есть корневая папка вашего проекта Go, Тип:

go test ./... 

'./...' обозначение описано в разделе "Description of package lists" из "command go":

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

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

В качестве специального случая, x/... соответствует x, а также подкатегории x.
Например, net/... расширяется до net и пакетов в подкаталогах.


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

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

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

+1

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

10

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

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

+2

GoConvey - это потрясающе (и я жду нового интерфейса с большим ожиданием). Я использую его в своем текущем проекте, например, в https://github.com/VonC/asciidocgo/blob/master/abstractNode_test.go). Однако 'go test' также может работать для подпапок. См. [Мой ответ ниже] (http://stackoverflow.com/a/21725603/6309) – VonC

+0

Правильно. На самом деле, это, вероятно, более актуально, чем мой ответ на этот вопрос. – Matt

+0

Не имеет значения, GoConvey все еще камни;) – VonC

0

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

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

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

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

import "../models"

+0

Этот метод импорта кода работает только для открытых функций. Кажется, он не ведет себя так, как будто они находятся в одном пакете, даже если вы явно помещаете их в один и тот же пакет. Поэтому это решение на самом деле не решает проблему для модульного тестирования. –

0

Попробуйте использовать следующий репозиторий github.

https://github.com/appleboy/golang-testing

Вы можете скачать скрипт тестирования golang.

$ curl -fsSL https://raw.githubusercontent.com/appleboy/golang-testing/master/coverage.sh /usr/local/bin/coverage 
$ chmod +x /usr/local/bin/coverage 
Смежные вопросы