У меня есть функции, определенные в main.go
, которые недоступны в main_test.go
.Тем не менее, в некоторых онлайн-учебниках я вижу, что функции доступны: я хотел бы понять разницу, а также понять, как их структурировать идиоматическим способом.
В частности, у меня есть приложение с несколькимидвоичные файлы:
myapp/cmd/app/main.go
myapp/cmd/cli/main.go
В настоящее время у меня много простых логик модульного тестирования, которые я запускаю в func main
файлах main.go
.Я просто тестирую отдельные функции и заставляю их печатать свои выходные данные, я не пытаюсь задействовать всю мощь «тестирующего» набора, если я могу этого избежать.
Поскольку мои тесты находятся в верхней частимой main.go на данный момент слишком длинный, я хотел бы переместить их в определенные тестовые файлы, например:
myapp/cmd/app/main_test.go
myapp/cmd/cli/main_test.go
Это достаточно хорошо работает с моим make-файлом:
# Makefile
all: test build
build:
go build -o cmd/app/main cmd/app/main.go
go build -o cmd/cli/main cmd/cli/main.go
test:
go test ./cmd/app/main_test.go
go test ./cmd/cli/main_test.go
Если я просто хочу запустить свои тестовые файлы, я бы хотел взять элемент в моем app/main.go
// cmd/app/main.go
package main
func definedInMain(m string) string {
//
}
func main() {
m := definedInMain("1")
fmt.Println(m)
// all the rest of my app's logic...
}
и запустить его в моем main_test.go
// cmd/app/main_test.go
package main
// no imports, I hope?
func testDefinedInMain() {
m := definedInMain("1")
fmt.Println(m)
}
Тем не менее, это не с:
undefined: definedInMain
FAIL
Я запутался, что мне нужно импортировать все эти функции в мои main_test.go
файлы (и даже когда я пытаюсь, он предлагает "can't load package: ... myapp/cmd/app/main" in any of: ..."
)
Существует ли простой и понятный способ для меня тестировать мои очень простые модульные тесты в тестовых файлах и выполнять свои функции в основных файлах без большого количества переписывания импорта или другой существенной реорганизации?
По некоторым ссылкам у меня сложилось впечатление, что если я сделаю main_test.go
, то импорт будет следовать сам по себе (как в этих примерах).
Итак, вы можете увидеть, что я немного запутался, обучающие программы получают свои функции, импортируемые бесплатно, и я делаюнет, и я просто хочу лучше понять магию.
Это просто случай, когда моя функция, определенная в InMain, является закрытой, потому что она в нижнем регистре?Я действительно хочу, чтобы эта функция была закрытой, но я ожидаю, что она будет экспортирована в файл main_test.go так же, как ее можно использовать в main.go.Должен ли я сделать его полностью публичным, чтобы иметь тесты в другом файле?Это не кажется правильным, например, «можно ли протестировать общедоступные методы в go?»