TDD

13 views
Skip to first unread message

Valentin Starck

unread,
Oct 3, 2011, 1:21:26 PM10/3/11
to javascript-es
Enciendo la polémica. Alguno de uds trabaja/trabajo bajo esta
metodología? Es realmente ventajosa?

Juan Ignacio Dopazo

unread,
Oct 3, 2011, 1:26:38 PM10/3/11
to javasc...@googlegroups.com
/10/3 Valentin Starck <valenti...@gmail.com>

Enciendo la polémica. Alguno de uds trabaja/trabajo bajo esta
metodología? Es realmente ventajosa?

Yo escribo tests, pero no para todo. Donde trabajo realmente no se hace en ningun equipo y no se valora. 

Hay cosas para las que es evidente que sirven y otras para las que es necesario. SI estas escribiendo una libreria es practicamente imposible hacerlo sin tests. Si no cubris mas casos que los que estas implementando, tarde o temprano algo va a fallar en la libreria. Para otras cosas no es tan necesario.

Por otra parte, hay formas de trabajo que lo requieren. Si trabajàs como GitHub haciendo continuous integration, de manera que todo lo que mandas al trunk se publica, si no haces que tu sistema de deploy requiera que se pasen tests antes de publicar... es un peligro.

Juan

Valentin Starck

unread,
Oct 4, 2011, 6:49:59 AM10/4/11
to javasc...@googlegroups.com
Pero TDD no solo implica respetar la rutina de tests sino desarrollar 'al revés', primero el test y luego el código.

Realmente no me termina de convencer...

Juan Ignacio Dopazo

unread,
Oct 4, 2011, 8:53:52 AM10/4/11
to javasc...@googlegroups.com
Sep, a mi tambien me suena a transtorno obsesivo-compulsivo. Supongo que serà cuestion de probar.

Juan

2011/10/4 Valentin Starck <valenti...@gmail.com>

joseanpg

unread,
Oct 5, 2011, 9:27:59 AM10/5/11
to javascript-es
Sinceramente pienso que el *desarrollo dirigido por tests* es un
intento más de alcanzar la panacea "robótica" en el mundo del
software.

jneira

unread,
Oct 13, 2011, 5:38:29 PM10/13/11
to javasc...@googlegroups.com
Pues yo estoy haciendo un aplicacion en grails (con groovy como lenguaje) y estoy intentando hacerla siguiendo todo lo posible tdd/bdd, de arriba a abajo y de "afuera" (el frontend) hacia "dentro" (servicios y datos). Los tests funcionales del front end con pruebas automatizadas para todos los navegadores con webdriver y hacia dentro usando bdd.. Os pongo un par de ejemplos:

Test funcional:

def "Proceso: filtrado parcial de los elementos del listado"(){
        given:"Estamos en la pagina del inventario"
            to InventarioPage
        and: "Al consultar sin informar el filtro nos lista algun elemento"
            def numElemsDefault=listado.elementos.size()
            assert numElemsDefault > 0
        when: "Informarmos los campos del filtrado y pinchamos en consultar"
            filtro.rellenar(data)
            filtro.consultar.click()
        then: "EL numero de elementos filtrados tiene que ser igual o menor"
            listado.elementos.size() <= numElemsDefault
        where: data << getFormData()           
}

y otro unitario:

def "Recuperacion de los envases por su ubicacion mas reciente"() {
        given: "Un lote previo con envases que han cambiado de ubicacion"
            def previo=save(entidadValida)
            def todosEnvases=addEnvases(previo)
            def todosEnvasesPorNumero=todosEnvases.groupBy {it.numero}
            assert todosEnvasesPorNumero.values().any {it.size>1}
        when: "Recuperamos los envases en la ubicacion mas reciente"
            def envasesEnUltimaUbicacion=previo.getEnvasesEnUltimaUbicacion().groupBy {it.numero}
        then: "Estaran todos los envases"
            todosEnvasesPorNumero.keySet()==envasesEnUltimaUbicacion.keySet()
        and: "Solo habra un envase por numero"
            envasesEnUltimaUbicacion.values().every {it.size==1}
        and: "Contendra el envase con la fecha de entrada en la ubicacion mas reciente"
            todosEnvasesPorNumero.each {k,v->
                assert envasesEnUltimaUbicacion[k][0]== v.max {it.fechaEntradaUbicacion}
            }
    }

No se que os parece el estilo bdd pero tiene la ventaja que te sirve de documentacion del codigo.
En cuanto a la valoracion de que me ha aportado y que no, lo dejo para otro momento que debo retirarme

Valentin Starck

unread,
Oct 13, 2011, 7:03:23 PM10/13/11
to javasc...@googlegroups.com
Esperare el feedback.

Realmente se me complica pensar en como integraría estas metodologías en mi trabajo diario ya que practicamente trabajo sin requerimiento y sobre un proyecto mitad legacy/mitad desarrollo nuevo.

Para mi proximo proyecto voy a tratar de usar TDD.

2011/10/13 jneira <atrey...@gmail.com>



--
Valentin Starck
blog.aijoona.com

Juan Ignacio Dopazo

unread,
Oct 13, 2011, 8:07:53 PM10/13/11
to javasc...@googlegroups.com


On Thursday, October 13, 2011, Valentin Starck <valenti...@gmail.com> wrote:
> Esperare el feedback.
"

+1

Yo sigo sin estar convencido. Reconozco l valor de los tests. Hoy escribí uno. Pero de ahí a TDD...

Empece una librería chiquita para armar scripts de build en Node http://github.com/juandopazo/glue. Todavia no escribí tests porque realmente no tenia idea de como quería que quede entonces primero experimenté. Ahora que tengo una idea voy a escribir tests y veré como evoluciona.


Juan

gnz/vnk

