使用" goapp test"无法改变一致性

时间:2016-04-08 17:15:02

标签: google-app-engine go

Google的AppEngine服务提供了一个最终一致的数据库,用于存储生产中的应用程序数据。为了进行测试,Google提供了一个类似的数据库,可以模拟生产数据库的一致性特征。测试要求可能会有所不同,因此Google会向其测试服务器dev_appserver.py提供命令行参数,以便根据测试需要修改一致性特征。

我使用goapp工具为我的AppEngine开发运行自动化测试环境。 goapp test负责运行我们的自动服务器API测试。某些人goapp test似乎没有办法通过命令行参数设置数据存储的一致性级别,与dev_appserver.py不同,即使goapp test在某些地方启动dev_appserver.py在测试过程中指出。

有没有办法将命令行参数从dev_appserver.py传递给goapp test?如果没有,是否有另一种方法可以从命令行设置一致性?

1 个答案:

答案 0 :(得分:0)

我认为你正在使用aetest package。 如果是这种情况,您应该相应地设置StronglyConsistentDatastore member of the aetest.Options struct

以下是一个例子:

<强> hello.go

package hello

import (
    "fmt"
    "net/http"
    "time"

    "appengine"
    datastore "appengine/datastore"
)

type Employee struct {
        FirstName          string
        LastName           string
        HireDate           time.Time
}

func init() {
    http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)

    q := datastore.NewQuery("Employee").Filter("FirstName =", "Antonio")

    var people []Employee

    if _, err := q.GetAll(ctx, &people); err != nil {
        fmt.Fprintf(w, "Error %v", err)
    }

    fmt.Fprintf(w, "Matches %v", len(people))
}

<强> hello_test.go

package hello

import (
    "time"
    "testing"
    "net/http/httptest"
    "appengine"
    "appengine/aetest"
    datastore "appengine/datastore"
)

const consistency_strong = true; // set to false and the test will fail

func TestMyHandler(t *testing.T) {
    options := &aetest.Options{StronglyConsistentDatastore: consistency_strong}
    inst, err := aetest.NewInstance(options)
    if err != nil {
        t.Fatalf("Failed to create instance: %v", err)
    }
    defer inst.Close()

    req, err := inst.NewRequest("GET", "/", nil)
    if err != nil {
        t.Fatalf("Failed to create req1: %v", err)
    }
    ctx := appengine.NewContext(req)

    employee := &Employee{
            FirstName: "Antonio",
            LastName:  "Salieri",
            HireDate:  time.Now(),
    }

    key := datastore.NewIncompleteKey(ctx, "Employee", nil)

    _, err = datastore.Put(ctx, key, employee)

    if err != nil {
        t.Fatalf("Error setting test data: %v", err)
    }

    w := httptest.NewRecorder()

    handler(w, req)

    if w.Body.String() != "Matches 1" {
        t.Fatalf("Expected 1 record got %v", w.Body)
    }
}

如前所述,go工具只包装dev_appserver.py。这意味着,如果您不使用aetest,则可以随时使用选定的一致性政策运行您的应用:

/usr/local/go_appengine/dev_appserver.py --datastore_consistency_policy consistent .