Maison >développement back-end >Golang >Comment puis-je tester de manière fiable les requêtes de banque de données dans Google App Engine ?

Comment puis-je tester de manière fiable les requêtes de banque de données dans Google App Engine ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-07 15:46:15663parcourir

How Can I Reliably Test Datastore Queries in Google App Engine?

Test des requêtes sur la banque de données Google App Engine

Pour tenter d'éviter les entités en double dans la banque de données, vous rencontrez des difficultés pour tester une requête fonction qui doit garantir l’unicité. Bien que la fonction fonctionne correctement dans l'application, les tests échouent à plusieurs reprises.

Après avoir étudié le problème, il a été déterminé que l'accès aux données de la banque de données via des requêtes n'est pas possible dans le contexte des tests. Cette incapacité vient du fait que les transactions Datastore ne sont pas validées immédiatement, ce qui entraîne des résultats de requête incohérents.

En introduisant un délai d'au moins 100 ms entre les opérations datastore.Put() et q.GetAll() dans le cas de test fourni, les tests réussiront. En effet, le délai permet de valider la transaction, garantissant ainsi la cohérence des données.

Pour garantir une forte cohérence sans compter sur des retards, vous pouvez utiliser l'option StronglyConsistentDatastore: true lors de la création du contexte de test. Ce faisant, toutes les requêtes seront fortement cohérentes, garantissant que les données sont immédiatement accessibles après les opérations d'écriture.

Voici une version mise à jour de votre scénario de test utilisant l'option StronglyConsistentDatastore :

type Entity struct {
    Value string
}

func TestEntityQuery(t *testing.T) {
    c, err := aetest.NewContext(nil)
    if err != nil {
        t.Fatal(err)
    }
    defer c.Close()

    c.StronglyConsistentDatastore = true

    key := datastore.NewIncompleteKey(c, "Entity", nil)
    key, err = datastore.Put(c, key, &Entity{Value: "test"})
    if err != nil {
        t.Fatal(err)
    }

    q := datastore.NewQuery("Entity").Filter("Value =", "test")
    var entities []Entity
    keys, err := q.GetAll(c, &entities)
    if err != nil {
        t.Fatal(err)
    }
    if len(keys) == 0 {
        t.Error("No keys found in query")
    }
    if len(entities) == 0 {
        t.Error("No entities found in query")
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn