2013-02-28 12 views
18

Chcę utworzyć kilka specyfikacji współpracujących z bazą danych.Sposób sekwencyjnego uruchamiania specyfikacji

class DocumentSpec extends mutable.Specification with BeforeAfterExample { 
    sequential 

    def before() = {createDB()} 
    def after() = {dropDB()} 

    // examples 
    // ... 
} 

Baza danych jest tworzona i upuszczana przed i po każdym przykładzie (wykonywana sekwencyjnie). Everithing działa zgodnie z oczekiwaniami, dopóki nie istnieje tylko jedna specyfikacja, która działa z bazą danych. Ponieważ specyfikacje są wykonywane równolegle, przeszkadzają i kończą się niepowodzeniem.

Mam nadzieję, że uda mi się tego uniknąć, nakazując specs2, aby sekwencyjnie przeprowadzał testy z efektami ubocznymi, jednocześnie prowadząc równoległe testy z efektem ubocznym. Czy to możliwe?

Odpowiedz

29

Przypuszczam, że używasz SBT? Jeśli tak, sprawdź dokumentację: http://www.scala-sbt.org/release/docs/Detailed-Topics/Parallel-Execution

Odpowiednie ustawienie SBT to parallelExecution. Dodaj to do definicji projektu:

parallelExecution in Test := false 
+2

Tak, używam SBT. Ale nie jest naturalne, aby określać ustawienia zestawu testów w skrypcie budowania. Poza tym "parallelExecution in Test: = false" zapewnia, że ​​wszystkie testy są wykonywane sekwencyjnie, podczas gdy muszę "uruchamiać testy z efektami ubocznymi sekwencyjnie, jednocześnie utrzymując testy wolne od skutków ubocznych, aby działały równolegle". Być może zastosowanie oddzielnego db do każdego testu bazy danych byłoby rozwiązaniem. – Jeriho

+2

Lub prostsze, umieść testy testowe w odrębnym projekcie i przedefiniuj definicję 'parallelExecution' tylko dla tego projektu. –

27

Jeśli chcesz uruchomić pojedynczy Specyfikacja w specs2 kolejno po prostu dodać sequential wywołanie metody na początku swojej specyfikacji. Na przykład:

class MyTest extends Specification { 
    // Set sequential execution 
    sequential 

    // This tests will be executed sequentially 
    "my test" should { 
    "add numbers" in { 
     (1 + 1) should be equalTo 2 
    } 

    "multiply numbers" in { 
     (2 * 2) should be equalTo 4 
    } 
    } 
} 
+5

Wiesz, w moim miejscu pracy wciąż nie jesteśmy pewni, czy to faktycznie uruchamia testy w kolejności, czy nawet uniemożliwia ich równoległe działanie. – 2rs2ts

+1

Dziwne ... To działało dla mnie i dla wielu innych osób. Jeśli możesz wymyślić przykład, gdy testy nie są wykonywane sekwencyjnie za pomocą tego wywołania metody, prawdopodobnie powinieneś zgłosić błąd do spec2. –

+0

To robi. Zobacz odpowiedź Eric, twórcy Specs2, https://stackoverflow.com/questions/8026866/parallel-execution-of-tests –

3

Tymczasem istnieje lepsze rozwiązanie (http://www.scala-sbt.org/release/docs/Parallel-Execution.html):

SBT 0.12.0 wprowadza ogólną infrastrukturę ograniczanie współbieżność zadań poza zwykłymi deklaracji zamówieniu.

Taka konfiguracja będzie uruchomić wszystkie testy sekwencyjne, także jeśli są one w podprojektów:

concurrentRestrictions in Global := Seq(
    Tags.limit(Tags.CPU, 2), 
    Tags.limit(Tags.Network, 10), 
    Tags.limit(Tags.Test, 1), 
    Tags.limitAll(15) 
) 

nie testowałem, czy to może być pominięte przez każdego podprojektu, więc sub-projekt może równolegle przeprowadzaj testy.

Powiązane problemy