¿Cuál es la diferencia entre frameworks de pruebas unitarias y ScalaTest Scala especificaciones?

StackOverflow https://stackoverflow.com/questions/2220815

Pregunta

Ambos son BDD (Comportamiento Driven Development) marcos de prueba de unidad capaz de Scala escrito en Scala. Y Especificaciones se basa también puede implicar la ScalaTest marco . Pero, ¿qué Especificaciones ofrecen ScalaTest no? ¿Cuáles son las diferencias?

¿Fue útil?

Solución

Especificaciones y ScalaTest son buenas herramientas con usuarios felices, pero difieren en varios aspectos. Es probable que desee elegir uno como su principal herramienta de pruebas en Scala, pero no tiene por qué renunciar a la otra porque se puede utilizar piezas de ambos. Si te gusta la sintaxis de FeatureSpec ScalaTest y la sintaxis Mockito especificación, por ejemplo, puede poner los dos archivos jar en la ruta de clases y utilizar ambos al mismo tiempo. Aquí voy a tratar de capturar las principales diferencias filosofía de diseño que he notado entre especificaciones y ScalaTest.

Probablemente, la principal diferencia filosófica entre las herramientas es que las especificaciones se ha diseñado para el Desarrollo Comportamiento-Driven (BDD), mientras que ScalaTest es más general. ScalaTest ofrece rasgos que se pueden mezclar entre sí para obtener el comportamiento que usted prefiere en sus clases de prueba, incluyendo TDC, y también se puede definir fácilmente su propio comportamiento si quieres algo diferente.

ScalaTest apoya BDD a través de sus rasgos Spec, FeatureSpec, WordSpec, FlatSpec y GivenWhenThen, y también tiene rasgos que se pueden mezclar para obtener una sintaxis matcher agradable. Si te gusta "debe", que mezcla en ShouldMatchers. Si te gusta "debe", que mezcla en MustMatchers. Pero si te gusta el TDC, pero no le gusta la sintaxis de coincidencias, sólo se puede utilizar uno de los rasgos de especificaciones de ScalaTest sin mezclar en un rasgo comparadores. Especificaciones tiene una clase que extienda la especificación, y se debe utilizar la palabra "debe" en sus expresiones matcher. A diferencia filosófica grande que es evidente aquí es que ScalaTest le da muchas más opciones. Para hacer este espacio de elección más fácil de navegar, proporciono un árbol de decisión aquí:

http://www.scalatest.org/quick_start

La sintaxis matcher también es diferente entre ScalaTest y especificaciones. En ScalaTest Traté de ver hasta dónde podía ir con notación de operadores, y terminó con expresiones matcher que leen mucho a las oraciones en inglés, con espacios entre las palabras. Especificaciones matcher sintaxis corre más palabras juntas con el caso de camellos.

Especificaciones tiene más comparadores que ScalaTest, y que creo que refleja una diferencia en la actitud de diseño. De hecho, me corté probablemente 2/3 de la sintaxis de coincidencias he construido y considerados para la liberación. Voy a añadir más comparadores en futuras versiones, pero quería estar segura de que sabía usuarios realmente querían algo antes de lo añadí. Sin embargo comparadores de ScalaTest incluye una sintaxis de coincidencias propiedad dinámica ocupa algo de esa holgura. Por ejemplo, en Espec se puede escribir en un java.io.File:

file must beDirectory

Esto invocará el isDirectory y asegurarse de que es cierto. ScalaTest no tiene ningún comparadores especiales para java.io.Files actualmente, pero en ScalaTest, es posible que utilices una comprobación dinámica de la siguiente manera:

