簡體   English   中英

使用“goapp test”無法更改一致性

[英]Cannot change consistency using “goapp test”

Google的AppEngine服務提供了一個最終一致的數據庫,用於存儲生產中的應用程序數據。 為了進行測試,Google提供了一個類似的數據庫,可以模擬生產數據庫的一致性特征。 測試要求可能會有所不同,因此Google會向其測試服務器dev_appserver.py提供命令行參數,以便根據測試需要修改一致性特征。

我正在使用goapp工具來運行我的AppEngine開發的自動化測試環境。 goapp test負責運行我們的自動服務器API測試。 dev_appserver.py不同, goapp test似乎沒有辦法通過命令行參數設置數據存儲的一致性級別,即使goapp test在測試過程中的某個時刻啟動了dev_appserver.py

有沒有辦法從goapp test將命令行參數傳遞給dev_appserver.py 如果沒有,是否有另一種方法可以從命令行設置一致性?

我認為你正在使用aetest包 如果是這種情況,則應相應地設置aetest.Options結構StronglyConsistentDatastore成員

這是一個例子:

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 .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM