Estoy tratando de crear un test unitario a un método que hace un
insert en la BD.
Me gustaría saber cual es vuestra opinión respecto al uso de esto.
¿Usáis algún tipo de assert para saber si el método se ejecuta
correctamente?, o ¿por otro lado hacéis un select para comprobar que
dicho valor se ha insertado?.
Gracias.
--
--
Saludos cordiales.
Pablo.
Si lo reenvías, ten la precaución de borrar los datos de procedencia que
encabezarían tu reenvío – empezando por mi dirección de correo
electrónico - . Coloca siempre las direcciones de tus contactos en el
campo <CCO> para que viajen discretas, no en el campo <Para> ni en
el<CC>. De esa forma nadie que lo reciba tendrá constancia de las señas
de los demás destinatarios a los que también se remite. Todo ello a fin
de evitar que nadie se aproveche de todas las direcciones que se van
acumulando al pasar de buzón a buzón para el lanzamiento de correo
basura y otras indeseadas lindezas. Aparte claro está de garantizar la
privacidad.
--
Has recibido este mensaje porque estás suscrito al grupo "agile-spain" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a agile...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a agile-spain...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/agile-spain?hl=es.
El día 1 de agosto de 2011 16:41, Alfredo Casado
<casado....@gmail.com> escribió:
La razon por la que mockeo con test unitarios, es que quiero que
corran muy rapido y que se puedan ejecutar sin connexiones a otros
servidores. Que pueda estar en el tren con el portatil y correr todos
mis tests.
Personalmente prefiero hacer test de integracion que se ejecutan razonablemente rapido para guiar la esritura del código de acceso a datos. Por ejemplo si escribo mal una query es mucho más rápido detectarlo mediante estos test que mediante test end to end.
Claro que puede dependender de muchas cosas, como si usas un motor ORM o no. Lo que desde luego no le recomendaría ni a mi peor enemigo es mockear APIs como JDBC jeje.
Hombre, repetibles deberían ser todos los test, sean del tipo que sean, porque sino el señor Jenkins se me enfadaría aleatoriamente.
Da gusto.
Eso si, ni robert martin personificado me convence de mockear JDBC, antes me quito la pulsera verde :P
Pues no creáis que a veces es tan facil esa distinción entre test unitario/integración/funcional. Un ejemplo, si dentro de una clase A utilizo el soporte del lenguaje (o de las librerías core del lenguaje) para por ejemplo trabajar con expresiones regulares ¿ podríamos considerar esto un test unitario si no mockeamos el uso de este motor de expresiones regulares?. Entonces si dentro de una clase A utilizo un api que me da acceso a un repositorio de datos en memoria (no hay un segundo sistema con el que me integre como un servidor de base de datos) ¿que diferencia existe entre el motor de expresiones regulares y un motor de acceso a datos en memoria para que un test le denominemos unitario y al otro no?.
Podríamos discutir sobre esto, ¿pero pa que?, ¿que importancia tiene?, por eso decía que mejor que nos fijemos en que comportamiento estamos implementando, y por supuesto también en características como la rapidez del test o la repetibilidad, y usemos las herramientas que mejor se adapten según el caso. No siempre las distinciones son tan claras ni se pueden poner reglas inamovibles.
De hecho si tu clase en cuestión depende de un motor de expresiones regulares (como en el caso de Java) seria mas limpio extraer la funcionalidad de esa expresión a su propia clase y testarla por separado.Supongamos que hago eso (que me parece perfecto), entonces tengo una clase donde su única responsabilidad es encapsular el motor de ER y ofrecer un interfaz que me guste más o encaje más con mi negocio al resto de mis clases, por ejemplo supongamos que tengo una clase para "sanear" cadenas eliminando ciertos caracteres especiales:
public class Saneador {public String limpiaYDaEsplendor(final String cadenaSucia) {return motorDeJavaDeER.aplicarER("una ER que sirva para quitar caracteres especiales");}
}
Esta clase no tiene ninguna responsabilidad más que sanear una cadena, incluso podría hacerlo sin usar ER. LLegados a este punto ¿tiene realmente interés mockear el motorDeJavaDeER?.
No quiero esperar a un test funcional para saber que escribo bien la expresión regular y que he llamado en el orden correcto a los métodos/objetos que tengo que usar el motor de ER, como soy muy olvidadizo nunca me acuerdo de como se hacen estas cosas y hacer un test con mocks primero que se limite a comprobar que llamo al motor con la ER que yo creo que es la correcta no me esta aportando en realidad gran cosa.
Pues con JDBC o acceso a datos yo lo veo muy similar, si tengo clases cuya única responsabilidad es hacer una query al motor de bd recoger los resultados y meterlos en un Value Object ¿le veis realmente valor a mockear las llamadas a JDBC para escribir esta clase?.
¿las collections las mockeais también? :P
On Aug 2, 2011, at 10:21 AM, Alfredo Casado wrote:De hecho si tu clase en cuestión depende de un motor de expresiones regulares (como en el caso de Java) seria mas limpio extraer la funcionalidad de esa expresión a su propia clase y testarla por separado.Supongamos que hago eso (que me parece perfecto), entonces tengo una clase donde su única responsabilidad es encapsular el motor de ER y ofrecer un interfaz que me guste más o encaje más con mi negocio al resto de mis clases, por ejemplo supongamos que tengo una clase para "sanear" cadenas eliminando ciertos caracteres especiales:
public class Saneador {public String limpiaYDaEsplendor(final String cadenaSucia) {return motorDeJavaDeER.aplicarER("una ER que sirva para quitar caracteres especiales");}
}
Esta clase no tiene ninguna responsabilidad más que sanear una cadena, incluso podría hacerlo sin usar ER. LLegados a este punto ¿tiene realmente interés mockear el motorDeJavaDeER?.SiNo quiero esperar a un test funcional para saber que escribo bien la expresión regular y que he llamado en el orden correcto a los métodos/objetos que tengo que usar el motor de ER, como soy muy olvidadizo nunca me acuerdo de como se hacen estas cosas y hacer un test con mocks primero que se limite a comprobar que llamo al motor con la ER que yo creo que es la correcta no me esta aportando en realidad gran cosa.De hecho tendrías tests unitarios para tu Saneador que asegurarían que la clase Saneador funciona como es debido.En los tests funcionales no escribirías ningún double ya que estas testando el comportamiento de la aplicación en su totalidad (i.e. con todos los componentes que la componen).
El martes 2 de agosto de 2011 10:48:22 UTC+2, Enrique Comba Riepenhausen escribió:En los tests funcionales no escribirías ningún double ya que estas testando el comportamiento de la aplicación en su totalidad (i.e. con todos los componentes que la componen).¿Entonces esos test unitarios, Mockearian la funcionalidad del motor de ER de Java?
public class Saneador {public String limpiaYDaEsplendor(final String cadenaSucia) {
return motorDeJavaDeER.aplicarER("una ER que sirva para quitar caracteres especiales", cadenaSucia);}}
A ver si te entiendo bien enrique, con la clase de antespublic class Saneador {public String limpiaYDaEsplendor(final String cadenaSucia) {return motorDeJavaDeER.aplicarER("una ER que sirva para quitar caracteres especiales", cadenaSucia);}}Puedo hacer un test con mocks más o menos así:MotorDeJavaDeER motorER = mock(....)Saneador saneador = new Saneador(motorER);saneador.limpiaYDaEsplendor("cadena sucia");verify(motorER).aplicarER("una ER que sirva....", "cadena sucia")y luego podría hacer un test que compruebe si la clase tiene el comportamiento esperado, aunque para esto necesite instanciar un motor de ER real:Saneador saneador = new Saneador (new MotorDeERDeJava());assertThat(saneador.limpiaYDaEsplendor("cadena sucia"), is("cadena limpia"));¿Tu cual de estos harías?, ¿los dos?, ¿el primero o el segundo?Yo sólo haría el segundo, al primero no veo que me este aportando mucho, no me sirve para comprobar que la ER esta bien y además si en el futuro quiero cambiar esta ER por otra más optima pero que haga lo mismo el test me va a fallar.
> Hola!
> Aunque puede ser necesario en alguna ocasion hacer esto, (por ejemplo
> con legacy), yo prefiero encapsular las llamadas a terceros en clases
> mias, y estas son las que reemplazo con dobles en los tests.
> Estoy seguro que tu tambien lo haces así pero quería expresarlo para
> quienes no están habituados a los dobles de test.
Correcto :)
>
Enrique Comba Riepenhausen
.:: Software Craftsman ::.
http://ecomba.org
twitter: @ecomba
Skype: ecomba
--typos by apple