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?


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.


@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"

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).


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"

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.