file must be a ('directory)

Cada vez que pasa un símbolo después de be, utilizará la reflexión a buscar (en este caso) un método o campo denominado directory o una isDirectory método llamado. También hay una manera de hacer este estática, mediante la definición de un BePropertyMatcher (que requiere sólo 2 o 3 líneas de código por lo general). Así que, básicamente, en ScalaTest Trato de ofrecer una mayor funcionalidad con menos API.

Otra diferencia entre la actitud general de diseño y especificaciones ScalaTest implica conversiones implícitas. Por defecto se obtiene sólo una conversión implícita cuando se utiliza ScalaTest, que es el que pone el operador === en todo. (Si es necesario, se puede "apagar" esta conversión implícita con una línea de código. La única razón por la que tendría que hacer es decir si estaban tratando de probar algo que tiene su propio operador ===, y se obtiene un conflicto .) ScalaTest define muchas otras conversiones implícitas, sino para usarlos de forma explícita que necesita para "invitar" a ellos en su código mezclando en un rasgo o hacer una importación. Cuando se extiende la clase Specification en especificaciones creo que más o menos obtener decenas de conversiones implícitas por defecto. No estoy seguro de cuánto que importará en la práctica, pero calculo gente va a querer poner a prueba el código que utiliza sus propios implícitos, y en ocasiones puede haber un conflicto entre implícitos del marco de pruebas y los del código de producción. Cuando eso sucede, creo que puede ser más fácil de solucionar el problema en ScalaTest de especificaciones.

Otra diferencia en la actitud de diseño que he notado es la comodidad con los operadores. Uno de los objetivos que tenía era que cualquier programador mirar el código de prueba de otra persona que utiliza ScalaTest sería capaz de adivinar cuál es el significado era sin mirar nada en la documentación ScalaTest. Quería código de cliente ScalaTest que se cayera muerto obvio. Una manera en que se manifestó objetivo es que ScalaTest es muy conservadora en cuanto a los operadores. Yo sólo definen cinco operadores en ScalaTest:

  • ===, lo que significa iguales
  • >, lo que significa mayor que
  • <, menos de
  • >=, mayor que o igual
  • <=, menor o igual.

Eso es todo. Así que estas cosas más o menos se parecen a lo que quiere decir. Si ve en el código de otra persona:

result should be <= 7

Mi esperanza es que usted no tendrá que correr a la documentación de la API de adivinar lo que significa que <=. Por el contrario, las especificaciones es mucho más libre con los operadores. No hay nada malo con eso, pero es una diferencia. Los operadores pueden hacer el código más conciso, pero la desventaja es que pueden tener que correr a la documentación cuando encuentre cosas como ->-, >>, |, |>, ! o ^^^ (que todas tienen un significado especial en Especificaciones) en el código de prueba de su colega .

Otra diferencia filosófica es que yo trato de hacer es sólo un poco más fácil en ScalaTest utilizar un estilo funcional cuando se necesita para compartir un accesorio, mientras Especificaciones por defecto continúa la tradición del enfoque setUp y tearDown popularizado por JUnit, en el que reasigna VARs antes de cada prueba. Sin embargo, si desea probar esa manera, también es muy fácil en ScalaTest. Sólo tiene que mezclar en el rasgo BeforeAndAfter.

Para obtener una visión más clara ScalaTest, se puede ver el "Obtener Superior con ScalaTest" presentación que hice en la conferencia de 2009 Devoxx aquí:

http://parleys.com/play/514892260364bc17fc56bde3/chapter0/about

Otros consejos

Las diferencias principales son (en su mayoría a partir de un punto de vista :-) especificaciones):

  • ScalaTest proporciona más "estilos de pruebas" de las especificaciones (se puede visitar cada punto de bala en la inicio rápido para obtener una vista detallada de cada estilo)

  • ScalaTest y especificaciones tienen un conjunto diferente de comparadores. Puede compararlos aquí para ScalaTest y < a href = "http://code.google.com/p/specs/wiki/MatchersGuide" rel = "noreferrer"> aquí para las especificaciones. En ese lado de las cosas, las especificaciones tiene una gran cantidad de pequeñas características que usted puede tener gusto al escribir su especificación XML: comparadores, igualadores de composición (una forma fácil de reutilizar comparadores transformándolas), fallos precisos, las diferencias detalladas de cadenas largas, .. .

  • Mockito se le ha dado un buen apoyo en BDD especificaciones: Mockito

  • DataTables que permiten agrupar una gran cantidad de pequeño ejemplo en una especie de mesa (si puedes soportar los operadores se utiliza como delimitadores de mesa)

  • En las especificaciones, puede definir ejemplos que están anidados como libitum y automáticamente limpiado arriba en todos los niveles

Esto es ciertamente una comparación muy parcial y sesgada y existen muchas otras diferencias (y las bibliotecas están todavía en evolución, ...).

Al final del día, creo que lo que realmente depende de su estilo de prueba / especificar. Si se trata de simples (estructura simple especificación, configuraciones, expectativas, ...) entonces ambas bibliotecas aparecerán muy similares. De lo contrario, ambos tienen su visión sobre cómo deben hacerse las cosas. Como último ejemplo de esto se puede echar un vistazo a el etiquetado: en ScalaTest y en especificaciones .

Espero que esto ayude.

Por lo que yo sé, salvo algunas características muy especializadas, todo se reduce a la preferencia personal de acuerdo con el estilo.

apoyo IDE puede ser otro punto

He estado tratando de conseguir Especificaciones para trabajar con Eclipse a través de JUnit, y he encontrado la solución oficial a ser un poco "hacky". Especificaciones de configuración: http://code.google.com/p/specs/wiki / RunningSpecs # Run_your_specification_with_JUnit4_in_Eclipse

La integración de ScalaTest (también a través de JUnit) con parece un poco menos hacky. Aún así, no tengo ninguna de ellas para trabajar, así como JUnit y Java.

configuración ScalaTest: http: // grupos. google.com/group/scalatest-users/web/running-scalatest-from-eclipse

Si un factor de decisión es el tiempo de compilación, scalatest parece tener un mejor desempeño.

Actualmente estamos utilizando specs2 en nuestro proyecto, pero sufren de lento tiempos de compilación en las pruebas. Acabo de terminar un POC en mover a scalatest y vi compilan veces caen en un factor de aproximadamente 0,82 simplemente cambiando los marcos 2 en algunas de nuestras fuentes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top