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