2011-08-10 14 views
6

¿Puedo tener dependencias entre las especificaciones de scalaTest de modo que si una prueba falla, todas las pruebas que dependen de ella se saltan?hay un mecanismo scalaTest similar a TestNg Anotación dependsOnMethods

+0

Una de las reglas importantes de la prueba es la siguiente: Las pruebas no deben depender unos de otros. (No tengo idea de si es posible tener dependencias en ScalaTest) – agilesteel

+3

No deberían, pero a veces la configuración de una prueba es tan cara que no se puede evitar. En otras ocasiones, prueba sistemas externos para asegurarse de que se comporten como se acordó. Si una primera prueba prueba la disponibilidad de un sistema falla, no hay necesidad de probar los detalles. –

+6

Es posiblemente una regla importante de "pruebas unitarias" pero las pruebas dependientes son muy útiles para las pruebas funcionales, por varias razones (reutilización del estado costoso, informes precisos, evitación de burlas, etc.). –

Respuesta

0

No conozco una solución preparada. Pero puedes escribir fácilmente tus propios accesorios.

consulte "Redacción características del dispositivo apilables" en el javadoc de la Suite trait

Tal dispositivo podría, por ejemplo, sustituir todas las ejecuciones de prueba después de la primera con llamadas a pending

3

No añadí esa característica de TestNG porque en ese momento no tenía ningún caso de uso convincente para justificarlo. Desde entonces, he recopilado algunos casos de uso y estoy agregando una función a la próxima versión de ScalaTest para abordarla. Pero no serán pruebas dependientes, solo una forma de "cancelar" una prueba basada en una precondición no satisfecha.

Mientras tanto, lo que puede hacer es simplemente usar declaraciones Scala if para registrar solo las pruebas si se cumple la condición, o para registrarlas como ignoradas si prefiere verlas en salida. Si está utilizando Spec, que sería algo como:

if (databaseIsAvailable) { 
    it("should do something that requires the database") { 
    // ... 
    } 
    it ("should do something else that requires the database") { 
    } 
} 

Esto sólo funcionará si se cumple la condición de seguro en el momento de la construcción de pruebas. Si se supone que la base de datos, por ejemplo, debe iniciarse mediante un método beforeAll, tal vez, entonces necesitaría hacer el control dentro de cada prueba. Y en ese caso, podría decir que está pendiente. Algo como:

it("should do something that requires the database") { 
    if (!databaseIsAvailable) pending 
    // ... 
} 
it("should do something else that requires the database") { 
    if (!databaseIsAvailable) pending 
    // ... 
} 
+0

Después de leer el scaladoc, todavía no veo cómo establezco las condiciones previas. Precisamente, ¿cómo configuro una condición cuando una prueba tiene éxito para que otras suites puedan hacer referencia a ella? – user44242

+0

No puedo encontrar ninguna referencia a esa característica aún, por casualidad, ¿se ha implementado esto? –

+0

Creo que la característica a la que se refiere Bill es 'assume (Boolean)'. Si la suposición falla, una prueba se muestra como cancelada. Esto es con ScalaTest 2.2.1. – akauppi

1

Aquí hay un rasgo de Scala que hace que todas las pruebas en el conjunto de pruebas fallen, si falla alguna prueba.
(Gracias por la sugerencia, Jens Schauder (que ha publicado otra respuesta a esta pregunta).)

Pros: Simple de entender las dependencias de la prueba.
Contras: No muy personalizable.

Lo uso para mis pruebas automáticas del navegador. Si algo falla, generalmente no tiene sentido continuar interactuando con la GUI ya que está en un estado "desordenado".

Licencia: Dominio público (CC0 de Creative Common), o (a su opción) la licencia de MIT.

import org.scalatest.{Suite, SuiteMixin} 
import scala.util.control.NonFatal 


/** 
* If one test fails, then this traits cancels all remaining tests. 
*/ 
trait CancelAllOnFirstFailure extends SuiteMixin { 
    self: Suite => 

    private var anyFailure = false 

    abstract override def withFixture(test: NoArgTest) { 
    if (anyFailure) { 
     cancel 
    } 
    else try { 
     super.withFixture(test) 
    } 
    catch { 
     case ex: TestPendingException => 
     throw ex 
     case NonFatal(t: Throwable) => 
     anyFailure = true 
     throw t 
    } 
    } 
} 
0

Puede utilizar rasgo org.scalatest.CancelAfterFailure para cancelar pruebas restantes después del primer fracaso:

import org.scalatest._ 

class MySpec extends FunSuite with CancelAfterFailure { 
    test("successfull test") { 
    succeed 
    } 

    test("failed test") { 
    assert(1 == 0) 
    } 

    test("this test and all others will be cancelled") { 
    // ... 
    } 
} 
Cuestiones relacionadas