Тест-тесты для 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

github.com/mzimmerman/appenginetesting

Установка

  • Установить 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 (Вход/Выход из системы и Задача Очереди)