Maison >développement back-end >Golang >Comment interroger de manière fiable les entités de banque de données dans les tests Google App Engine ?

Comment interroger de manière fiable les entités de banque de données dans les tests Google App Engine ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-07 08:49:13569parcourir

How to Reliably Query Datastore Entities in Google App Engine Tests?

Interrogation des entités de la banque de données dans les tests Google App Engine

Lors du test du code qui exploite les capacités de requête de la banque de données, les développeurs peuvent rencontrer des échecs malgré les implémentations fonctionnelles au sein la demande. Cet écart résulte de la nature finalement cohérente de la plupart des requêtes du Datastore.

Dans le code fourni, une entité est insérée dans le Datastore à l'aide de la méthode Put(), suivie d'une requête pour la récupérer à l'aide de GetAll(). Cependant, la requête ne renvoie aucun résultat en raison de la simulation de latence imposée par le Datastore. Pour résoudre ce problème, deux approches peuvent être adoptées :

  1. Introduire un délai : introduire un court délai (par exemple, 100 ms) entre les opérations Put() et GetAll() pour permettre le Datastore pour propager l'entité insérée.
  2. Utiliser Fortement Cohérent Datastore : configurez l'environnement de test pour utiliser une banque de données fortement cohérente en définissant l'option StronglyConsistentDatastore sur true dans le contexte de test. Cela garantit que les requêtes reflètent immédiatement les entités récemment insérées.

Exemple (banque de données fortement cohérente) :

import (
    "context"

    "cloud.google.com/go/datastore"
    "github.com/GoogleCloudPlatform/go-cloud-testing-gce"
)

func TestEntityQueryStronglyConsistent(t *testing.T) {
    ctx := context.Background()
    c, err := aetest.NewContext(ctx, aetest.Options{
        StronglyConsistentDatastore: true,
    })
    if err != nil {
        t.Fatal(err)
    }
    defer c.Close()

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

En utilisant l'une ou l'autre approche, les tests peuvent refléter avec précision le comportement des requêtes dans l'environnement de production.

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