我正在使用Go和appengine,现在我想做一些测试用例。
我尝试使用gos标准测试包, 文件(都是“包你好”):
hello/http.go
hello/http_test.go
问题:我无法运行go test hello
。我得到的最接近的是go test hello/http_test.go
,如果我不打电话给http.go
,这是有效的,这是毫无意义的。 :)
答案 0 :(得分:15)
设置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
dirctories:
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
导入上下文。这允许我在构建用于App Engine时使用appengine.Context
,并在构建用于测试套件时使用appenginetesting.Context
。
通过设置以下构建标志:
// +build appengine
// +build !appengine
编译器将决定加载哪个文件。 Example。这项技术来自Gorilla
然后从appengine
导入,而不是从我的包裹导入E.g。
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 :(得分:2)
一个有趣的发展:从1.8.6开始,使用服务存根进行测试已经通过"appengine/aetest"
包集成到SDK中。这通过“测试”上下文很大程度上与上述相同。 More info