Allez Fakedb Émulation de base de données dans les tests

L'autre jour, j'ai écrit des tests pour un module qui interagit avec une base de données. Je ne voulais pas lier le module de test à cette base de données - cela crée des exigences supplémentaires pour l'environnement dans lequel les tests seront effectués. Je ne voulais pas créer des instances de type sql.Rows avec les plaques nécessaires à la fois - pour moi, ce type est une «boîte noire», et je voudrais qu'il en soit ainsi. La recherche sur le sujet n'a également rien trouvé d'intéressant.


Je voulais partager ma découverte avec la communauté: dans la distribution principale de Go, il existe un outil presque prêt pour de tels besoins: FakeDb.


Que peut faire cet outil?


En substance, il s'agit de la base de données la plus simple, mais entièrement fonctionnelle en tant qu'objet DB, capable de créer des tables, de les remplir et d'en faire de simples échantillons. Toutes les tables créées sont temporaires et existent tant que l'instance FakeDb existe. De plus, l'émulation de retard lors de l'appel d'une commande et une exception d'émulation sont disponibles.


Commandes FakeDb


Les commandes se composent de phrases séparées par une barre verticale - |. Une phrase est soit un mot-clé, soit une expression de la forme "clé = valeur". Où clé est le nom de la colonne.


Essuyer
La commande détruit les tables et renvoie un résultat vide. De plus, il s'agit de vérifier qu'il n'y a pas de blocage.
Exemple d'appel:
WIPE


CRÉER
La commande crée une table avec les colonnes spécifiées du type spécifié.


Format d'appel:


CREATE|_|1=,...,N=


Types pris en charge:


  • bool
  • nullbool - booléen ou null
  • int32
  • chaîne
  • nullstring - chaîne ou NULL
  • int64
  • nullint64 - int64 ou NULL
  • float64
  • nullfloat64 - float64 ou NULL
  • datetime
  • any - interface vide, c'est-à-dire n'importe quel type

Exemple d'appel:


CREATE|people|name=string,age=int32,photo=any,dead=bool,bdate=datetime


INSÉRER
La commande ajoute des lignes à la table créée.


Format d'appel:
INSERT|_|1=,...,N
Ci-après, la valeur peut être définie de trois manières:


  1. Spécifiez explicitement une valeur, par exemple 123 .
  2. Indiquez "?", Et passez la valeur comme paramètre.
  3. Spécifiez "? Nom_paramètre" et transmettez la valeur au paramètre nommé.

Exemple d'appel:


INSERT|people|name=Alice,age=?,photo=?photo


SELECT
La commande vous permet de sélectionner soit toutes les lignes du tableau, soit avec une sélection.
Format d'appel:


 SELECT|_|1,...,N| SELECT|_|1,...,N|1=?,...,M 

Exemple d'appel:


 SELECT|categories|category_id,category_parent_id,category_name| SELECT|categories|category_id,category_parent_id,category_name|category_parent_id=?parent 

Le résultat est une instance à part entière de sql.Rows.


ATTENDRE
Simule un retard dans l'exécution d'une commande. Doit être ajouté avant l'une des commandes ci-dessus.
Format d'appel:
WAIT||


Le retard est indiqué sous la forme d'une quantité et d'un suffixe indiquant une unité de mesure: s - secondes, n - nanosecondes, u - microsecondes, h - heures, etc. (la fonction time.ParseDuration () est utilisée).


Exemple d'appel:
WAIT|1s|SELECT|categories|category_id,category_parent_id,category_name|


Panique
Lève une exception lors de l'appel d'une commande.
Format d'appel:
PANIC|_|


La valeur de MethodName sera placée dans le champ stmt.panic (tapez fakeStmt).


Exemple d'appel:
PANIC|blablabla|SELECT|categories|category_id,category_parent_id,category_name|


Utiliser


FakeDb a été créé pour tester le package "sql" de la livraison principale en tant que script de test . Je ne l'ai pas trouvé dans un emballage séparé. Par conséquent, je l'ai sélectionné moi-même dans un package et l' ai placé ici: gihub .


Des modifications mineures ont été nécessaires pour mettre en évidence le package.


Exemple d'utilisation


 package packname import ( "fmt" "testing" "io/ioutil" "database/sql" "github.com/a1div0/fakedb" ) func TestFoo(t *testing.T) { fc := &fakedb.FakeConnector{ } db := sql.OpenDB(fc) if db.Driver() != fakedb.Fdriver { t.Error("OpenDB should return the driver of the Connector") return } if _, err := db.Exec("WIPE"); err != nil { t.Error("exec wipe: %v", err) } defer db.Close() db.Exec("CREATE|users|user_email=string,user_id=int64") db.Exec("INSERT|users|user_email=?,user_id=?", "test@email.com", 345) rows, err := db.Query( "SELECT|users|user_id|user_email=?email", sql.Named("email", user_email), ) if err != nil { t.Error(err) } result, err := Foo(rows) //   if err != nil { t.Error(err) } if result != 123 { t.Error(" ,   Foo()   ;)") } } 

Merci de votre attention.


PS: Veuillez écrire dans les commentaires - utilisez-vous l'émulation de base de données dans les tests? Si oui, quel paquet?

Source: https://habr.com/ru/post/fr485280/


All Articles