ScalaTest en sbt: ¿hay alguna manera de ejecutar una sola prueba sin etiquetas?

150

Sé que se puede ejecutar una sola prueba ejecutando, en SBT,

testOnly *class -- -n Tag

¿Hay alguna manera de decirle a sbt / scalatest que ejecute una sola prueba sin etiquetas? Por ejemplo:

testOnly *class -- -X 2

significaría "ejecutar la segunda prueba en la clase. Sea lo que sea". Tenemos un montón de pruebas y nadie se molestó en etiquetarlas, entonces, ¿hay alguna forma de ejecutar una sola prueba sin que tenga una etiqueta?

Nacht
fuente
1
Su tema dice "Scalatest-sbt". Cuando sbt está separado por guiones, las personas normalmente piensan en un complemento. Pero, solo para aclarar, está hablando de usar ScalaTest de una versión moderna de sbt como sbt 0.12, no joshcough / scalatest-sbt, un complemento para sbt 0.5.2-p3 escrito hace 4 años. ¿Correcto?
Eugene Yokota
Correcto. Esta es una vieja pregunta y desde entonces he descubierto que no, no es posible (que yo sepa). No lo he cerrado en caso de que alguien haya logrado encontrar una manera, pero ya no necesito que me respondan.
Nacht
Hay un hilo sobre esto (con la participación de Bill Venners y Mark Harrah) en groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM , pero aún no hay solución
Seth Tisue
1
También hay un caso de soporte general para ejecutar una sola prueba sbt # 911 ( github.com/sbt/sbt/issues/911 ).
Eugene Yokota
14
Tenga en cuenta que si se está ejecutando desde la línea de comandos, debe incluir todo sbtentre comillas , por ejemplosbt "test-only *SingleTestSuite"
Chris Martin

Respuestas:

202

Esto ahora es compatible (desde ScalaTest 2.1.3) dentro del modo interactivo:

testOnly *MySuite -- -z foo

ejecutar solo las pruebas cuyo nombre incluye la subcadena "foo".

Para una coincidencia exacta en lugar de una subcadena, use en -tlugar de -z.

Seth Tisue
fuente
@SethTisue ¿Podría publicar un ejemplo de trabajo que utilice -tpara la coincidencia exacta? No puedo hacer que funcione.
rmin
@rmin gist.github.com/SethTisue/f75cd8b72128ba0a0a81 . (si esto le ayuda a solucionar su problema, avíseme cómo debo actualizar mi respuesta).
Seth Tisue
10
Solo para aclarar, si lo ejecuta desde la línea de comandos, debería ser como un argumento único: sbt "testOnly * MySuite - -z foo"
Sogartar
2
En caso de que alguien quiere realizar una prueba de integración específica (supuestamente colocada bajo src/it), tienen que anteponer ita testOnly. Por ejemplo, en la línea de comandos: sbt "it:testOnly *MyIntegrationTestSuite".
laylaylom
2
¿Cómo puedo filtrar en múltiples subcadenas? Las pruebas se pueden agrupar en una jerarquía (WordSpec), y las partes del nombre se pueden separar wheny shouldrepetir entre pruebas. Para elegir una prueba específica, necesito decir "nombre contiene esto Y aquello".
Vituel
98

Quería agregar un ejemplo concreto para acompañar las otras respuestas

Debe especificar el nombre de la clase que desea probar, por lo que si tiene el siguiente proyecto (este es un proyecto de Play):

Proyecto de juego

Puede probar solo las Loginpruebas ejecutando el siguiente comando desde la consola SBT:

test:testOnly *LoginServiceSpec

Si está ejecutando el comando desde fuera de la consola SBT, haría lo siguiente:

sbt "test:testOnly *LoginServiceSpec"
Tyler
fuente
27
Vota porque aparentemente las comillas dobles son necesarias:sbt "test:testOnly *LoginServiceSpec"
Jason Wheeler
55
La respuesta más útil para mí aquí. 👍 Pero los comandos se pueden simplificar ligeramente; en la consola SBT: testOnly *LoginServiceSpecy afuera:sbt "testOnly *LoginServiceSpec"
Jonik
49

