gpt4 book ai didi

google-app-engine - 无法使用 "goapp test"更改一致性

转载 作者:IT王子 更新时间:2023-10-29 02:23:20 28 4
gpt4 key购买 nike

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

我正在使用 goapp 工具来运行我们的 AppEngine 开发自动化测试环境。 goapp test 负责运行我们的自动化服务器 API 测试。 goapp test 似乎无法通过命令行参数设置数据存储的一致性级别,这与 dev_appserver.py 不同,即使 goapp test 在测试过程中的某个时刻启动 dev_appserver.py

有没有办法将命令行参数从 goapp test 传递到 dev_appserver.py?如果没有,是否有从命令行设置一致性的替代方法?

最佳答案

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

这是一个例子:

你好.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 一致。

关于google-app-engine - 无法使用 "goapp test"更改一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36505538/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com