Jaka jest różnica między ScalaTest a Scala specs unit test framework?

Oba są frameworkami testów jednostkowych BDD (Behavior Driven Development) dla Scali napisanymi w Scali. I jest zbudowany na może również obejmować ScalaTest framework. Ale co oferuje Skalatest? Jakie są różnice?

Author: S.L. Barth, 2010-02-08

6 answers

Specs i ScalaTest są dobrymi narzędziami dla zadowolonych użytkowników, ale różnią się pod kilkoma względami. Prawdopodobnie będziesz chciał wybrać jedno jako główne narzędzie do testowania w Scali, ale nie musisz rezygnować z drugiego, ponieważ możesz użyć kawałków obu. Jeśli podoba Ci się składnia FeatureSpec Scalatesta i składnia Mockito specs, na przykład, możesz umieścić oba pliki jar w swojej ścieżce klasowej i używać obu jednocześnie. Tutaj postaram się uchwycić główne różnice w filozofii projektowania, które zauważyłem między specyfikacjami i Skalatest.

Prawdopodobnie główną filozoficzną różnicą między narzędziami jest to, że specs jest zaprojektowany dla Behavior-Driven Development (BDD), podczas gdy Skalatest jest bardziej ogólny. ScalaTest zapewnia cechy, które można mieszać ze sobą, aby uzyskać zachowanie preferowane w klasach testowych, w tym BDD, a także można łatwo zdefiniować własne zachowanie, jeśli chcesz czegoś innego.

ScalaTest obsługuje BDD poprzez swoje Spec, FeatureSpec, WordSpec, FlatSpec, i GivenWhenThen cechy, a także ma cechy, które możesz mieszać, aby uzyskać ładną składnię matchera. Jeśli lubisz "powinien", mieszasz w ShouldMatchers. Jeśli lubisz "must", mieszasz MustMatchers. Ale jeśli lubisz BDD, ale nie lubisz składni matchera, możesz po prostu użyć jednej z cech Spec Skalatest bez mieszania w cechę matchera. Specs ma klasę specyfikacji, którą rozszerzasz i musisz użyć słowa "must" w wyrażeniach matcher. Dużą filozoficzną różnicą, która jest tutaj widoczna, jest to, że ScalaTest daje o wiele więcej możliwości wyboru. Aby ta przestrzeń wyboru jest łatwiejsza w nawigacji, podaję tutaj drzewo decyzyjne:

Http://www.scalatest.org/quick_start

Składnia matchera jest również różna między Skalatest i specs. W ScalaTest próbowałem zobaczyć, jak daleko mogę zajść z notacją operatorską, a skończyło się na wyrażeniach matchera, które czytają się bardzo podobnie do angielskich zdań, ze spacjami między słowami. Specs składnia matcher uruchamia słowa razem z wielbłądem przypadku.

Specs ma więcej matcherów niż Skalatest, i myślę, że odzwierciedla różnicę w podejściu do projektowania. Właściwie wyciąłem prawdopodobnie 2/3 składni matchera, którą zbudowałem i rozważałem do wydania. Dodam więcej matcherów w przyszłych wydaniach, ale chciałem się upewnić, że wiedziałem, że użytkownicy naprawdę czegoś chcą, zanim to dodałem. Jednak matchery Skalatest zawierają dynamiczną właściwość matcher składnia zajmuje część tego luzu. Na przykład w specyfikacji można napisać na java.io.File:

file must beDirectory

To wywoła isDirectory i upewni to prawda. ScalaTest nie ma obecnie żadnych specjalnych matcherów dla java.io.Files, ale w ScalaTest możesz użyć dynamicznego sprawdzania, takiego jak:

