unit true test matchers lists flatspec failure exceptions example scala scalatest

true - Hacer algo antes o después de todas las pruebas Scalatest



scalatest suite (3)

Tengo un conjunto de pruebas scalatest que prueban diferentes puntos finales de una API RESTful. Realmente los quiero separados en diferentes archivos para una mejor organización.

Mi problema es cómo iniciar algo (un servidor HTTP en mi caso, pero no importa de qué se trata) antes de todas las pruebas y cerrarlo después de que se hayan realizado todas las pruebas.

Sé de BeforeAndAfterAll, pero eso solo logra antes / después dentro de un archivo de prueba. Necesito algo así, pero para todas las pruebas, por ejemplo:

- Inicie el servidor http antes de las pruebas
- ejecutar todas las suites de prueba
- cerrar servidor http


Alternativamente, puedes usar un objeto.

object TestServer { startServer() }

Cuando acceda al objeto, se inicializará, iniciando el servidor. Simplemente cree un rasgo común en el cuerpo del que accede al objeto. Luego mezcle ese rasgo en todas sus pruebas. Hecho.

Si su servidor se ejecuta en modo daemon (por ejemplo, una aplicación Play! En modo de prueba) se apagará automáticamente después de que se ejecuten todas las pruebas.


Ok, encontré un camino. Parece (a menos que alguien aquí pueda corregirme) que Scalatest no tiene la capacidad de una suite "maestra". Pero ... puedes construir una.

Puede componer un conjunto de rasgos. Entonces, usando mi ejemplo de punto final:

class EndpointTests extends FunSpec with MustMatchers with BeforeAndAfterAll with Foo with Bar { override def beforeAll(configMap: Map[String, Any]) { println("Before!") // start up your web server or whatever } override def afterAll(configMap: Map[String, Any]) { println("After!") // shut down the web server } }

Ok, pero ¿y las pruebas? Observe el con Foo con Bar . Traigo las pruebas dependientes como rasgos. Mira aquí:

trait Foo extends FunSpec with MustMatchers { describe("Message here...") { it("Must do something") { } it("Must be ok") { } } } trait Bar extends FunSpec with MustMatchers { describe("Hello you...") { it("One more!") { } } }


La forma prevista de hacerlo es usar suites anidadas. Suite tiene un método nestedSuites que devuelve IndexedSeq [Suite] (en 2.0, en 1.9.1 era una lista [Suite]). Suite también tiene un método runNestedSuites que es responsable de ejecutar cualquier suite anidada. De forma predeterminada, runNestedSuites llama a nestedSuites, y en cada suite devuelta invoca ejecutar directamente, o si se pasa un distribuidor, coloca las suites anidadas en el distribuidor para que puedan ejecutarse en paralelo.

Entonces, lo que realmente desea hacer es convertir Foo y Bar en clases y devolver instancias de ellas desde el método nestedSuites de EndpointTests. Hay una clase que hace que sea fácil llamar Suites. Aquí hay un ejemplo de su uso:

import org.scalatest._ import matchers.MustMatchers class Foo extends FunSpec with MustMatchers { describe("Message here...") { it("Must do something") { } it("Must be ok") { } } } class Bar extends FunSpec with MustMatchers { describe("Hello you...") { it("One more!") { } } } class EndpointTests extends Suites(new Foo, new Bar) with BeforeAndAfterAll { override def beforeAll(configMap: Map[String, Any]) { println("Before!") // start up your web server or whatever } override def afterAll(configMap: Map[String, Any]) { println("After!") // shut down the web server } }

Sin embargo, un posible problema es que si está utilizando el descubrimiento para encontrar suites para ejecutar, se descubrirán las tres pruebas EndpointTests, Foo y Bar. En ScalaTest 2.0 puede anotar Foo y Bar con @DoNotDiscover, y ScalaTest''s Runner no los descubrirá. Pero sbt todavía lo hará. Actualmente estamos mejorando sbt para que pase a través de Suites que de otra manera serían detectables y que están anotadas con DoNotDiscover, pero esto estará en sbt 0.13, que aún no ha salido. Mientras tanto, puedes obtener sbt para ignorarlos agregando un parámetro constructor no utilizado a Foo y Bar.