go和appengine的测试用例

时间:2012-07-01 23:55:29

标签: google-app-engine testing tdd go

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

我尝试使用gos标准测试包, 文件(都是“包你好”):

hello/http.go
hello/http_test.go

问题:我无法运行go test hello。我得到的最接近的是go test hello/http_test.go,如果我不打电话给http.go,这是有效的,这是毫无意义的。 :)

2 个答案:

答案 0 :(得分:15)

github.com/mzimmerman/appenginetesting

安装

  1. Install Go

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

    export GOPATH=~/gopath
    export PATH=$PATH:$GOPATH/bin
    
  3. 下载Google App Engine SDK for Go

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

    export APPENGINE_SDK=$HOME/appengine
    export PATH=$PATH:$APPENGINE_SDK
    
  5. 符号链接appengineappengine_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/
    
  6. 安装appenginetesting

    go get github.com/mzimmerman/appenginetesting
    
  7. 编写测试

    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

    通过设置以下构建标志:

    • context_appengine.go // +build appengine
    • context_testing.go // +build !appengine

    编译器将决定加载哪个文件。 Example。这项技术来自Gorilla

    然后从appengine导入,而不是从我的包裹导入E.g。

    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包(登录/注销和任务队列)附加功能的分支

答案 1 :(得分:2)

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