¿Vale la pena el RSpec y el pepino?

12

Sé que la mayoría de los programadores de RoR están probando adictos y entiendo las ventajas de un conjunto de pruebas de gran tamaño, pero cuando empiezo a probar, nunca obtengo un conjunto tan grande y siempre me pregunto "¿Estoy probando de la manera correcta? ¿Hay realmente eficiente?". A menudo me enfrento a pruebas de integración que prueban solo el comportamiento de la aplicación.

Primero, ¿realmente vale la pena la prueba? Quiero decir, ¿realmente vale la pena el tiempo dedicado a escribir exámenes?

Luego, uso RSpec, recientemente descubrí Cucumber, lo usé por un tiempo, pero no sé si realmente vale la pena escribir todos estos pasos. Sé que puedo reutilizar los pasos, pero nunca sé si estos pasos están demasiado completos o no: por ejemplo, he estado usando un Given I am logged in as (.+)pero no sé si debo decir en su definición Given there's a user called $1porque puede duplicar al usuario si alguna vez se creó pero eso no vale la pena tener siempre un paso antes Given I am logged in as (.+). Es bastante código que rara vez será útil. Supongo que no hay nuevos errores en las piezas que se prueban todos los días ... Entonces, ¿realmente vale la pena Cucumber en comparación con RSpec?

Cydonia7
fuente

Respuestas:

13

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.

sevenseacat
fuente
Esto fue realmente útil para mí. Pero tengo una pregunta más: comencé un proyecto usando RSpec para probar tanto los controladores como las vistas, el código está cubierto en un 90% con pruebas. ¿Crees que realmente necesito pepino y paso tiempo escribiendo pasos y escenarios ahora? Quiero decir, puedo hacer todo eso con RSpec de todos modos.
Cydonia7
@Skydreamer: Probablemente no sea necesario, pero podría ser una buena práctica. Mientras hagas las pruebas, estás en el camino correcto :)
sevenseacat
10

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.

David Weiser
fuente
2
+1 aunque hablando por experiencia, "entrar en el swing de TDD" es un esfuerzo hercúleo en sí mismo y muy difícil de hacer para la mayoría de los desarrolladores.
Wayne Molina
@Wayne M: De acuerdo. Entrar en el ritmo de TDD es difícil, pero los beneficios son enormes. :)
David Weiser
Es difícil decirlo a la ligera ... he estado tratando de entenderlo :)
Wayne Molina
Oh sí, vale la pena el esfuerzo.
sevenseacat
2

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.

Jack Kinsella
fuente
2
Puedo decir con bastante seguridad que no estoy de acuerdo con cada uno de sus puntos sobre las pruebas de pepino. * No interrumpe los buenos editores de texto (mi gedit lo resaltará y lo completará automáticamente), * no debería copiar ninguna configuración de prueba de su configuración Rspec existente a su configuración de Pepino (los dos conjuntos de prueba se ejecutan en niveles muy diferentes de granularidad), * si no puede ser coherente al nombrar sus páginas, eso no es culpa de Cucumber (Rails no le permitirá llamar a rutas diferentes en diferentes días, entonces ¿por qué debería Cucumber?) (continuará)
sevenseacat
1
* ¿Dices cuál es la convención sobre los archivos de pasos pero luego dices que no sabes dónde buscar para seguir la convención? ¿Por qué promocionar una publicación no se encuentra en post_steps.rb? * No se supone que sus funciones sean código, por lo que la palabrería es irrelevante: sus funciones son documentación sobre cómo se comporta su aplicación; * Y, por último, solo puedo criticar 'desalentar la reutilización de código' si lo estás haciendo mal .
sevenseacat
2

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:

Given /^I am logged in$/ do
  visit login_path
  fill_in :name, :with => 'Joe'
  fill_in :password, :with => 'Password'
  click_button 'submit'
end

Prueba de características de RSpec:

feature 'Given the user is logged in' do
      visit login_path
      fill_in :name, :with => 'Joe'
      fill_in :password, :with => 'Password'
      click_link_or_button 'submit'
end

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.

Sankalp Singha
fuente
0

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:

  • Si desea hacer TDD / BDD usted mismo o su equipo -> pruebe RSpec
  • Si desea una mejor manera de comunicarse con las empresas con Historias de usuario y escenarios -> pruebe pepino
  • Si desea documentación en vivo de las características de su sistema -> pruebe pepino.

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

AlfredoCasado
fuente