Maison >développement back-end >Golang >Comment créer des tests unitaires pour le stockage de données en mémoire ?
L'éditeur PHP Xiaoxin vous présentera comment créer des tests unitaires pour le stockage de données en mémoire. Pendant le processus de développement, les tests unitaires sont l’un des moyens importants pour garantir la qualité du code et l’exactitude fonctionnelle. Pour le stockage des données en mémoire, nous pouvons utiliser des frameworks de test tels que PHPUnit pour écrire les cas de test correspondants. Tout d’abord, nous devons créer une classe de test, puis écrire la logique de test appropriée dans la méthode de test. Dans chaque méthode de test, nous pouvons utiliser des assertions pour vérifier que les résultats attendus correspondent aux résultats réels. Grâce à de tels tests unitaires, nous pouvons découvrir et résoudre les problèmes potentiels à temps et améliorer la stabilité et la fiabilité du code.
Je souhaite créer une API de repos simple. J'ai décidé de créer mon propre magasin de données en mémoire pour implémenter une telle interface :
type datastore interface { add(*element) error get(elementid) (*element, error) update(*element) error delete(elementid) error getall() []*element }
type datastore struct { mu sync.mutex bucket map[string]*element }
func newdb() *datastore { return &datastore { bucket: make(map[string]*element), } }
Comment doit-il être testé unitairement ?
Certains des tests que j'ai réussi à créer ressemblent à ceci :
func testgetalltodotasks(t *testing.t) { ts := newdb() var elem = &element{fielda : "a" , fieldb : "b"} ts.create(elem) want := []*element{elem} if got := ts.getall(); !reflect.deepequal(got, want) { t.errorf("got %v wanted %v", got, want) } }
Mais quand je veux tester d'autres méthodes (comme update), je me rends compte que je dois d'abord utiliser create puis update, comme ceci :
func TestUpdateTODOTasks(t *testing.T) { ts := NewDB() var elem = &Element{fieldA : "A" , fieldB : "B"} ts.Create(elem) if err != nil { t.Errorf("=> failed to create: %v", err.Error()) } var updated_elem = &Element{fieldA : "A-updated" , fieldB : "B"} err = ts.Update(updated_elem ) if err != nil { t.Errorf("=> failed to update: %v", err.Error()) } }
Vous pouvez initialiser le mappage sous-jacent en fonction des détails d'implémentation indiquant que le stockage utilise le mappage en coulisse.
En général, vous pouvez vraiment bénéficier des tests comme vous le décrivez. Par conséquent, utilisez l’API définie pour amorcer le stockage à des fins de test. Cela rapproche vos tests de la façon dont les clients utilisent votre code. Pas besoin de modifier manuellement l'état sous-jacent. J'ai vu beaucoup de tests effectués de cette façon, mais ils deviennent généralement impossibles à maintenir et instables.
Ne vous attardez pas trop sur le fait qu’un test unitaire doit vérifier une fonction. En fait, il s'agit davantage de tester de petites parties complètes et autonomes du logiciel, il n'est donc pas nécessaire qu'il s'agisse d'une seule fonctionnalité.
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!