ScalaTest w sbt: czy istnieje sposób na uruchomienie pojedynczego testu bez tagów?

150

Wiem, że pojedynczy test można uruchomić, uruchamiając w sbt,

testOnly *class -- -n Tag

Czy istnieje sposób na poinformowanie sbt / scalatest, aby uruchomił pojedynczy test bez tagów? Na przykład:

testOnly *class -- -X 2

oznaczałoby to „uruchom drugi test w klasie. Cokolwiek to jest”. Mamy kilka testów i nikt nie zadał sobie trudu, aby je oznaczyć, więc czy istnieje sposób na uruchomienie pojedynczego testu bez tagu?

Nacht
źródło
1
Twój temat mówi „Scalatest-sbt”. Kiedy sbt jest dzielony na wyraz, ludzie zwykle pomyśleliby o wtyczce. Ale żeby wyjaśnić, mówisz o używaniu ScalaTest z nowoczesnej wersji sbt, takiej jak sbt 0.12, a nie joshcough / scalatest-sbt, wtyczka do sbt 0.5.2-p3 napisana 4 lata temu. Poprawny?
Eugene Yokota
Poprawny. To stare pytanie i od tego czasu doszedłem do wniosku, że nie, nie jest to możliwe (o ile wiem). Nie zamknąłem go na wypadek, gdyby ktoś rzeczywiście znalazł sposób, ale nie potrzebuję już odpowiedzi.
Nacht
Jest wątek na ten temat (z udziałem zarówno Billa Vennersa, jak i Marka Harraha) na groups.google.com/forum/#!topic/scalatest-users/1oRMkudFAXM , ale nie ma jeszcze rozwiązania
Seth Tisue,
1
Istnieje również przypadek ogólnego wsparcia dotyczącego uruchomienia pojedynczego testu sbt # 911 ( github.com/sbt/sbt/issues/911 ).
Eugene Yokota,
14
Zauważ, że jeśli uruchamiasz z wiersza poleceń, musisz ująć wszystko po sbtcudzysłowach , np.sbt "test-only *SingleTestSuite"
Chris Martin

Odpowiedzi:

202

Jest to teraz obsługiwane (od ScalaTest 2.1.3) w trybie interaktywnym:

testOnly *MySuite -- -z foo

aby uruchamiać tylko testy, których nazwa zawiera podciąg „foo”.

Aby uzyskać dokładne dopasowanie zamiast podłańcucha, użyj -tzamiast -z.

Seth Tisue
źródło
@SethTisue Czy byłbyś w stanie opublikować działający przykład, który wykorzystuje -tdo dokładnego dopasowania? Nie mogę zmusić go do pracy.
rmin
@rmin gist.github.com/SethTisue/f75cd8b72128ba0a0a81 . (jeśli to pomoże Ci rozwiązać problem, daj mi znać, jak mam zaktualizować moją odpowiedź.)
Seth Tisue
10
Dla wyjaśnienia, jeśli uruchomisz go z wiersza poleceń, powinien to być pojedynczy argument: sbt "testOnly * MySuite - -z foo"
Sogartar
2
W przypadku, gdy ktoś chce uruchomić test specyficzny integracyjny (podobno umieszczony poniżej src/it), muszą poprzedzić itdo testOnly. Na przykład, w wierszu poleceń: sbt "it:testOnly *MyIntegrationTestSuite".
laylaylom
2
Jak mogę filtrować według wielu podciągów? Testy mogą być grupowane w hierarchię (WordSpec), a nazwy części są oddzielone wheni should mogą być powtarzane między testami. Aby wybrać jeden konkretny test, muszę powiedzieć „nazwa zawiera to i tamto”.
Vituel
98

Chciałem dodać konkretny przykład towarzyszący pozostałym odpowiedziom

Musisz podać nazwę klasy, którą chcesz przetestować, więc jeśli masz następujący projekt (jest to projekt Play):

Odtwórz projekt

Możesz przetestować tylko Logintesty, uruchamiając następujące polecenie z konsoli SBT:

