ScalaTest in sbt: c'è un modo per eseguire un singolo test senza tag?


150

So che un singolo test può essere eseguito eseguendo, in sbt,

testOnly *class -- -n Tag

C'è un modo per dire a sbt / scalatest di eseguire un singolo test senza tag? Per esempio:

testOnly *class -- -X 2

vorrebbe dire "eseguire il secondo test in classe. Qualunque cosa sia". Abbiamo un sacco di test e nessuno si è preso la briga di taggarli, quindi c'è un modo per eseguire un singolo test senza che abbia un tag?


1
Il tuo soggetto dice "Scalatest-sbt". Quando sbt è sillabato, le persone normalmente pensano a un plugin. Ma, solo per chiarire, stai parlando di usare ScalaTest da una versione moderna di sbt come sbt 0.12, non joshcough / scalatest-sbt un plugin per sbt 0.5.2-p3 scritto 4 anni fa. Corretta?
Eugene Yokota,

Corretta. Questa è una vecchia domanda e da allora ho capito che no, non è possibile (per quanto ne so). Non l'ho chiuso nel caso in cui qualcuno fosse effettivamente riuscito a trovare un modo, ma non ho più bisogno di questa risposta.
Nacht,

C'è un filo su questo (con la partecipazione di Bill Venners e Mark Harrah) su groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM , ma nessuna soluzione ancora
Seth Tisue

1
C'è anche una richiesta di supporto generale per l'esecuzione di un singolo test sbt # 911 ( github.com/sbt/sbt/issues/911 ).
Eugene Yokota,

14
Si noti che se si esegue dalla riga di comando, è necessario racchiudere tutto sbttra virgolette , ad esempiosbt "test-only *SingleTestSuite"
Chris Martin

Risposte:


202

Questo è ora supportato (da ScalaTest 2.1.3) in modalità interattiva:

testOnly *MySuite -- -z foo

per eseguire solo i test il cui nome include la sottostringa "pippo".

Per una corrispondenza esatta anziché una sottostringa, utilizzare -tinvece di -z.


@SethTisue Saresti in grado di pubblicare un esempio funzionante che utilizza -tper la corrispondenza esatta? Non riesco a farlo funzionare.
rmin

@rmin gist.github.com/SethTisue/f75cd8b72128ba0a0a81 . (se questo ti aiuta a risolvere il tuo problema, fammi sapere come dovrei aggiornare la mia risposta.)
Seth Tisue

10
Solo per chiarire, se lo esegui dalla riga di comando, dovrebbe essere come argomento singolo: sbt "testOnly * MySuite - -z foo"
Sogartar,

2
Nel caso in cui qualcuno desideri eseguire un test di integrazione specifico (presumibilmente posizionato sotto src/it), è necessario anteporre ita testOnly. Per esempio, sulla linea di comando: sbt "it:testOnly *MyIntegrationTestSuite".
laylaylom,

2
Come posso filtrare su più sottostringhe? I test possono essere raggruppati in una gerarchia (WordSpec) e le parti del nome separate da whene should possono essere ripetute tra i test. Per scegliere un test specifico devo dire "il nome contiene questo AND quello".
Vituel,

98

Volevo aggiungere un esempio concreto per accompagnare le altre risposte

Devi specificare il nome della classe che vuoi testare, quindi se hai il seguente progetto (questo è un progetto Play):

Gioca a Project

È possibile testare solo i Logintest eseguendo il comando seguente dalla console SBT:

test:testOnly *LoginServiceSpec

Se si esegue il comando dall'esterno della console SBT, si dovrebbe fare quanto segue:

sbt "test:testOnly *LoginServiceSpec"

27
Votazione perché apparentemente sono necessarie le doppie virgolette:sbt "test:testOnly *LoginServiceSpec"
Jason Wheeler

5
La risposta più utile per me qui. 👍 Ma i comandi possono essere leggermente semplificati; nella console SBT: testOnly *LoginServiceSpece all'esterno:sbt "testOnly *LoginServiceSpec"
Jonik,

49

Non vedo un modo per eseguire un singolo test senza tag all'interno di una classe di test, ma sto fornendo il mio flusso di lavoro poiché sembra essere utile per chiunque si imbatta in questa domanda.

Dall'interno di una sessione sbt:

test:testOnly *YourTestClass

(L'asterisco è un carattere jolly, è possibile specificare il percorso completo com.example.specs.YourTestClass.)

Verranno eseguiti tutti i test all'interno di quella classe di test. Presumibilmente sei più preoccupato per i test falliti, quindi correggi eventuali implementazioni fallite e quindi esegui:

test:testQuick

... che eseguirà solo test non riusciti. (La ripetizione del test:testOnlycomando eseguito più di recente sarà la stessa test:testQuickdi questo caso, ma se si suddividono i metodi di test in classi di test appropriate è possibile utilizzare un carattere jolly per rendere test:testQuickun modo più efficiente di rieseguire i test non riusciti.)

Si noti che la nomenclatura per test in ScalaTest è una classe di test, non un metodo di test specifico, quindi vengono eseguiti tutti i metodi senza tag.

Se hai troppi metodi di test in una classe di test, suddividili in classi separate o tag in modo appropriato. (Questo potrebbe essere un segnale che la classe sottoposta a test viola il principio di responsabilità singola e potrebbe utilizzare un refactoring.)


10
per chi si trova di fronte "Nessun test eseguito": *YourTestClassdeve essere il nome della classe. Non il nome del file.
MKatleast3,

1
è stato testSolo per me invece che solo per test.
Jan Clemens Stoffregen,

11

Giusto per semplificare l'esempio di Tyler.

test:-prefix non è necessario.

Quindi secondo il suo esempio:

Nella sbtconsole:

testOnly *LoginServiceSpec

E nel terminal:

sbt "testOnly *LoginServiceSpec"

0

Ecco la pagina Scalatest sull'uso del runner e la discussione estesa sulle opzioni -te-z .

Questo post mostra quali comandi funzionano per un file di test che utilizza FunSpec .

Ecco il file di test:

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)""")
    }

  }

}

Questo comando esegue i quattro test nel iLikeblocco di descrizione (dalla riga di comando SBT):

testOnly *CardiBSpec -- -z iLike

Puoi anche usare le virgolette, quindi funzionerà anche:

testOnly *CardiBSpec -- -z "iLike"

Questo eseguirà un singolo test:

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

Questo eseguirà i due test che iniziano con "funziona con":

testOnly *CardiBSpec -- -z "works with"

Non riesco a ottenere l' -topzione per eseguire alcun test nel CardiBSpecfile. Questo comando non esegue alcun test:

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

Sembra che l' -topzione funzioni quando i test non sono nidificati in describeblocchi. Diamo un'occhiata a un altro file di test:

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

-t può essere utilizzato per eseguire il singolo test:

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

-z può essere utilizzato anche per eseguire il singolo test:

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

Vedi questo repository se desideri eseguire questi esempi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.