unread,
Oct 14, 2011, 2:38:53 AM10/14/11
to javasc...@googlegroups.com
A mi BDD me parece interesante... con ciertas matizaciones que ahora
comentaré. Pero en general, TDD como metodología personal, en que tú
mismo vas y defines unos tests y desarrollas a partir de ellos (dicho
así muy resumidamente) me parece igual de válido y de peligroso que
otras varias metodologías.

Me explico. Es muy muy fácil aplicar el *proceso* de TDD y sentir una
sensación de seguridad que no se corresponde ni mucho menos con la
realidad. Y sí, sí, también se puede hacer /bien/, no lo dudo. Pero he
visto muchos que se suponen experimentados, que conocen bien la
metodología, que llevan tiempo aplicándola o incluso explicándola, y
que caen en problemas (imho graves) de seguridad injustificada y
fragilidad real. Porque aplicar el *proceso* es, como decía, muy
fácil. Pero a la vez, es muy fácil aplicarlo sin ir más allá del
proceso en sí. Me puedo hacer un test, pasarlo, otro, pasarlo, otro,
pasarlo, etc, y terminar teniendo un 50% de tests completamente
innecesarios y una implementación que sigue siendo frágil.


Por otra parte, veo BDD más interesante. Por un lado me parece subir
un nivel de abstracción y pasar a, como dice Javier, diseñar más bien
una documentación o una especificación. Es más, me gustaría más BDD si
además se le añadiera la práctica de que esa especificación sea como
mínimo, "revisable" por cualquiera (i.e. una persona que no programa)
y sirviera de /contrato/. Que fuera el documento sobre el que se
negocia la funcionalidad (aunque quizá no fuera el único).

Es decir, que no me importaría reunirme con el
cliente/responsable/jefe/loquesea y usar esto (o algo de este estilo)
como guía:

def "Proceso: filtrado parcial de los elementos del listado"(){
given:"Estamos en la pagina del inventario"

and: "Al consultar sin informar el filtro nos lista algun elemento"

when: "Informarmos los campos del filtrado y pinchamos en consultar"

then: "El numero de elementos filtrados tiene que ser igual o menor"
}

De cualquier modo, y a modo de aviso sobre mi postura sobre algunos
temas, para que nos vayamos conociendo xD:
Yo tiendo a ser (al menos en mi cabeza) más artístico que ingeniero.
Hay toda una serie de metodologías y procesos que, simplemente, veo ir
pasando ante mi con los años pero muy pocos los veo que /duren/. Esto
no quiere decir que no aprecie practicar algunas *disciplinas
personales*, por supuesto. Pero en general, lo que nunca apreciaré es
ningún proceso, metodología o práctica, que se base en una aplicación
rígida y estricta de un principio o una serie de reglas sin más.

jneira

unread,
Oct 15, 2011, 10:12:14 AM10/15/11
to javasc...@googlegroups.com
En mi caso he intentado plasmar un documento previo de analisis "clasico" en los tests y me ha servido para tener que leerlo y entenderlo/aclararlo/modificarlo con mi analista funcional. Aunque finalmente no he utilizado los tests para esa comunicacion su objetivo es ese. Hay toda una subcultura dentro de lo "agil" que tiene que ver con eso que llman "especificacion por ejmplos":
- http://fitnesse.org/FitNesse.UserGuide.OneMinuteDescription
- http://martinfowler.com/bliki/SpecificationByExample.html

jneira

unread,
Oct 15, 2011, 4:36:50 PM10/15/11
to javasc...@googlegroups.com
Siendo breve y a partir de mi unica experiencia usando tdd/bdd:
  1. No es suficientemente agil cuando estas explorando, ya sea las herramientas que tienes por debajo o las diferentes posibilidades de diseño e implementacion de un componente, modulo o fragmento de codigo. Inevitablemente, aunque empezara haciendo primero los tests en cuanto llegas a un terreno no conocido te tiras a la consola o al cambio dinamico de la aplicacion en ejecucion o a rapidos scripts de usar y tirar.
  2. No te guia por arte de magia a hacer mejor codigo. Eso lo tengo clarisimo. Puede ayudarte y acompañar a las ideas o principios con los que te sientas a picar pero solo por hacer tests esos principios no van a aparecer en tu mente. No consigue hacer surgir un diseño de la nada aunque puede ayudar, de la misma manera que escribir una idea te ayuda a darle forma, mejorarla y rechazarla si no vale (aunque tambien empeorarla)
  3. Muchas veces supone una violacion flagrante del DRY ya que duplicas aunque sea en parte la logica del codigo real que estas probando. Si no tienes cuidado es todavia peor y te pasas mas tiempo cambiando los tests para que se adecuen al nuevo codigo que escribiendolo (suponiendo que ya no estas haciendo los tests primero). Esto hasta cierto punto es inevitable (por ejemplo con el cambio de nombres de vars o funs) pero se pueden hacer de forma que se evite lo maximo posible. 
  4. Los tests no evitan 1, que la aplicacion no haga lo que tiene que hacer y 2, que tenga errores, ya que los tests dependen, obviamente, de los datos de entrada y de qué se comprueba en la salida y se puede fallar en ambas partes con lo que el test no hace bien su trabajo. Entonces el codigo real se convierte en el codigo que testea a los tests y la cosa se pone un poco kafkiana.
Tambien tiene su parte buena que muchos se encargan de repetir y adornar: tienes cierta seguridad de que tienes cubierto una parte de los posibles errores que pueda tener tu codigo y te sirve para que puedas hacer modificaciones y añadir nuevos componentes con la seguridad de que, si los tests siguen en verde el codigo anterior tiene la misma posibilidad (o poco menos) de fallar que antes de lo cambios. Nada mas y nada menos

Reply all
Reply to author
Forward
0 new messages