DB & Unit testing

1 view
Skip to first unread message

Israel

unread,
Feb 27, 2018, 3:17:45 PM2/27/18
to improve-...@googlegroups.com
Hola grupo.

Estoy haciendo un API y a la hora de probarlo he usado un metodo que no se si es el mas adecuado en estos escenarios, quisiera saber que piensan?

La idea es que el API genera un query dinamico a la base de datos, dinamico porque existen varios filtros que puede recibir el API y el SQL se construye dinamicamente, despues se envia al server y se toma el resultado y se aplican ciertas agrupaciones, se hacen calculos, en algunos metodos se devuelve los datos agrupandolos, etc, hay varios metodos, pero el flujo casi siempre es de esa forma.

Lo que estoy haciendo es replicando un set de datos en SQLLite (que se guarda en un archivo) y corriendo varios unit testings sobre este (como si fuera el repositorio de SQL server) hasta ahora todos los queries son compatibles (sintaxis) 

He leido que existe una herramienta de Redgate para hacer unit test en SQL pero eso es mas para probar stored procedures y vistas, no tiene sentido en mi caso porque el query se genera desde c# basado en los filtros que recibe el metodo. 

Al principio estaba probando una parte de la funcionalidad haciendo un mock de los datos, pero hay otra parte que no podia probar que es "que el query se construya bien" y que devuelva los resultados esperados aplicando los filtros.

Se que muchos me van a decir que lo que estoy haciendo es un integration test, OK... puede ser visto asi tambien, pero incluso la parte de enviar al SQL y evaluar el resultado para mi eso es un unit testing tambien no?

Ideas?

Saludos
Israel. 

Erlis Vidal

unread,
Feb 27, 2018, 3:34:30 PM2/27/18
to improve-...@googlegroups.com
Hola Israel,

Con respecto a la herramienta de Redgate, lo unico que Redgate te da es un GUI encima de esto: http://tsqlt.org/ que es un Open Source que he usado para probar desde la base de datos.

Como funcionatSqlt? Pues instalas en tu server una seria de stored procedures (estan en el schema tsqlt) y con ellos tienes acceso a Asserting methods y a algunos helpers que son bien utiles. Estoy pensando que pudieras usar esto si el SQL lo ejecutas desde un stored procedure, desde ahi tambien puedes hacer un sql dinamico.

Una de las formas que mas he usado tSqlt is usando el FakeTable stored procedure. Mira aqui el ejemplo 2. http://tsqlt.org/user-guide/tsqlt-tutorial/

Redgate lo que te da es un UI encima de todo esto pero no necesitas Redgate para usarlo...

Lo que haces esta bien a mi entender pues como dices el sql lo generas desde c#, yo hubiera escrito un stored proc que generara el query dinamico y bueno tambien pudieras ejecutar los stored procedures desde c# sin necesidad alguna de usar tSqlt.

A mi entender donde tSqlt brilla es para quitarte de encima dependencias pues a veces para hacer el data setup tienes que insertar dato en 20 tablas que no necesitas pero por las dependencias tienes que insertar una Orden, un customer, un product cuando lo que quieres probar solo necesita usar OrderLine, FakeTable se encarga de crear una table OrderLine que es, ... bueno fake, que no tiene constraints ni relaciones, renombra la tabla original y todo esto dentro de una transaccion, al final del test, todo vuelve a ser como antes. Esta es la mayor ventaja que veo a tSqlt, si no necesito este complicado setup, pues hago los tests desde C#

No se si repondi tu pregunta.
Salu2
Erlis

--

---
Has recibido este mensaje porque estás suscrito al grupo "Improve your code" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a improve-your-code+unsubscribe@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Israel

unread,
Feb 27, 2018, 4:32:47 PM2/27/18
to improve-...@googlegroups.com
Tu respuesta, me hizo leer un poco mas sobre tSqlt, por otro lado tu dices meter la logica de hacer el query dinamico dentro del stored procedure... uff.

Darién García Nieves

unread,
Feb 27, 2018, 5:25:13 PM2/27/18
to improve-...@googlegroups.com
Israel, no sé si te sirva. Pero échale un vistazo a esto. Saludos

Erlis Vidal

unread,
Feb 27, 2018, 5:35:38 PM2/27/18
to improve-...@googlegroups.com
En SQL, el query como se ejecuta?

'select X, Y from Table where column = 1'

o lo haces con sp_executesql?

exec sp_executesql N'select X, Y from Table where column = @1'

            ,N'@1 int'

            ,@value


ambos son dinamicos pero hay algunas diferencias importantes, una es el poder usar los cache query plans.

cada una de estas queries va a tener un diferente query plan

'select X, Y from Table where column = 1'
'select X, Y from Table where column = 2'
'select X, Y from Table where column = 11'
'select X, Y from Table where column = 10'
'select X, Y from Table where column = 112'

vs

un solo plan para

exec sp_executesql N'select X, Y from Table where column = @1'

            ,N'@1 int'

            ,@value


no importa cuantos valores diferentes pases.


La otra cosa en que ayuda sp_executesql es con Sql Injection pero creo que debes haber visto ya esto.

Reply all
Reply to author
Forward
0 new messages