12

我正在使用 Go 和 appengine,现在我想做一些测试用例。

我尝试使用 gos 标准测试包 Files(都是“package hello”):

hello/http.go
hello/http_test.go

问题:我无法运行go test hello。我得到的最接近的是go test hello/http_test.go,如果我不拨打任何电话,它就会起作用http.go,这是毫无意义的。:)

4

2 回答 2

15

github.com/mzimmerman/appenginetesting

安装

  1. 安装围棋

  2. 设置 Go 环境变量(您的路径可能会有所不同)

    export GOPATH=~/gopath
    export PATH=$PATH:$GOPATH/bin
    
  3. 下载适用于 Go 的 Google App Engine SDK

  4. 设置 Google App Engine 环境变量(您的路径可能会有所不同)

    export APPENGINE_SDK=$HOME/appengine
    export PATH=$PATH:$APPENGINE_SDK
    
  5. 符号链接appengineappengine_internal目录:

    ln -s $APPENGINE_SDK/goroot/src/pkg/appengine $GOPATH/src/pkg/
    ln -s $APPENGINE_SDK/goroot/src/pkg/appengine_internal $GOPATH/src/pkg/
    
  6. 安装appengine 测试

    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

编译器将决定要加载哪个文件。例子。这种技术取自大猩猩

然后不是从我的包中导入,而是appengine从我的包中导入

import (
  github.com/gaego/context
)

..
c := context.NewContext(r)
..

最后需要提到的是,您必须显式关闭上下文,否则 python 进程将继续运行。您可以通过调用以下方法终止该过程:

defer c.Close()

更多示例请查看:

context_test.go

recorder_test.go

编辑: Takuy​​a Ueda 创建了一个可与最新 SDK 配合使用的早午餐

Edit2: Joshua Marsh维护了一个与最新 SDK 兼容的分支

Edit3: Matt Zimmerman在标准 aetest 包(登录/注销和任务队列)上维护了一个具有附加功能的分支

于 2012-07-02T02:51:56.600 回答
2

一个有趣的发展:从 1.8.6 开始,使用服务存根进行测试已通过"appengine/aetest"包集成到 SDK 中。这通过“测试”上下文在很大程度上与上述类似。更多信息

于 2013-10-30T07:02:22.027 回答