2014-09-12 9 views
9

Mam Play Framework 2.3 projekt, w którym chciałbym rozdzielić testów jednostkowych i testów funkcjonalnych następująco:Dlaczego testy integracji w projekcie Play/Scala nie są wykonywane, gdy używasz "sbt it: test"?

  1. działa sbt test powinien przeprowadzić testy jednostkowe i uwzględniają wszystkie testy integracyjne
  2. działa sbt it:test powinien działać tylko testy integracyjne

dokumentacja Scala sugeruje użycie project/Build.scala, ale chciałbym użyć kombinacji build.sbt i project/Build.scala, więc moja konfiguracja wygląda tak (mam al tak próbował oddanie wszystkich konfiguracji w Build.scala):

build.sbt

.... 

libraryDependencies ++= Seq(
    "com.typesafe.play" %% "play-json" % "2.2.3", 
    "org.scalatest" %% "scalatest" % "2.1.5" % "it, test", 
    "org.mockito" % "mockito-all" % "1.9.5" % "it, test" 
) 

def funTestFilter(name: String): Boolean = ((name endsWith "ItTest") || (name endsWith "IntegrationTest")) 
def unitTestFilter(name: String): Boolean = ((name endsWith "Test") && !funTestFilter(name)) 

testOptions in IntegrationTest := Seq(Tests.Filter(funTestFilter)) 

testOptions in Test := Seq(Tests.Filter(unitTestFilter)) 

projekt/Build.scala

import sbt._ 

object Build extends Build { 

    lazy val root = 
    Project("root", file(".")) 
     .configs(IntegrationTest) 
     .settings(Defaults.itSettings : _*) 

} 

ramach tej konfiguracji działa sbt test wyklucza mój test integracyjny (co kończy się IntegrationTest), ale uruchomienie sbt it:test nie znajduje żadnych testów.

Artykuł sugeruje umieszczanie plików w określonej ścieżce, ale nie wiem, jaka jest równoważna ścieżka dla projektu Play.

Standardowo stosuje się hierarchia źródło:

src/it/scala for Scala sources 
src/it/java for Java sources 
src/it/resources for resources that should go on the integration test classpath 

Odpowiedz

19

Pierwsza część - o konfigurowaniu testy integracyjne w build.sbt - jest opisany w innym pytaniu What would be the minimal setup of IntegrationTest configuration in sbt 0.13.x? - sprowadza się do następujących wpisów w build.sbt:

Defaults.itSettings 

lazy val root = project.in(file(".")).configs(IntegrationTest) 

Ponieważ projekt play jest zdefiniowany następująco:

lazy val root = (project in file(".")).enablePlugins(PlayScala) 

powinieneś dodać configs i gotowe.

lazy val root = project in file(".") enablePlugins(PlayScala) configs(IntegrationTest) 

Czy reload lub uruchom sesję SBT/aktywator i wykonać it:test.

[it-play] $ it:test 
[info] Updating {file:/Users/jacek/sandbox/it-play/}root... 
[info] Resolving jline#jline;2.11 ... 
[info] Done updating. 
[success] Total time: 1 s, completed Sep 13, 2014 7:12:27 PM 

Co do miejsca, w którym testy integracyjne powinny iść w projekcie Play, krótka odpowiedź jest zrobić show it:sourceDirectory w powłoce, tj src/it z scala, java i resources katalogów pod zawierać odpowiednie źródła.

Dodaj testową bibliotekę szkieletową w konfiguracji it, tj.w build.sbt nie powinno być coś podobnego do - uwaga konfiguracji it:

"org.specs2" %% "specs2" % "2.4.2" % "it" 

Wykonaj reload sesję SBT lub uruchom ją ponownie, a it:test powinny pracować z testów Specs2 dla wszystkich testów pod src/it/scala.

Aby zawęzić jakie badania powinny być wykonywane, dodać filtr - upewnić się, że po linii z Defaults.itSettings jak kolejność ma znaczenie i można przesłonić drugi:

