Ir Fakedb Emulación de base de datos en pruebas

El otro día escribí pruebas para un módulo que interactúa con una base de datos. No quería vincular el módulo de prueba a esta base de datos; esto crea requisitos adicionales para el entorno donde se realizarán las pruebas. No quería crear instancias de sql. Las filas escriben con las placas necesarias a la vez. Para mí, este tipo es un "recuadro negro", y me gustaría que siga siendo así. La búsqueda sobre el tema tampoco encontró nada interesante.


Quería compartir mi hallazgo con la comunidad: en la distribución principal de Go, hay una herramienta casi lista para tales necesidades: llamada FakeDb.


¿Qué puede hacer esta herramienta?


En esencia, esta es la base de datos más simple, pero completamente funcional como un objeto DB, capaz de crear tablas, llenarlas y hacer muestras simples a partir de ellas. Todas las tablas creadas son temporales y existen mientras exista la instancia FakeDb. Además, la emulación de retraso al invocar un comando y la excepción de emulación están disponibles.


Comandos FakeDb


Los comandos consisten en frases separadas por una barra vertical - |. Una frase es una palabra clave o una expresión de la forma "clave = valor". Donde clave es el nombre de la columna.


Limpiar
El comando destruye las tablas y devuelve un resultado vacío. Además, es una verificación de que no hay punto muerto.
Ejemplo de llamada:
WIPE


CREAR
El comando crea una tabla con las columnas especificadas del tipo especificado.


Formato de llamada:


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


Tipos admitidos:


  • bool
  • nullbool - booleano o nulo
  • int32
  • cuerda
  • nullstring: cadena o NULL
  • int64
  • nullint64 - int64 o NULL
  • float64
  • nullfloat64 - float64 o NULL
  • fecha y hora
  • any: interfaz vacía, es decir, cualquier tipo

Ejemplo de llamada:


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


INSERTAR
El comando agrega filas a la tabla creada.


Formato de llamada:
INSERT|_|1=,...,N
En lo sucesivo, el valor se puede establecer de tres maneras:


  1. Especifique explícitamente un valor, por ejemplo 123 .
  2. Indique "?", Y pase el valor como parámetro.
  3. Especifique "? Parameter_name" y pase el valor al parámetro nombrado.

Ejemplo de llamada:


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


SELECCIONAR
El comando le permite seleccionar todas las filas de la tabla o con alguna selección.
Formato de llamada:


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

Ejemplo de llamada:


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

El resultado es una instancia completa de sql.Rows.


ESPERA
Simula un retraso en la ejecución de un comando. Debe agregarse antes de cualquiera de los comandos anteriores.
Formato de llamada:
WAIT||


El retraso se indica como una cantidad y un postfix que denota una unidad de medida: s - segundos, n - nanosegundos, u - microsegundos, h - horas, etc. (se utiliza la función time.ParseDuration ()).


Ejemplo de llamada:
WAIT|1s|SELECT|categories|category_id,category_parent_id,category_name|


Pánico
Lanza una excepción al invocar un comando.
Formato de llamada:
PANIC|_|


El valor de MethodName se colocará en el campo stmt.panic (escriba fakeStmt).


Ejemplo de llamada:
PANIC|blablabla|SELECT|categories|category_id,category_parent_id,category_name|


Uso


FakeDb fue creado para probar el paquete "sql" de la entrega principal como un script de prueba . No lo encontré en un paquete separado. Por lo tanto, lo seleccioné yo mismo en un paquete y lo coloqué aquí: gihub .


Se requirieron modificaciones menores para resaltar el paquete.


Ejemplo de uso


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

Gracias por su atencion


PD: Por favor escriba en los comentarios: ¿utiliza la emulación de la base de datos en las pruebas? Si es así, ¿qué paquete?

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


All Articles