2013-04-03 14 views
10

Pracuję z niektórymi klasami, które (z jakiegoś powodu) mogą być użyte tylko raz w pojedynczej maszynie wirtualnej. Moje przypadki testowe działają, jeśli uruchomię je osobno (fork := true) w moich ustawieniach sbt.Jak rozwidlić jvm dla każdego testu w sbt

Jeśli przeprowadzę więcej niż jeden z tych testów, to zawiodą one z wyjątkiem, który musi wystąpić w przypadku executora wątków odrzucającego zadanie (najprawdopodobniej jest zamknięte). Bardzo czasochłonne byłoby ustalenie, co powoduje problem, a nawet jeśli znajdę problem, być może nie będę w stanie go rozwiązać (nie mam dostępu do kodu źródłowego).

Obecnie używam ramek testowych specs2, ale każda struktura testowa korzystająca z sbt byłaby akceptowalna.

Czy istnieją ramy testowe dla sbt, które są w stanie uruchomić każdy test w widelcu jvm?

Myśli lub pomysły na temat innych możliwych rozwiązań są oczywiście mile widziane.

Odpowiedz

7

Okazuje się, że jest to dość łatwe do osiągnięcia. Dokumentacja jest wystarczająca i można je znaleźć w Testing - Forking tests

// Define a method to group tests, in my case a single test per group 
def singleTests(tests: Seq[TestDefinition]) = 
    tests map { test => 
    new Group(
     name = test.name, 
     tests = Seq(test), 
     runPolicy = SubProcess(javaOptions = Seq.empty[String])) 
    } 

// Add the following to the `Project` settings 
testGrouping in Test <<= definedTests in Test map singleTests 
+0

która wersja SBT to działa na? Używam wersji 0.13.1 i nie mam szczęścia. Moim przypadkiem użycia jest to, że używam aplikacji play2 i mam pewne obiekty towarzyszące, które chcę zainicjować danymi konfiguracyjnymi w każdym uruchomieniu vm (każdy test) i na pewno nie robię tego z tym rozwiązaniem. Dzięki! – Jordan

+0

Myślę, że sbt 0.12, link jednak wskazuje na nowszą wersję. – EECOLOR

+2

Ah, wygląda na to, że w mojej wersji sbt musisz zrobić "testGrouping w teście << ...." – Jordan

1

Korzystanie non-przestarzałej składni:

testGrouping in Test := (definedTests in Test).value map { test => 
    Tests.Group(name = test.name, tests = Seq(test), runPolicy = Tests.SubProcess(
    ForkOptions(
     javaHome.value, 
     outputStrategy.value, 
     Nil, 
     Some(baseDirectory.value), 
     javaOptions.value, 
     connectInput.value, 
     envVars.value 
    ))) 
} 
Powiązane problemy