val funTestFilter: String => Boolean = { name => 
    (name endsWith "ItTest") || (name endsWith "IntegrationTest") 
} 

testOptions in IntegrationTest += Tests.Filter(funTestFilter) 

Czy reload lub uruchom SBT i wykonać it:test. Powinno działać. Czy show it:testOptions aby zapewnić instalacyjnego załadowany prawidłowo:

[it-play] $ show it:testOptions 
[info] List(Filter(<function1>)) 

Cały build.sbt że pracował dla mnie jest następująca - to stworzony przez activator new it-play play-scala:

name := """it-play""" 

version := "1.0-SNAPSHOT" 

lazy val root = project in file(".") enablePlugins(PlayScala) configs(IntegrationTest) 

scalaVersion := "2.11.1" 

libraryDependencies ++= Seq(
    jdbc, 
    anorm, 
    cache, 
    ws, 
    "org.specs2" %% "specs2" % "2.4.2" % "it" 
) 

Defaults.itSettings 

val funTestFilter: String => Boolean = { name => 
    (name endsWith "ItTest") || (name endsWith "IntegrationTest") 
} 

testOptions in IntegrationTest += Tests.Filter(funTestFilter) 
+0

Dzięki !!!. Mój projekt nie wie, czym jest "PlayScala", jest to błąd, który dostaję: "/web/api-checkout/build.sbt:28: błąd: nie znaleziono: wartość PlayScala", jednak wydaje się działać bez niego , Nie wiem, jakie problemy mogą powodować, ale nie znalazłem jeszcze żadnych problemów. – Mike

+0

Korzystając z gry 2.3.9, podążyłem za przykładami, ale moja IntegrationSpec.scala nie może się skompilować, ponieważ nie może znaleźć PlaySpecification, np. Klasa IntegrationSpec rozszerza PlaySpecification. Czy jest jakiś pomysł, dlaczego SBT nie uwzględniało bibliotek gier w fazie "to"? Ponadto dodałem to do build.sbt, "org.specs2" %% "specs2-core"% "3.5"% "it, test", "org.specs2" %% "specs2-junit"% " 3.5 "%" it, test ", " org.specs2 "%%" specs2-mock "%" 3,5 "%" it, test " Dzięki – thlim

+0

ok Dodałem test do" go ", tj." Com.typesafe .play "%%" play-test "%" 2.3.9 "%" it " – thlim

11

To, co skończyło się robi, co pozwala mi do:

  1. zachowywać moje testy integracyjne w Play /test katalogu
  2. run sbt test dla testów jednostkowych i sbt fun:test funkcjonalnego/integracja testuje

Oto build.sbt, nie potrzeba project/Build.scala

libraryDependencies ++= Seq(
    ... 
    "com.typesafe.play" %% "play-json" % "2.2.3", 
    "org.scalatest" %% "scalatest" % "2.1.5" % "test", 
    "org.mockito" % "mockito-all" % "1.9.5" % "test" 
) 

lazy val FunTest = config("fun") extend(Test) 

def funTestFilter(name: String): Boolean = ((name endsWith "ItTest") || (name endsWith "IntegrationTest")) 
def unitTestFilter(name: String): Boolean = ((name endsWith "Test") && !funTestFilter(name)) 

lazy val root = project in file(".") configs(FunTest) settings(inConfig(FunTest)(Defaults.testTasks) : _*) 

testOptions in FunTest := Seq(Tests.Filter(funTestFilter)) 

testOptions in Test := Seq(Tests.Filter(unitTestFilter)) 
+0

Bardzo podoba mi się to rozwiązanie, ponieważ mogę po prostu sklonować i idź w dowolnym wybranym IDE. Jeśli utworzę nowy folder testowy, to od dzisiaj muszę albo wstawić IDE specyficzne rzeczy w mojej kompilacji (ick) albo mam dodatkowy krok IDE, aby poinformować IDE o moim nowym folderze (też nie wielkim). – rancidfishbreath

Powiązane problemy