2015-07-11 1 views
12

Я хочу проверить несколько функций, которые включены в мой основной пакет, но мои тесты, похоже, не могут получить доступ к этим функциям.Как проверить основные функции пакета в 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, простую основную функцию для запуска всего, а затем проверить функции в своем собственном пакете или есть ли способ вызвать эти функции из основного файла во время тестирования?

+0

Там хорошее введение видео в пакет тестирования в этом видео (начиная с 3m30s) [https://youtu.be/XCsL89YtqCs?t=3m30s] (https://youtu.be/XCsL89YtqCs?t=3m30s) – Aaron

+0

Ваша основная функция() (и, в идеале, основная часть вашего пакета в целом) не нуждается в тестировании: она должна быть «тупой» конечной точкой для библиотеки или библиотек , Проверьте их. – elithrar

ответ

6

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

Если вы хотите протестировать устройство, переместите его из main().

10

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

Вот мой пробег:

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

записка, в моей версии, я побежал с обоими main.go и main_test .go в командной строке

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

Вот т он изменил verison:

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 
+5

Почему вы вообще указываете какие-либо файлы на 'go test'? Не. –

+0

правда, но я подумал, что задание человека немного борется, и я не хотел путать проблему с настройкой GOPATH или что-то в этом роде. Сделайте «идти тест». должно сработать? (еще не пробовал это за пределами GOPATH) –

+0

Вы не хотите, чтобы ваш тестовый файл находился в основном пакете. В итоге у вас будет много кода и флагов, которые вам не нужны, если вы это сделаете. – CVVS

-1

Изменить имя пакета из основной для 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 
+0

Ответ действительно не отвечает на вопрос. Это просто сложный эквивалент вызова 'go test' без указания файлов. –

 Смежные вопросы

  • Нет связанных вопросов^_^