Mi 'ah-ha!' Llegaron momentos sobre las pruebas en Ruby and Rails cuando realmente me senté y leí los recursos definitivos sobre el tema, los libros Rspec y Cucumber . Compartí tu desdén inicial de Pepino, pero luego me di cuenta de que estaba mirando la imagen desde un ángulo bastante equivocado.
Básicamente, Cucumber se trata de BDD (desarrollo impulsado por el comportamiento): usted usa Cucumber para planificar sus características, en lo que va a trabajar a continuación. Hmm, luego quieres que los usuarios puedan promocionar publicaciones en un foro o algo así (para robar un ejemplo;)) Entonces escribes algo simple.
Given I am logged in
And I can see the post "BDD is awesome"
When I vote the post up
Then the post should have one more vote
And the page should show a message thanking me for my vote.
Tenga en cuenta que no hay referencias a nada de código relacionado allí más o menos. Eso viene en tus pasos. Cuando refactorice su código, es posible que tenga que cambiar sus definiciones de pasos, pero el comportamiento (su característica) nunca tendrá que cambiar.
Ahora, cada vez que ejecute su función Cucumber, se le guiará a través de cómo probar la función usando TDD (desarrollo impulsado por pruebas). Esto se hace en un nivel inferior usando RSpec.
Primera ejecución: la definición de mi primer paso no está definida. Copie el bloque para definirlo en say user_steps.rb o incluso session_steps.rb porque se relaciona con los usuarios y sus sesiones. Ahora, ¿cómo define que un usuario ha iniciado sesión? Puede llevarlos a través del proceso de inicio de sesión.
Given /^I am logged in$/ do
visit login_path
fill_in :name, :with => 'Joe'
fill_in :password, :with => 'Password'
click_button 'submit'
end
Debería estar todo feliz. Segundo paso.
Given /^I can see the post "(.+)"$/ do |name|
visit post_path(Post.find_by_name(name))
end
De nuevo bastante fácil. Tenga en cuenta que si rehacemos totalmente nuestro proceso de inicio de sesión, o cómo se definen y muestran nuestras publicaciones, no tenemos que cambiar el comportamiento. Tercer paso.
When /^I vote the post up$/ do
pending
end
Aquí es donde está comenzando a hablar sobre la nueva funcionalidad, pero aún no sabe cómo va a funcionar. ¿Cómo se vota una publicación? Puede hacer clic en una imagen de un +1 o algo, que hace una publicación ajax en un controlador, que devuelve JSON, o algo así. Así que ahora puedes pasar a las pruebas Rspec puras.
- Pruebe su vista para asegurarse de que se muestre la imagen +1,
- Pruebe su controlador para que se comporte correctamente cuando reciba una solicitud ajax dada del formato correcto (tanto las rutas felices como las infelices: ¿qué sucede si se recibe una ID de publicación no válida? ¿Qué sucede si el usuario ha usado sus 25 votos a favor en un día? ¿Incrementa el número de votos correctamente?)
- Pruebe su javascript para que responda correctamente cuando se le da un blob de JSON en el formato correcto (¿actualiza la imagen +1 para mostrar que se ha utilizado? (Pensando en Google+ aquí ...) ¿Muestra el mensaje de agradecimiento? Etc. )
Todo esto no afecta el comportamiento, pero cuando haya terminado de lidiar con las pruebas de nivel inferior, será trivial completar la definición de paso para votar una publicación. Puede ser tan simple como click_link '+1'
. Y el resto de los pasos son resultados de pruebas, lo que nuevamente debería ser sencillo de hacer. Y cuando haya terminado, entonces sabrá que su función está completa y terminada. Si el comportamiento necesario cambia, puede modificar su función, de lo contrario puede modificar su código de implementación con total seguridad.
Espero que esto tenga sentido. Todo ha estado fuera de mi alcance, pero creo que demuestra la diferencia entre BDD y TDD, y por qué Cucumber y RSpec satisfacen diferentes necesidades.
La prueba, en mi opinión, es un arte. Hacer TDD (usando RSpec o cualquier otro marco) inicialmente se siente como si estuvieras "perdiendo el tiempo". Esto es comprensible porque no está escribiendo ningún código de producción.
Sin embargo, comienza a ver el beneficio de TDD cuando necesita mejorar su base de código mientras se asegura de que todo lo demás siga funcionando. TDD te ayuda a detectar los errores de regresión lo antes posible. Hacer esto me ha ahorrado días de trabajo porque tenía pruebas enfocadas que señalaban mis errores.
Además, tener pruebas puede ser beneficioso para las revisiones de código porque su revisor puede ver qué escenarios está probando y cómo se debe usar su código.
Una vez que entras en el ritmo de TDD, hacer cualquier otra cosa se siente mal.
fuente
Mi opinión es que tienes razón en el frente de Pepino. Escribir todos esos pasos es un gran problema, y los beneficios no justifican el dolor. He escrito extensamente sobre las seis desventajas de usar Pepino aquí: ¿Por qué molestarse con las pruebas de pepino?
Las pruebas unitarias y las pruebas de integración periódicas, realizadas con Rspec o Test :: Unit tienen mucho sentido, pero afortunadamente son mucho más rápidas de escribir que las pruebas de Cucumber. Por un lado, puedes usar Ruby puro en lugar de tener que luchar contra la sintaxis vergonzosa y extraña de Gherkin.
fuente
Lo que personalmente creo es eso
RSpec testing is a definite must
. Digamos, por ejemplo, que desea escribir una nueva característica, y que también tiene referencia a alguna otra característica, y esa característica podría ser referenciada con algún otro módulo o método. Entonces, ¿cómo puede asegurarse de que lo que está escribiendo no está rompiendo ninguna otra parte de la aplicación?Suponga que tiene una aplicación grande y que ha codificado algo trivial en comparación con la aplicación general, ¿volverá a probar la aplicación completa haciendo clic en cada enlace de la aplicación para asegurarse de que funciona cada vez que cambie una sola línea de código?
Sin embargo, creo que las pruebas de pepino no son imprescindibles. Creo que las pruebas de integración que usan RSpec tienen más sentido hasta y a menos que tenga que hacer que su cliente verifique las pruebas. Lo que en mi experiencia es RARO. Si su equipo se compone completamente de desarrolladores, creo que debería reemplazar los pasos de Cucumber para las pruebas de características de RSpec. Y creo que después del RSpec 3 DSL, las pruebas son bastante legibles.
Ej:
Definición del paso del pepino:
Prueba de características de RSpec:
Creo que, en lugar de tener funciones de pepino, las funciones de RSpec hacen lo mismo sin el dolor de cabeza adicional de escribir definiciones de otro paso.
Aparte de eso, también es puramente su propia preferencia.
Espero que esto pueda ayudarte a entender un poco.
fuente
En mi opinión, lo primero es diferenciar entre prácticas y marcos concretos. Pepino no es BDD, RSpec no es TDD.
Si desea probar su sistema RSpec es una buena herramienta, puede hacer TDD o BDD con RSpec, de hecho, TDD y BDD son lo mismo. Alguien dice "BDD su TDD está bien hecho" y estoy totalmente de acuerdo con eso, BDD se trata principalmente de probar características / comportamientos en lugar de probar métodos / clases. De hecho, el TDD que Kent Beck describe se trata de características, pero BDD ayuda a mucha gente a comprender esta diferencia clave y es una gran contribución de Dan North a la comunidad de desarrollo.
Use Pepino si cree que necesita una herramienta mejor para comunicarse con la gente de negocios, por ejemplo, si el pepino permite que la gente de negocios o el propietario del Producto ayuden al equipo a escribir o revisar escenarios. A otras personas les gusta el pepino porque estos escenarios son una muy buena documentación en vivo de un sistema, si cree que necesita este tipo de documentación, pruebe el pepino.
En resumen:
Por supuesto, los dos últimos tienen un alto costo asociado, debe evaluar si realmente lo necesita y vale la pena el esfuerzo, esto, por supuesto, depende totalmente de su proyecto y su entorno y la decisión depende de usted.
Pero recuerde siempre que RSpec y Cucumber son solo herramientas, y las herramientas resuelven problemas concretos, ¿qué problema desea resolver ?, hágase esta pregunta y probablemente esté en una mejor posición para seleccionar la herramienta adecuada. Ser un mejor programador se trata de tomar estas decisiones, no de usar X o Y framework / tool / library / technology
fuente