我正在使用 Go 和 appengine,现在我想做一些测试用例。
我尝试使用 gos 标准测试包 Files(都是“package hello”):
hello/http.go
hello/http_test.go
问题:我无法运行go test hello
。我得到的最接近的是go test hello/http_test.go
,如果我不拨打任何电话,它就会起作用http.go
,这是毫无意义的。:)
我正在使用 Go 和 appengine,现在我想做一些测试用例。
我尝试使用 gos 标准测试包 Files(都是“package hello”):
hello/http.go
hello/http_test.go
问题:我无法运行go test hello
。我得到的最接近的是go test hello/http_test.go
,如果我不拨打任何电话,它就会起作用http.go
,这是毫无意义的。:)
设置 Go 环境变量(您的路径可能会有所不同):
export GOPATH=~/gopath
export PATH=$PATH:$GOPATH/bin
设置 Google App Engine 环境变量(您的路径可能会有所不同):
export APPENGINE_SDK=$HOME/appengine
export PATH=$PATH:$APPENGINE_SDK
符号链接appengine
和appengine_internal
目录:
ln -s $APPENGINE_SDK/goroot/src/pkg/appengine $GOPATH/src/pkg/
ln -s $APPENGINE_SDK/goroot/src/pkg/appengine_internal $GOPATH/src/pkg/
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
在构建适用于测试套件时使用。
通过设置以下构建标志:
// +build appengine
// +build !appengine
然后不是从我的包中导入,而是appengine
从我的包中导入
import (
github.com/gaego/context
)
..
c := context.NewContext(r)
..
最后需要提到的是,您必须显式关闭上下文,否则 python 进程将继续运行。您可以通过调用以下方法终止该过程:
defer c.Close()
更多示例请查看:
编辑: Takuya Ueda 创建了一个可与最新 SDK 配合使用的早午餐
Edit2: Joshua Marsh维护了一个与最新 SDK 兼容的分支
Edit3: Matt Zimmerman在标准 aetest 包(登录/注销和任务队列)上维护了一个具有附加功能的分支
一个有趣的发展:从 1.8.6 开始,使用服务存根进行测试已通过"appengine/aetest"
包集成到 SDK 中。这通过“测试”上下文在很大程度上与上述类似。更多信息