2016-04-08 10 views
1

Googles AppEngine-Dienst bietet eine möglicherweise konsistente Datenbank für die Speicherung von Anwendungsdaten in der Produktion. Zum Testen stellt Google eine ähnliche Datenbank bereit, die die Konsistenzmerkmale der Produktionsdatenbank emuliert. Die Testanforderungen können variieren, so dass Google dem Testserver dev_appserver.py Befehlszeilenparameter zur Verfügung stellt, die die Konsistenzeigenschaften ändern, die zum Testen benötigt werden.Konsistenz kann mit "goapp test" nicht geändert werden

Ich verwende die goapp Tools, um unsere automatisierte Testumgebung für meine AppEngine-Entwicklung auszuführen. goapp test ist verantwortlich für die Durchführung unserer automatisierten Server-API-Tests. goapp test scheint im Gegensatz zu dev_appserver.py keine Möglichkeit zu bieten, die Konsistenz des Datenspeichers über die Befehlszeilenparameter festzulegen, auch wenn goapp test irgendwann während des Testvorgangs dev_appserver.py gestartet wird.

Gibt es eine Möglichkeit, die Befehlszeilenparameter von goapp test an dev_appserver.py zu übergeben? Falls nicht, gibt es eine alternative Methode, um die Konsistenz über die Befehlszeile festzulegen?

Antwort

0

Ich nehme an, Sie verwenden die aetest package. Wenn dies der Fall ist, sollten Sie die StronglyConsistentDatastore member of the aetest.Options struct entsprechend einstellen. Hier

ein Beispiel:

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) 
    } 
} 

Wie Sie die Go-Tools erwähnt lediglich wickeln dev_appserver.py. Das bedeutet, dass, wenn Sie nicht aetest verwenden Sie immer Ihre Anwendung mit einer ausgewählten Konsistenz Politik wie so laufen können:

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

+0

Ich habe gehofft, dass es eine Möglichkeit war, möglicherweise ohne Papiere, die Konsistenz zu setzen von 'goapp 'Befehlszeile, ohne auf eine neue Instanz im Code zurückzugreifen. Ihre Antwort bedeutet, dass es keinen Weg gibt, oder zumindest ist Ihnen nicht bewusst, wie Sie dies tun können. Gibt es einen alternativen Weg, um die gleichen Enden von der 'goapp' Befehlszeile zu erreichen? –

Verwandte Themen