【问题标题】:Test cases for go and appenginego 和 appengine 的测试用例
【发布时间】:2012-07-02 10:42:11
【问题描述】:

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

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

hello/http.go
hello/http_test.go

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

【问题讨论】:

    标签: google-app-engine testing tdd go


    【解决方案1】:

    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 目录:

      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
      

    写作测试

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

    import "github.com/mzimmerman/appenginetesting"
    ...
    c := appenginetesting.NewContext(nil)
    

    然后您可以像使用实际的appengine.Context 一样使用c。这适用于测试文件,但不适用于您通过调用 appengine.NewContext(r) 创建的上下文

    我在gaego 中使用的策略是从自定义包而不是appengine 导入上下文。这允许我在构建用于 App Engine 时使用appengine.Context,并在构建用于测试套件时使用appenginetesting.Context

    通过设置以下构建标志:

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

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

    然后我不是从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 兼容的 fork

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

    【讨论】:

    • 感谢您的提示。不幸的是,我根本不明白这一点。谷歌搜索,找不到任何使用说明(code.google.com/p/gae-go-testing 主要是误导)。
    • @OlaAndersson 我已经更新了我的答案以包括设置和使用。如果有任何不清楚的地方,请告诉我。
    • 工作,谢谢!我必须添加一些东西:我还需要复制“code.google.com”文件夹,就像 appengine 和 appengine_internals 一样。
    • 希望这将成为未来 go appengine 设置的一部分。
    • @OlaAndersson 我很高兴它成功了!感谢您提及code.google.com/p/goprotobuf 包我已经更新了答案以包含它。从邮件列表上的 cmets 看来,appenginetesting 将出现在 sdk 中,我认为 AEGo 团队目前有很多事情要做。希望 Google 能尽快为他们提供更多资源。
    【解决方案2】:

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

    【讨论】:

    • 这是 Google 官方支持的测试方法,但是它缺少 appenginetesting 中可用的一些功能。
    • 我会这么说。我们需要运行go get 才能使其工作。
    猜你喜欢
    • 1970-01-01
    • 2015-01-03
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多