둘 다 Scala로 작성된 Scala 용 BDD (Behavior Driven Development) 가능 단위 테스트 프레임 워크입니다. 그리고 사양을 기반으로 구축되어 도 포함될 수 있습니다 ScalaTest 프레임 워크를. 하지만 Specs가 제공하는 ScalaTest가 제공하지 않는 것은 무엇입니까? 차이점은 무엇입니까?
둘 다 Scala로 작성된 Scala 용 BDD (Behavior Driven Development) 가능 단위 테스트 프레임 워크입니다. 그리고 사양을 기반으로 구축되어 도 포함될 수 있습니다 ScalaTest 프레임 워크를. 하지만 Specs가 제공하는 ScalaTest가 제공하지 않는 것은 무엇입니까? 차이점은 무엇입니까?
답변:
Specs와 ScalaTest는 모두 만족스러운 사용자에게 좋은 도구이지만 여러면에서 다릅니다. 스칼라의 주요 테스트 도구로 하나를 선택하고 싶겠지 만 둘 다 사용할 수 있기 때문에 다른 하나를 포기할 필요는 없습니다. FeatureSpec
예를 들어 ScalaTest의 구문과 사양의 Mockito 구문 을 좋아한다면 두 jar 파일을 클래스 경로에 넣고 동시에 둘 다 사용할 수 있습니다. 여기서는 스펙과 ScalaTest 사이에서 발견 한 주요 디자인 철학의 차이점을 포착하려고합니다.
아마도 도구 간의 주요 철학적 차이점은 사양이 BDD (Behavior-Driven Development) 용으로 설계되었지만 ScalaTest가 더 일반적이라는 것입니다. ScalaTest는 BDD를 포함하여 테스트 클래스에서 선호하는 동작을 얻기 위해 함께 혼합 할 수있는 특성을 제공하며, 다른 것을 원하는 경우 자신의 동작을 쉽게 정의 할 수도 있습니다.
를 통해 ScalaTest 지원 BDD 그것의 Spec
, FeatureSpec
, WordSpec
, FlatSpec
, 및 GivenWhenThen
특성, 또한 당신이 좋은 정규 구문을 얻을 수에 혼합 할 수 있다는 특징을 가지고있다. "should"가 마음에 들면 ShouldMatchers에서 믹스합니다. "must"를 좋아한다면 MustMatchers
. 그러나 BDD를 좋아하지만 matcher 구문이 마음에 들지 않는 경우, matcher 특성을 혼합하지 않고 ScalaTest의 Spec 특성 중 하나만 사용할 수 있습니다. Specs에는 확장하는 Specification 클래스가 있으며 matcher 표현식에서 "must"라는 단어를 사용해야합니다. 여기서 명백한 철학적 차이점은 ScalaTest가 훨씬 더 많은 선택을 제공한다는 것입니다. 이 선택 공간을보다 쉽게 탐색 할 수 있도록 여기에 의사 결정 트리를 제공합니다.
http://www.scalatest.org/quick_start
매처 구문도 ScalaTest와 사양간에 다릅니다. ScalaTest에서 나는 연산자 표기법으로 얼마나 멀리 갈 수 있는지 보려고 노력했고, 단어 사이에 공백이있는 영어 문장과 매우 흡사 한 일치 표현으로 끝났습니다. Specs matcher 구문은 카멜 케이스와 함께 더 많은 단어를 실행합니다.
Specs는 ScalaTest보다 더 많은 matcher를 가지고 있으며 디자인 태도의 차이를 반영한다고 생각합니다. 나는 실제로 내가 구축하고 출시를 고려한 매처 구문의 2/3를 잘라 냈다. 나는 향후 릴리스에서 더 많은 매처를 추가 할 것이지만 추가하기 전에 사용자가 실제로 원하는 것을 알고 있는지 확인하고 싶었습니다. 그러나 ScalaTest의 매처에는 동적 속성 매처 구문이 포함되어있어 일부 여유를 차지합니다. 예를 들어 Specs에서 다음과 같이 쓸 수 있습니다 java.io.File
.
file must beDirectory
이것은를 호출하고 isDirectory
그것이 사실인지 확인합니다. ScalaTest에는 java.io.Files
현재 특별한 매 처가 없지만 ScalaTest에서는 다음과 같은 동적 검사를 사용할 수 있습니다.
file must be a ('directory)
뒤에 기호를 전달할 때마다 be
리플렉션을 사용하여 이름이 지정된 메서드 나 필드 directory
또는 이름이 지정된 메서드를 찾습니다 (이 경우) isDirectory
. BePropertyMatcher
(일반적으로 2 줄 또는 3 줄의 코드 만 필요함) 을 정의하여이를 정적으로 만드는 방법도 있습니다 . 그래서 기본적으로 ScalaTest에서는 적은 API로 더 많은 기능을 제공하려고합니다.
스펙과 ScalaTest의 또 다른 일반적인 디자인 태도 차이는 암시 적 변환입니다. 기본적으로 ScalaTest를 사용할 때 하나의 암시 적 변환 만 얻습니다.이 변환은 ===
연산자를 모든 것에 적용합니다. (필요한 경우 한 줄의 코드로이 암시 적 변환을 "해제"할 수 있습니다. 그렇게해야하는 유일한 이유는 자체 ===
연산자 가있는 무언가를 테스트하려고 할 때 충돌이 발생하는 경우입니다. ) ScalaTest는 다른 많은 암시 적 변환을 정의하지만이를 사용하려면 트레이 트를 혼합하거나 가져 오기를 수행하여 코드에 명시 적으로 "초대"해야합니다. 수업을 확장 할 때Specification
사양에서는 기본적으로 수십 개의 암시 적 변환이 발생한다고 생각합니다. 실제로 그것이 얼마나 중요한지 잘 모르겠지만 사람들은 자신의 암시를 사용하는 코드를 테스트하고 싶어 할 것이며 때로는 테스트 프레임 워크의 암시와 프로덕션 코드 사이에 충돌이있을 수 있습니다. 그런 일이 발생하면 ScalaTest에서 사양보다 문제를 해결하는 것이 더 쉬울 것이라고 생각합니다.
제가 알아 차린 디자인 태도의 또 다른 차이점은 작업자의 편안함입니다. 내가 가진 한 가지 목표는 ScalaTest를 사용하는 다른 사람의 테스트 코드를 보는 프로그래머가 ScalaTest 문서에서 아무것도 찾지 않고도 의미가 무엇인지 추측 할 수 있다는 것이 었습니다. 나는 ScalaTest 클라이언트 코드가 명백하게 삭제되기를 원했습니다. 목표가 드러난 한 가지 방법은 ScalaTest가 연산자에 대해 매우 보수적이라는 것입니다. ScalaTest에서 다섯 개의 연산자 만 정의합니다.
===
, 즉 같음>
, 이는보다 큼을 의미합니다.<
,보다 작음>=
, 크거나 같음<=
, 작거나 같음.그게 다야. 그래서 이런 것들은 의미하는 것처럼 보입니다. 다른 사람의 코드에 다음이 표시되는 경우 :
result should be <= 7
제 희망은 그것이 <=
의미하는 바를 추측하기 위해 API 문서를 실행할 필요가 없다는 것입니다 . 대조적으로 사양은 운영자에게 훨씬 더 자유 롭습니다. 그게 잘못은 아니지만 차이입니다. 운영자가 코드를보다 간결을 할 수 있지만, 트레이드 오프는 같은 물건을 찾을 때 문서를 실행해야 할 수있다 ->-
, >>
, |
, |>
, !
, 또는 ^^^
동료의 테스트 코드에서 (모든 사양에서 특별한 의미를 가지고있는).
또 다른 철학적 차이점은 내가 ScalaTest에서 조명기를 공유해야 할 때 기능적 스타일을 사용하는 것을 약간 더 쉽게 만들려고한다는 것입니다. 반면에 Specs는 기본적 으로 JUnit에서 대중화 한 setUp
및 tearDown
접근 방식 의 전통을 계속 유지합니다. 각 테스트 전에. 그러나 그런 방식으로 테스트하고 싶다면 ScalaTest에서도 매우 쉽습니다. BeforeAndAfter
특성 을 혼합하면 됩니다.
ScalaTest에 대한 자세한 내용은 2009 Devoxx 컨퍼런스에서 제가 발표 한 "Get Higher with ScalaTest"프레젠테이션을 여기에서 볼 수 있습니다.
http://parleys.com/play/514892260364bc17fc56bde3/chapter0/about
주요 차이점은 다음과 같습니다 (대부분 사양 관점에서 :-)).
ScalaTest는 사양보다 더 많은 "테스트 스타일"을 제공합니다 ( 빠른 시작 페이지 의 각 글 머리 기호를 방문 하여 각 스타일에 대한 자세한 정보를 볼 수 있습니다).
ScalaTest 및 사양에는 다른 매처 세트가 있습니다. 여기 에서 ScalaTest와 여기 에서 사양 을 비교할 수 있습니다 . 그 측면에서 사양에는 사양을 작성할 때 좋아할 수있는 작은 기능이 많이 있습니다. xml 매처, 매처 구성 (매처를 변환하여 쉽게 재사용 할 수있는 방법), 정확한 실패, 긴 문자열에 대한 자세한 차이점, .. .
specs에는 일종의 테이블에 많은 작은 예제를 그룹화 할 수있는 DataTable 이 있습니다 (테이블 구분 기호로 사용되는 연산자를 견딜 수있는 경우).
이것은 확실히 매우 부분적이고 편향된 비교이며 다른 많은 차이점이 존재합니다 (그리고 라이브러리는 여전히 진화하고 있습니다 ...).
결국에는 테스트 / 지정 스타일에 따라 달라진다고 생각합니다. 단순하다면 (간단한 사양 구조, 설정, 기대 등) 두 라이브러리는 매우 비슷하게 보일 것입니다. 그렇지 않으면 둘 다 일을 어떻게해야하는지에 대해 각자의 견해를 가지고 있습니다. 이에 대한 마지막 예로서 ScalaTest 및 specs 에서 태그 지정을 살펴볼 수 있습니다 .
이게 도움이 되길 바란다.
내가 아는 한, 고도로 전문화 된 기능을 제외하고는 스타일에 따른 개인적인 선호도에 달려 있습니다.
IDE 지원은 또 다른 점일 수 있습니다.
JUnit을 통해 이클립스에서 Specs가 작동하도록 노력해 왔는데 공식 솔루션이 약간 "해키"라는 것을 알았습니다. 사양 설정 : http://code.google.com/p/specs/wiki/RunningSpecs#Run_your_specification_with_JUnit4_in_Eclipse
ScalaTest의 통합 (JUnit을 통해서도)은 약간 덜 엉망인 것 같습니다. 그래도 JUnit 및 Java만큼 잘 작동하지 않습니다.
ScalaTest 설정 : http://groups.google.com/group/scalatest-users/web/running-scalatest-from-eclipse
한 가지 결정 요소가 컴파일 시간 이라면 scalatest가 더 잘 수행되는 것 같습니다.
현재 프로젝트에서 specs2를 사용하고 있지만 테스트에서 컴파일 시간이 느려집니다. scalatest로 이동하면서 POC를 마쳤으며 일부 소스에서 두 프레임 워크를 전환하는 것만으로도 컴파일 시간이 약 0.82 배 감소하는 것을 확인했습니다.