Тест-тесты для go и appengine
Я использую Go и appengine, и теперь я хотел бы сделать некоторые тестовые примеры.
Я пробовал использовать стандартный тестовый пакет gos,
Файлы (оба "приветствие пакета" ):
hello/http.go
hello/http_test.go
Проблема: я не могу запустить go test hello
. Самое близкое, что у меня есть, - это go test hello/http_test.go
, который работает, если я не звоню на http.go
, что совершенно бессмысленно.:)
Ответы
Ответ 1
Интересная разработка: с 1,8.6 с использованием служебных заглушек для тестирования была интегрирована в SDK через пакет "appengine/aetest"
. Это работает в основном так, как описано выше, в контексте тестирования. Дополнительная информация
Ответ 2
Установка
-
Установить Go
-
Установите переменные состояния перехода (ваш путь может отличаться):
export GOPATH=~/gopath
export PATH=$PATH:$GOPATH/bin
-
Загрузите SDK Google App Engine для Go
-
Установите переменные окружения Google App Engine (ваш путь может отличаться):
export APPENGINE_SDK=$HOME/appengine
export PATH=$PATH:$APPENGINE_SDK
-
Symlink appengine
и appengine_internal
dirctories:
ln -s $APPENGINE_SDK/goroot/src/pkg/appengine $GOPATH/src/pkg/
ln -s $APPENGINE_SDK/goroot/src/pkg/appengine_internal $GOPATH/src/pkg/
-
Установите appenginetesting
go get github.com/mzimmerman/appenginetesting
Тест на запись
appengintesting обеспечивает подделку appengine.Context
. За кулисами Он запускает сервер разработки Python и запускает запрос через него, поэтому тесты могут быть немного медленными (секунды вместо миллисекунд). Чтобы использовать его в тестах, вы пишете что-то вроде
import "github.com/mzimmerman/appenginetesting"
...
c := appenginetesting.NewContext(nil)
Затем вы можете использовать c
, поскольку вы использовали бы фактический appengine.Context
. Это будет работать в тестовом файле, но он не будет работать с контекстами, которые вы создаете, вызывая appengine.NewContext(r)
Стратегия, которую я использую в gaego, заключается в том, чтобы импортировать контекст из пользовательского пакета вместо appengine
. Это позволяет мне использовать appengine.Context
, когда сборка для App Engine и использовать appenginetesting.Context
, когда сборка предназначена для тестового масти.
Установив следующие флаги сборки:
- context_appengine.go
// +build appengine
- context_testing.go
// +build !appengine
Компилятор определит, какой файл он хотел бы загрузить. Пример. Эта техника была принята в форме Gorilla
Затем вместо импорта из appengine
я импортирую из своего пакета, например.
import (
github.com/gaego/context
)
..
c := context.NewContext(r)
..
Последнее, что нужно упомянуть, заключается в том, что вы должны явно закрыть контекст, иначе процессы python будут продолжать работать. Вы завершаете процесс, вызывая:
defer c.Close()
Для получения дополнительных примеров, пожалуйста, просмотрите:
context_test.go
recorder_test.go
Изменить: Takuya Ueda создал бранч, который работает с последним SDK
Edit2: Joshua Marsh поддерживает вилку, совместимую с последним SDK
Edit3: Мэтт Циммерман поддерживает вилку с дополнительными функциями над стандартным пакетом aetest (Вход/Выход из системы и Задача Очереди)