No veo una manera de ejecutar una sola prueba sin etiquetar dentro de una clase de prueba, pero estoy proporcionando mi flujo de trabajo, ya que parece ser útil para cualquiera que se encuentre con esta pregunta.

Desde una sesión de sbt:

test:testOnly *YourTestClass

(El asterisco es un comodín, puede especificar la ruta completa com.example.specs.YourTestClass).

Se ejecutarán todas las pruebas dentro de esa clase de prueba. Presumiblemente, usted está más preocupado por las pruebas fallidas, corrija las implementaciones fallidas y luego ejecute:

test:testQuick

... que solo ejecutará pruebas que fallaron. (Repetir el test:testOnlycomando ejecutado más recientemente será el mismo que test:testQuicken este caso, pero si divide sus métodos de prueba en clases de prueba apropiadas, puede usar un comodín para hacer test:testQuickuna forma más eficiente de volver a ejecutar las pruebas fallidas).

Tenga en cuenta que la nomenclatura para la prueba en ScalaTest es una clase de prueba, no un método de prueba específico, por lo que se ejecutan todos los métodos sin etiquetar.

Si tiene demasiados métodos de prueba en una clase de prueba, divídalos en clases separadas o márquelos adecuadamente. (Esto podría ser una señal de que la clase bajo prueba está violando el principio de responsabilidad única y podría usar una refactorización).

cfeduke
fuente
10
para quienes se enfrentan a "No se ejecutaron pruebas": *YourTestClassdebe ser el nombre de la clase. No es el nombre del archivo.
MKatleast3
1
fue testOnly en lugar de test-only para mí.
Jan Clemens Stoffregen
11

Solo para simplificar el ejemplo de Tyler.

test:-prefijo no es necesario.

Entonces según su ejemplo:

En la sbtconsola:

testOnly *LoginServiceSpec

Y en la terminal:

sbt "testOnly *LoginServiceSpec"
pme
fuente
0

Aquí está la página Scalatest sobre el uso del corredor y la discusión extendida sobre las opciones -ty-z .

Esta publicación muestra qué comandos funcionan para un archivo de prueba que utiliza FunSpec.

Aquí está el archivo de prueba:

package com.github.mrpowers.scalatest.example

import org.scalatest.FunSpec

class CardiBSpec extends FunSpec {

  describe("realName") {

    it("returns her birth name") {
      assert(CardiB.realName() === "Belcalis Almanzar")
    }

  }

  describe("iLike") {

    it("works with a single argument") {
      assert(CardiB.iLike("dollars") === "I like dollars")
    }

    it("works with multiple arguments") {
      assert(CardiB.iLike("dollars", "diamonds") === "I like dollars, diamonds")
    }

    it("throws an error if an integer argument is supplied") {
      assertThrows[java.lang.IllegalArgumentException]{
        CardiB.iLike()
      }
    }

    it("does not compile with integer arguments") {
      assertDoesNotCompile("""CardiB.iLike(1, 2, 3)""")
    }

  }

}

Este comando ejecuta las cuatro pruebas en el iLikebloque describe (desde la línea de comando SBT):

testOnly *CardiBSpec -- -z iLike

También puede usar comillas, por lo que esto también funcionará:

testOnly *CardiBSpec -- -z "iLike"

Esto ejecutará una sola prueba:

testOnly *CardiBSpec -- -z "works with multiple arguments"

Esto ejecutará las dos pruebas que comienzan con "funciona con":

testOnly *CardiBSpec -- -z "works with"

No puedo obtener la -topción de ejecutar ninguna prueba en el CardiBSpecarchivo. Este comando no ejecuta ninguna prueba:

testOnly *CardiBSpec -- -t "works with multiple arguments"

Parece que la -topción funciona cuando las pruebas no están anidadas en describebloques. Echemos un vistazo a otro archivo de prueba:

class CalculatorSpec extends FunSpec {
  it("adds two numbers") {
    assert(Calculator.addNumbers(3, 4) === 7)
  }
}

-t se puede usar para ejecutar la prueba individual:

testOnly *CalculatorSpec -- -t "adds two numbers"

-z También se puede utilizar para ejecutar la prueba única:

testOnly *CalculatorSpec -- -z "adds two numbers"

Consulte este repositorio si desea ejecutar estos ejemplos.

Potestades
fuente