file must be a ('directory)

Za każdym razem, gdy podasz symbol po be, użyje on reflection, aby wyszukać (w tym przypadku) metodę lub pole o nazwie directory lub metodę o nazwie isDirectory. Istnieje również sposób, aby uczynić to statyczne, definiując BePropertyMatcher (co zwykle wymaga tylko 2 lub 3 linijek kodu). Więc w zasadzie w ScalaTest staram się zapewnić więcej funkcjonalności za mniej API.

Kolejna ogólna różnica między specyfikacją a skalowalnością obejmuje konwersje niejawne. Domyślnie otrzymujesz tylko jedną domyślną konwersję, gdy używasz Skalatest, która nakłada operator === na wszystko. (Jeśli musisz, możesz "wyłączyć" tę ukrytą konwersję za pomocą jednej linii kodu. Jedynym powodem, dla którego musiałbyś to zrobić, jest próba przetestowania czegoś, co ma swój własny operator ===, i masz konflikt.) Skalatest definiuje wiele innych ukrytych konwersji, ale aby ich użyć, musisz jawnie "zaprosić" je do kodu, mieszając w cechę lub wykonując import. Kiedy rozszerzasz klasę Specification w specyfikacji, myślę, że domyślnie dostajesz dziesiątki ukrytych konwersji. Nie jestem pewien, ile to będzie miało znaczenia w praktyce, ale myślę, że ludzie będą chcieli przetestować kod, który używa własnych wywołań niejawnych, a czasami może dojść do konfliktu między wywołaniami niejawnymi frameworka testowego a wywołaniami kodu produkcyjnego. Kiedy to zdarza się, że myślę, że łatwiej obejść problem w Skalatest niż specyfikacje.

Kolejną różnicą w podejściu projektowym, którą zauważyłem, jest komfort obsługi. Jednym z moich celów było to, że każdy programista patrząc na czyjś kod testowy, który używa ScalaTest będzie w stanie odgadnąć, co to znaczy, bez szukania czegokolwiek w dokumentacji ScalaTest. Chciałem, żeby najbardziej skalowalny kod klienta był oczywisty. Jednym ze sposobów, w jaki cel się przejawia, jest to, że skalowalność jest bardzo konserwatywny wobec operatorów. Definiuję tylko pięć operatorów w Skalatest:

  • ===, czyli równa się
  • >, co oznacza większą niż
  • <, mniej niż
  • >=, większe lub równe
  • <=, mniejsze lub równe.
To wszystko. Więc te rzeczy wyglądają jak to, co znaczy. Jeśli widzisz w cudzym kodzie:
result should be <= 7

Mam nadzieję, że nie będziesz musiał uruchamiać dokumentacji API, aby zgadnąć, co to <= znaczy. Natomiast specyfikacje są znacznie swobodniejsze u operatorów. Nie ma w tym nic złego, ale to różnica. Operatory mogą uczynić kod bardziej zwięzłym, ale kompromis polega na tym, że być może będziesz musiał uruchomić dokumentację, gdy znajdziesz takie rzeczy jak ->-, >>, |, |>, !, lub ^^^ (które mają specjalne znaczenie w specyfikacji) w kodzie testowym twojego kolegi.

Inną filozoficzną różnicą jest to, że staram się nieco ułatwić w skalowaniu użycie funkcjonalnego stylu kiedy musisz udostępnić oprawę, podczas gdy Specs domyślnie kontynuuje tradycję setUp i tearDown podejścia spopularyzowanego przez JUnit, w którym zmieniasz nazwy var przed każdym testem. Jednak jeśli chcesz przetestować w ten sposób, jest to również bardzo łatwe w Skalatest. Musisz tylko wymieszać BeforeAndAfter cechę.

Aby uzyskać więcej informacji na temat ScalaTest, możesz obejrzeć prezentację "Get Higher with ScalaTest", którą wygłosiłem na konferencji Devoxx 2009 tutaj:

Http://parleys.com/play/514892260364bc17fc56bde3/chapter0/about

 165
Author: Bill Venners,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-11 09:29:53

Główne różnice to (głównie z punktu widzenia specyfikacji: -)):

  • ScalaTest zapewnia więcej "stylów testowych" niż specyfikacji (możesz odwiedzić każdy punkt punktowy na stronie quick start , aby uzyskać szczegółowy widok każdego stylu)

  • ScalaTest i specs mają inny zestaw matcherów. Możesz je porównać tutaj dla Skalatest i tutaj dla specyfikacji. Z tej strony specs ma wiele małych funkcji, które mogą ci się spodobać podczas pisania twoja Specyfikacja: matchery xml, skład matcherów( łatwy sposób na ponowne wykorzystanie matcherów poprzez ich przekształcenie), precyzyjne błędy, szczegółowe różnice dla długich ciągów, ...

  • Mockito otrzymał ładne wsparcie BDD w specyfikacji: Mockito

  • Specs posiada DataTables , które pozwalają grupować wiele małych przykładów w rodzaj tabeli (jeśli można wyróżnić operatory używane jako ograniczniki tabel)

  • W specyfikacji można zdefiniować przykłady które są zagnieżdżone jako libidum i automatycznie oczyszczane na każdym poziomie

