Как проверить основные функции пакета в golang?

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

Мой образец файла main.go выглядит так:

package main

import (
    "log"
)

func main() {
    log.Printf(foo())
}

func foo() string {
    return "Foo"
}

и мой файл main_test.go выглядит так:

package main

import (
    "testing"
)

func Foo(t testing.T) {
    t.Error(foo())
}

когда я запускаю go test main_test.go, я получаю

# command-line-arguments
.\main_test.go:8: undefined: foo
FAIL    command-line-arguments [build failed]

Как я понимаю, даже если я переместил тестовый файл в другое место и попытался импортировать его из файла main.go, я не смог его импортировать, так как он package main.

Каков правильный способ структурирования таких тестов? Должен ли я просто удалить все из пакета main asides простой основной функции для запуска всего, а затем проверить функции в своем собственном пакете или есть ли способ для вызова этих функций из основного файла во время тестирования?

Ответ 1

когда вы указываете файлы в командной строке, вы должны указать все из них

Здесь мой запуск:

$ ls
main.go     main_test.go
$ go test *.go
ok      command-line-arguments  0.003s

Заметьте, что в моей версии я запускал с main.go и main_test.go в командной строке

Кроме того, ваш файл _test не совсем прав, вам нужно, чтобы ваша тестовая функция называлась TestXXX и указала на test.T

Здесь измененная версия:

package main

import (
    "testing"
)

func TestFoo(t *testing.T) {
    t.Error(foo())
}

и измененный вывод:

$ go test *.go
--- FAIL: TestFoo (0.00s)
    main_test.go:8: Foo
FAIL
FAIL    command-line-arguments  0.003s

Ответ 2

Единичные тесты идут только до сих пор. В какой-то момент вы должны запустить программу. Затем вы проверяете, что он работает с реальным входом, из реальных источников, обеспечивая реальный выход в реальные места. Для реального.

Если вы хотите unit test вещь переместить его из main().

Ответ 3

Измените имя пакета с основного на foobar в обоих источниках. Переместите исходные файлы в src/foobar.

mkdir -p src/foobar
mv main.go main_test.go src/foobar/

Обязательно установите GOPATH в папку, в которой находится src/foobar.

export GOPATH=`pwd -P`

Протестируйте его с помощью

go test foobar