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
?如果没有,是否有另一种方法可以从命令行设置一致性?
答案 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 .