Jest to z pewnością bardzo częściowe i stronnicze porównanie i istnieje wiele innych różnic (a Biblioteki wciąż się rozwijają, ...).

Na koniec dnia myślę, że to naprawdę zależy od Twojego stylu testowania/określania. Jeśli jest to proste (prosta struktura specyfikacji, ustawienia, oczekiwania,...) wtedy obie biblioteki będą wyglądały bardzo podobnie. W przeciwnym razie obie mają swoje zdanie na temat tego, jak rzeczy powinny być zrobione. Jako ostatni przykład możesz spojrzeć na tagowanie: w ScalaTest i w specs .

Mam nadzieję, że to pomoże.

 46
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-06 11:58:33

Z tego co wiem, poza kilkoma wysoce wyspecjalizowanymi funkcjami, sprowadza się to do osobistych preferencji w zależności od stylu.

 4
Author: Daniel C. Sobral,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-08 16:06:37

Obsługa IDE może być kolejnym punktem

Próbowałem uzyskać specyfikacje do pracy z Eclipse przez JUnit, i okazało się, że oficjalne rozwiązanie jest trochę "hacky". Konfiguracja specyfikacji: http://code.google.com/p/specs/wiki/RunningSpecs#Run_your_specification_with_JUnit4_in_Eclipse

Integracja ScalaTest (również przez JUnit) z wydaje się nieco mniej hakerska. Mimo to nie mam żadnego z nich do pracy tak dobrze jak JUnit i Java.

ScalaTest setup: http://groups.google.com/group/scalatest-users/web/running-scalatest-from-eclipse

 2
Author: Grav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-18 09:48:49

Jeśli jednym z czynników decyzyjnych jest czas kompilacji, scalatest wydaje się działać lepiej.

Obecnie używamy specs2 w naszym projekcie, ale cierpią z powodu powolnych czasów kompilacji w testach. Po raz kolejny udało mi się przeskoczyć na skalatest i zobaczyłem, że czasy kompilacji spadają o współczynnik Około 0.82, po prostu przełączając frameworki 2 w niektórych naszych źródłach.

 0
Author: sebi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-15 11:29:58

Główne różnice między Skalatest i Specs2 to:

  • ogólna struktura testu w Specs2 jest inna niż w Skalatest.
  • Specs2 ma inny zestaw Matcherów o różnej składni.
  • testy Specs2 są głównie dedykowane do behavior-driven development (BDD) , podczas gdy testy skalowalne są bardziej ogólne.
  • ScalaTest zapewnia znacznie większy wybór i wszechstronność. Na przykład, aby napisać BDD-like Specs2 w Skalatest, można użyć Spec, FeatureSpec, WordSpec, FlatSpec i GivenWhenThen cechy wraz z ShouldMatchers lub MustMatcher . Daje to programiście większą elastyczność w podążaniu za własnym stylem pisania specyfikacji.
  • Specs2 ma znacznie większą liczbę Matcherów niż ScalaTest. Większość z nich jest dla konkretnej potrzeby. Na przykład w Specs2 można powiedzieć:

    AFile mustBe aDirectory

  • Jeśli Specs2 posiada pojedyncze Matchery dla plików java. io. , ScalaTest nie ma podobnych Matcherów.

  • Inną różnicą między Skalatest i Spec są konwersje niejawne. ScalaTest ma tylko jedną konwersję implicit, którą osiągamy za pomocą === centrala. Można to jednak wyłączyć w programie ScalaTest za pomocą pojedynczej linii kodu. Jest to jedyna ukryta konwersja uzyskana za darmo w Skalatest. Istnieją inne ukryte konwersje, które mogą być używane przez mieszanie innych cech. W przeciwieństwie do tego Specs2gi daje dziesiątki ukrytych konwersji tylko poprzez rozszerzenie klasy Specification. W praktyce nie robi to wielkiej różnicy. Jedyną różnicą byłoby to, że kod testowy byłby bardziej czytelny bez wyraźnych konwersji.

  • Specs2 posiada tabele danych. Pozwala to na użycie wielu przykładów, które mogą napędzać test, podobnie jak testy napędzane właściwościami.

  • Specs2 testy różnią się od ScalaTest, ponieważ mogą być wykonywane jednocześnie w osobnym wątku.

 0
Author: Amine Sagaama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-26 08:32:03