go和appengine的测试用例

Ola*_*son 12 testing tdd google-app-engine go

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

我尝试使用gos标准测试包,Files(两个"包你好"):

hello/http.go
hello/http_test.go
Run Code Online (Sandbox Code Playgroud)

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

Kyl*_*ley 15

github.com/mzimmerman/appenginetesting

安装

  1. 安装Go

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

    export GOPATH=~/gopath
    export PATH=$PATH:$GOPATH/bin
    
    Run Code Online (Sandbox Code Playgroud)
  3. 下载适用于Google的Google App Engine SDK

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

    export APPENGINE_SDK=$HOME/appengine
    export PATH=$PATH:$APPENGINE_SDK
    
    Run Code Online (Sandbox Code Playgroud)
  5. 符号链接appengineappengine_internaldirctories:

    ln -s $APPENGINE_SDK/goroot/src/pkg/appengine $GOPATH/src/pkg/
    ln -s $APPENGINE_SDK/goroot/src/pkg/appengine_internal $GOPATH/src/pkg/
    
    Run Code Online (Sandbox Code Playgroud)
  6. 安装appenginetesting

    go get github.com/mzimmerman/appenginetesting
    
    Run Code Online (Sandbox Code Playgroud)

写作考试

appengintesting提供假的appengine.Context.在幕后它启动一个Python开发服务器并通过它运行请求,因此测试可能有点慢(秒而不是毫秒).要在测试中使用它,你可以编写类似的东西

import "github.com/mzimmerman/appenginetesting"
...
c := appenginetesting.NewContext(nil)
Run Code Online (Sandbox Code Playgroud)

然后,您可以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从我的包导入导入Eg

import (
  github.com/gaego/context
)

..
c := context.NewContext(r)
..
Run Code Online (Sandbox Code Playgroud)

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

defer c.Close()
Run Code Online (Sandbox Code Playgroud)

有关更多示例,请查看:

context_test.go

recorder_test.go

编辑: Takuy​​a Ueda创造了一个与最新SDK一起使用的早午餐

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

编辑3: Matt Zimmerman维护一个包含额外功能的分支,而不是标准的aetest包(登录/注销和任务队列)


Eze*_*uns 2

一个有趣的发展:从 1.8.6 开始,使用服务存根进行测试已通过包集成到 SDK 中"appengine/aetest"。这与上面通过“测试”上下文的工作原理非常相似。更多信息