scala - implícito - Cómo ejecutar especificaciones secuencialmente
ejemplos de implícito y explícito (3)
Quiero crear algunas especificaciones que interactúen con la base de datos.
class DocumentSpec extends mutable.Specification with BeforeAfterExample {
sequential
def before() = {createDB()}
def after() = {dropDB()}
// examples
// ...
}
La base de datos se crea y elimina antes y después de cada ejemplo (que se ejecuta de forma secuencial). Everithing funciona como se espera hasta que solo haya una especificación que funcione con la base de datos. Debido a que las especificaciones se ejecutan en paralelo, interfieren y fallan.
Espero poder evitar esto al dar instrucciones a specs2 para que realicen pruebas con efectos secundarios de forma secuencial, mientras que las pruebas sin efectos secundarios se ejecuten en paralelo. ¿Es posible?
Mientras tanto hay una mejor solución ( http://www.scala-sbt.org/release/docs/Parallel-Execution.html ):
sbt 0.12.0 introduce una infraestructura general para restringir la concurrencia de tareas más allá de las declaraciones de pedido habituales.
Esta configuración ejecutará todas las pruebas secuenciales, también si están en subproyectos:
concurrentRestrictions in Global := Seq(
Tags.limit(Tags.CPU, 2),
Tags.limit(Tags.Network, 10),
Tags.limit(Tags.Test, 1),
Tags.limitAll( 15 )
)
No he probado si esto puede ser reemplazado por cada subproyecto, por lo que el subproyecto puede ejecutar sus pruebas en paralelo.
Si desea ejecutar una sola Especificación en especs2 secuencialmente, simplemente agregue sequential
llamada de método sequential
al comienzo de su Especificación. Por ejemplo:
class MyTest extends Specification {
// Set sequential execution
sequential
// This tests will be executed sequentially
"my test" should {
"add numbers" in {
(1 + 1) should be equalTo 2
}
"multiply numbers" in {
(2 * 2) should be equalTo 4
}
}
}
ACTUALIZACIÓN: Como @jsears mencionó correctamente en los comentarios, ¡esto hará que las pruebas se ejecuten secuencialmente en una sola especificación! Otras especificaciones pueden ejecutarse en paralelo.
Supongo que estás usando SBT? Si es así, consulte la documentación: http://www.scala-sbt.org/release/docs/Detailed-Topics/Parallel-Execution
La configuración SBT relevante es la ejecución parallelExecution
. Agregue esto a la definición de su proyecto:
parallelExecution in Test := false