test:testOnly *LoginServiceSpec

Jeśli uruchamiasz polecenie spoza konsoli SBT, wykonaj następujące czynności:

sbt "test:testOnly *LoginServiceSpec"
Tyler
źródło
27
Głosuj za, ponieważ najwyraźniej podwójne cudzysłowy są konieczne:sbt "test:testOnly *LoginServiceSpec"
Jason Wheeler
5
Najbardziej przydatna odpowiedź tutaj. 👍 Jednak polecenia można nieco uprościć; w konsoli SBT: testOnly *LoginServiceSpeci na zewnątrz:sbt "testOnly *LoginServiceSpec"
Jonik
49

Nie widzę sposobu na uruchomienie pojedynczego nieoznaczonego testu w klasie testowej, ale zapewniam mój przepływ pracy, ponieważ wydaje się być przydatny dla każdego, kto napotka to pytanie.

Z sesji SBT:

test:testOnly *YourTestClass

(Gwiazdka jest symbolem wieloznacznym, możesz określić pełną ścieżkę com.example.specs.YourTestClass).

Wszystkie testy w tej klasie testowej zostaną wykonane. Prawdopodobnie najbardziej martwisz się niepowodzeniem testów, więc popraw wszystkie błędne implementacje, a następnie uruchom:

test:testQuick

... który wykona tylko te testy, które zakończyły się niepowodzeniem. (Powtórzenie ostatnio wykonanego test:testOnlypolecenia będzie takie samo, jak test:testQuickw tym przypadku, ale jeśli podzielisz swoje metody testowe na odpowiednie klasy testowe, możesz użyć symbolu wieloznacznego, aby test:testQuickwydajniej ponownie uruchomić testy zakończone niepowodzeniem).

Zwróć uwagę, że nazewnictwo testów w ScalaTest to klasa testowa, a nie określona metoda testowa, więc wszystkie metody nieoznakowane są wykonywane.

Jeśli masz zbyt wiele metod testowych w klasie testowej, podziel je na oddzielne klasy lub odpowiednio oznacz. (Może to być sygnał, że testowana klasa narusza zasadę pojedynczej odpowiedzialności i może użyć refaktoryzacji).

cfeduke
źródło
10
dla tych, którzy mają do czynienia z komunikatem „Nie wykonano żadnych testów”: *YourTestClassmusi to być nazwa klasy. Nie nazwa pliku.
MKatleast3
1
to był testOnly zamiast test - tylko dla mnie.
Jan Clemens Stoffregen
11

Żeby uprościć przykład Tylera.

test:-prefix nie jest potrzebny.

Więc zgodnie z jego przykładem:

W sbtkonsoli:

testOnly *LoginServiceSpec

A w terminalu:

sbt "testOnly *LoginServiceSpec"
pme
źródło
0

Oto strona Scalatest dotycząca korzystania z runnera i rozszerzonej dyskusji na temat opcji -ti-z .

Ten post pokazuje, jakie polecenia działają dla pliku testowego, który używa FunSpec.

Oto plik testowy:

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

  }

}

To polecenie uruchamia cztery testy w iLikebloku opisywania (z wiersza poleceń SBT):

testOnly *CardiBSpec -- -z iLike

Możesz również użyć cudzysłowów, więc to również zadziała:

testOnly *CardiBSpec -- -z "iLike"

Spowoduje to uruchomienie pojedynczego testu:

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

Spowoduje to uruchomienie dwóch testów zaczynających się od „działa z”:

testOnly *CardiBSpec -- -z "works with"

Nie mogę -turuchomić żadnych testów w CardiBSpecpliku. To polecenie nie uruchamia żadnych testów:

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

Wygląda na to, że -topcja działa, gdy testy nie są zagnieżdżone w describeblokach. Rzućmy okiem na inny plik testowy:

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

-t można użyć do uruchomienia pojedynczego testu:

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

-z można również użyć do uruchomienia pojedynczego testu:

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

Zobacz to repozytorium, jeśli chcesz uruchomić te przykłady.

Uprawnienie
źródło