2010-03-18 21 views
12

Programa principalmente en scala y java, usando scalatest en scala y junit para pruebas unitarias. Me gustaría aplicar las mismas pruebas a varias implementaciones de la misma interfaz/rasgo. La idea es verificar que se haga cumplir el contrato de interfaz y verificar el principio de sustitución de Liskov.Unidad probando varias implementaciones del mismo rasgo/interfaz

Por ejemplo, cuando se prueba implementaciones de listas, pruebas podrían incluir:

  • Una instancia debe estar vacía, si y sólo si y sólo si tiene tamaño cero.
  • Después de llamar a clear, el tamaño debe ser cero.
  • Al agregar un elemento en el medio de una lista, se incrementará en uno el índice de elementos rhs.
  • etc.

¿Cuáles son las mejores prácticas?

Respuesta

6

Parece que podría ser un trabajo para pruebas compartidas. Las pruebas compartidas son pruebas que comparten los diferentes objetos de dispositivo. Es decir, el mismo código de prueba se ejecuta en datos diferentes. ScalaTest tiene soporte para eso. Busque "pruebas compartidas" en la documentación de su rasgo de estilo favorito que representa las pruebas como funciones (Spec, WordSpec, FunSuite, FlatSpec, etc.). Un ejemplo es la sintaxis para FlatSpec:

it should behave like emptyList

Ver Sharing Tests en la documentación FlatSpec

4

Las pruebas de contrato son fáciles de hacer con JUnit 4, here es un video de Ben Rady.

+0

¡Genial! ¿Funciona esta técnica también con Scalatest? – paradigmatic

+0

Lo sentimos, no hay pista :) – abyx

+0

Acabo de probar con Scalatest y parece funcionar. Gracias. – paradigmatic

8

En Java/JUnit, generalmente lo manejo teniendo un testcase abstracto del cual las pruebas para la clase de prueba específica heredan todas las pruebas y tengo un método de instalación que ejemplifica la implementación. No puedo ver el video abyx publicado en este momento, pero sospecho que es esta idea general.

Otra posibilidad interesante si no te importa presentar otro marco de pruebas sería utilizar las clases de especificación JDave.

No he intentado utilizar ninguno de estos con Scalatest o con los rasgos e implementaciones de Scala, pero debería ser posible hacer algo similar.

0

Para Scala, considerar seriamente ScalaCheck. Todos esos contratos se pueden expresar como especificaciones de una sola línea en ScalaCheck. Cuando se ejecuta, ScalaCheck generará una cantidad configurable de entradas de muestra de forma aleatoria y verificará que se cumplan todas las especificaciones. Se trata de la forma semánticamente más densa posible para crear pruebas unitarias.

Cuestiones relacionadas