Testing en Scala (I)

Uno de los elementos de los que no hemos hablado hasta ahora, y que sin embargo resulta de los más importantes en el día a día, son los frameworks de testing en Scala.

Aunque la integración con la JVM permite el uso de frameworks de testing basados en Java, como puede ser JUnit, nosotros destacamos dos, basados en Scala: Scalatest y Scalacheck.

Veréis que no hay que ser ningún experto para poder hacer uso de ellos:

En este post nos centraremos en el primero de ellos.

ScalaTest

Versátil framework de testing que permite testear tanto código en Java como en Scala. Notable además por su integración con herramientas como JUnit, TestNG, Ant, Maven, sbt, ScalaCheck, JMock, EasyMock, Mockito, ScalaMock, Selenium (automatización de pruebas con el browser), …

Te recomendamos los siguientes pasos para empezar a usar ScalaTest:

0. Crea tu deslumbrante clase de dominio.

case class Foo(n: Int){
  def +(m: Int): Foo = Foo(n+m)
  def -(m: Int): Foo = Foo(n-m)
}

1. Añade la dependencia de Scalatest a tu proyecto SBT.

libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.4" % "test"

…o el equivalente en Maven:

<dependency>
  <groupId>org.scalatest</groupId>
  <artifactId>scalatest_2.11</artifactId>
  <version>2.2.4</version>
  <scope>test</scope>
</dependency>

2. Elige tu estilo de testing favorito…y crea una base class para testing.

Scalatest ofrece distintos estilos de testing: tests basados en propiedades (PropSpec), basado en lenguaje más descriptivo, y por tanto más restrictivo (WordSpec), sencillas (FunSpec), …
Para este ejemplo seleccionaremos un estilo de testing bastante legible como puede ser FlatSpec.
Es recomendable definir una base class que aglutine todos los traits que vamos a usar para nuestros tests, de manera que podamos reutilizar dicha base class sin tener que repetir código:

abstract class MyTestClass(
  entityToTest: String) extends FlatSpec
  with Matchers {

  behavior of entityToTest

}

La línea

behavior of entityToTest

establece el nombre del comportamiento que estamos definiendo en nuestra clase de test. Sobretodo, se debe a una cuestión de pretty-printing.

Si además extendemos del trait Matchers, podremos expresar aserciones a cumplir como:

val n = 2
n should equal(1+1)
n should be(3-1)
n must be(0+2)
//...

3. Define el test para tu clase de dominio.

Iremos definiendo los casos de prueba como sigue:

class FooTest extends MyTestClass("A Foo") {

  it should "add some value to its attribute N" in {
    val myFoo = Foo(0)
    (myFoo + 2) should equal(Foo(2))
    val anotherFoo = Foo(5)
    (anotherFoo + 3) should equal(Foo(8))
  }

  it should "substract some value to N" in {
    val myFoo = Foo(3)
    (myFoo - 2) should equal(Foo(1))
    (Foo(0) - 5) should equal(Foo(-5))
  }

}

Fijaros que las definiciones de los casos de prueba son suficientemente descriptivas y aportan una gran facilidad para comprender el comportamiento de Foo solo con leerlas.

4. Lanza el test

Desde SBT:

test

El output deberá mostrar algo similar a:

Discovery starting.
Discovery completed in 34 milliseconds.
Run starting. Expected test count is: 2
FooTest:
A Foo
- should add some value to its attribute N
- should substract some value to N
Run completed in 61 milliseconds.
Total number of tests run: 2
Suites: completed 1, aborted 0
Tests: succeeded 2, failed 0, canceled 0, ignored 0, pending 0
All tests passed.

5. Farda ante tus amigos

b784c8abf46a00e87ee8365535645ba0

thisPost.isAwesome should be(true)
Anuncios

One thought on “Testing en Scala (I)

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s