Тести Golang в підкаталозі


121

Я хочу створити пакет у Go з тестами та прикладами для пакета як підкаталогів, щоб зберегти робочу область чистішою. Це можливо і якщо так, то як?

Вся документація завжди ставить код тестування там же, що й інший код, це краще в чомусь чи просто умовно?


5
Примітка: go test ./...буде запущено тести в поточній папці та всіх папках. Дивіться мою відповідь нижче
VonC


я думав те саме. не вдається скласти тести для окремого режисера, оскільки директор на одному рівні має субрежирі.
filthy_wizard

Відповіді:


203

Зауважте, що ви можете запускати go test"рекурсивно": вам потрібно перерахувати всі пакунки, які ви хочете протестувати .

Якщо ви знаходитесь у кореневій папці вашого проекту Go, введіть:

go test ./...

./...Позначення ' ' описано в розділі " Опис списків пакетів " командиgo "":

Шлях імпорту - це візерунок, якщо він включає одну або декілька ...підкреслених кодів, кожна з яких може відповідати будь-якій рядку, включаючи порожній рядок та рядки, що містять косу рису.

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

Як особливий випадок, x/...збіги x, а також xпідкаталоги.
Наприклад, net/...розширюється на netта пакує у своїх підкаталогах.


Якщо ви зберігаєте свої _test.goфайли у підпапках, команда ' go test ./...' зможе їх забрати.
Але:

  • Вам потрібно буде встановити експортовані змінні та функції (використовувані у ваших тестах) з назвою вашого пакета, щоб тестовий файл мав доступ до експортованого вмісту пакета.
  • Ви б не отримали доступ до неекспортованого вмісту.

Однак, я б вважав за краще зберегти _test.goфайл поруч із основним вихідним файлом: його легше знайти.


4
Деякі можуть стверджувати, що недоступ до приватних речей - це звичайне тестування в чорному ящику і краще. Що стосується необхідності кваліфікувати загальнодоступні символи, ви завжди можете імпортувати _ "...".
дедвієне

15

Поставте свої тести поряд із кодом у той самий каталог у файлі під назвою file_test.go"file" - ім'я файлу вихідного коду, який ви тестуєте. Це умовність, і я вважаю, що це найкраще на власному досвіді.

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


2
GoConvey - приголомшливий (і я з нетерпінням чекаю нового інтерфейсу). Я використовую його в моєму поточному проекті, наприклад, у github.com/VonC/asciidocgo/blob/master/ab абстрактNode_test.go , наприклад). Однак go testможе працювати і для папок. Дивіться мою відповідь нижче
VonC

Право ти є. Насправді це, мабуть, більш актуально, ніж моя відповідь на це запитання.
Метт

10

ВИДАЛЕНО

Побудований за відповіддю VonC,

Ця відповідь дійсна в go1.11. Ще немає тестування у верхніх goверсіях.

Скажімо, для тих, хто любить зберігати свої тести в підпапці, скажімо test, після цього запустіть

go test ./...

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

Біг

go test ./.../test

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

ОБЕРЕЖНО

Зауважте, що використання тестових підпапок запобіжить обчислення звітів про покриття. Філософія ходу полягає в тому, щоб залишити тестові файли у папках пакетів.


1
Гарна порада, окрім моєї п’ятирічної відповіді. Upvoted
VonC

дорога анна, поясни, будь ласка, що не працює? а яка у вас версія ходу? що ти намагаєшся зробити? Після цього я зрозумів, що цей метод не дозволяє обчислювати покриття коду, що є безсумнівним. Це ви маєте на увазі?
avi.elkharrat

1
go test ./.../testreturn go: warning: "./.../test" matched no packages// має не лише тестові папки. go version go1.13 darwin / amd64
anna

1
@Madeo, це призведе до сенсу, оскільки golang не заохочує сегрегацію тестів та коду. Аномалія полягала в тому, щоб дозволити це у попередніх версіях.
avi.elkharrat

1
@ avi.elkharrat, і насправді я вирішив більше не використовувати цей підхід, хоча мені подобалось тримати свої тести в окремому пакеті / папці = (
Madeo

-4

Я зазвичай не тестую, але ви можете згрупувати свій файл у каталоги та використовувати імпорт як

import "./models"якщо вирівнюється один рівень,
import "../modelsякщо виходить один рівень і один рівень в

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

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

import "../models"


Цей спосіб імпорту коду працює лише для відкритих функцій. Здається, не поводиться так, як вони в одному пакеті, навіть думав, що ти явно помістиш їх у той самий пакет. Тож це рішення насправді не вирішує проблему для тестування одиниць.
Витончений пінгвін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.