scalatest

Fixture 관리테스트를 짜다보면 테스트 준비에 항상 공통으로 나오는 데이터들이 생기고 여기서 데이터를 조금만 바꿔서 코드를 짜게되는 상황이 자주 발생합니다.이럴때 사용할만한 팁이 몇 가지 있습니다. create function 생성제일 좋은 방법은 fixture 생성 함수를 trait로 만들고 이를 필요한 테스트마다 상속받아 공유하는 방법입니다.아래 코드는 간단한 예제입니다.case class Request(id: Long, target: Option[String], requestedAt: LocalDateTime)trait RequestFixture { def createRequest( id: Long, target: Option[String] = None, requestedA..
Async testScala 코드를 작성하면 기본적으로 sync-blocking 방식의 코드가 아닌 async-non-blocking 방식의 코드를 작성하게 됩니다. async, non-blocking 방식의 코드는 기본적으로 테스트하기 복잡하지만, ScalaTest는 이를 위한 테스트 방식을 제공해주고 있습니다.기존의 테스트 스타일에 async 키워드를 붙여주면 async, non-blocking 방식의 테스트가 가능해집니다.지원해주는 테스트 스타일들은 아래와 같습니다.AsyncFunSuiteAsyncFlatSpecAsyncFunSpecAsyncWordSpecAsyncFreeSpecAsyncFeatureSpecPropSpec과 RefSpec에 대응되는 Async 스펙은 지원하지 않습니다. Blockin..
테스트를 작성할 때 실패 테스트를 작성하는 것이 성공테스트를 작성하는 것보다 더욱 중요합니다.실패 경로는 대개 throw exception으로 처리되므로 ScalaTest는 이를 위한 테스트 방법을 제공해줍니다. assertThrows가장 기본적인 exception 테스트 방법입니다.assertThrows 함수 내부에서 exception이 throw 되면 exception의 타입을 검사합니다.assertThrows[ArithmeticException] { 5 / 0} thrownByshould나 must matchers에서 제공해주는 방법으로 exception을 저장하고 추가적인 검증도 진행이 가능해 assertThrows 보다 더욱 활용성이 높은 테스트 방법입니다. // an [T] 를 통해 어떠한 ..
Table base testScalaTest는 PropertyBaseTest 스타일 역시 지원해줍니다.제일 간단하게 사용하는 방법은 단순히 TableDrivenPropertyChecks trait를 상속받으면 됩니다. 테스트를 위한 객체들은 Table class를 통해 만들 수 있습니다.Table의 첫 번째 인자는 제공해줄 객체들의 설명, 두 번째 이후부터는 실제 객체들을 넣으면 됩니다.Scala의 튜플 제한으로 인해 한 문장에 최대 22개까지만 객체를 넣을 수 있습니다.import org.scalatest.funspec.AnyFunSpecimport org.scalatest.matchers.should.Matchersimport org.scalatest.prop.TableDrivenPropertyChe..
ScalaTest는 Scala에서 기본적으로 제공해주는 타입인 Option, Either에 대한 테스트도 지원해줍니다.이 역시 간편하게 trait 형태로 제공해주어 필요할경우 상속받아 사용하면 됩니다. Option testOption 테스트를 위해서 OptionValues trait를 지원해줍니다.해당 trait를 상속받으면 Option 타입에 implicit function으로 value 함수를 신규로 지원해주어 이를 통해 assertion 비교를 진행하면 됩니다. Option의 값을 비교하기 위해 간단히 get을 사용하면 되지 않나 얘기하실 수도 있는데 None에 get을 실행하면 NoSuchElementException이 던져져서 테스트가 실패하지만 어느 테스트에서 실패했는지 StackDepth를 ..
ScalaTest에서는 테스트 결과를 검증하기 위해서 assert와 함께 should, shouldBe, must, mustBe 등의 assert 함수를 제공해줍니다.should나 must 등의 함수는 내부적으로 assert와 동일하지만, 문장을 이해하기 쉽게 해주기 위한 syntax sugar 역할로 이해하면 됩니다.should, must도 동일하게 동작하지만 테스트 결과의 뉘앙스 차이를 주는 것이니 원하는 문장을 사용하면 됩니다. Assertionassert를 적용하기 위한 방법은 trait, import의 두 가지 방법이 있습니다.trait를 사용하는 것이 조금 더 보편적이고, import를 사용해도 크게 상관없습니다.import org.scalatest.funspec.AnyFunSpecimport..
Scala 언어에도 다양한 테스트 라이브러리가 존재하는데 그 중 대표적인 테스트 라이브러리로 ScalaTest가 존재합니다.ScalaTest는 사용하기도 쉽고, 사용법도 scala에 잘 어울리며 다양한 Mock 라이브러리 연동도 지원해주면서 테스트 스타일도 굉장히 다양하게 지원해주어서 개인적으로 사용중인 라이브러리이기도 합니다.만약 테스트를 작성해야 한다면 ScalaTest를 적용해보기를 추천합니다. ScalaTest 설치ScalaTest를 설치하려고 결정했다면 build.sbt에 의존성을 추가해주기만 하면 사용 가능합니다.Scalatic 라이브러리도 설치할 수 있는데 그냥 유틸리티 라이브러리이므로 사용하지 않아도 됩니다. 저도 사용한 적은 없습니다.ThisBuild / version := "0.1.0-..
이번 글에서는 단위 테스트에서 설명해주는 목에 대해 알아보겠습니다. 테스트와 목(Mock)목은 세부 분류로 들어가면 더미, 스텁, 스파이, 목, 페이크의 다섯 가지 유형으로 구분됩니다.이 다섯 가지 유형은 크게 두 가지 분류로 나뉘어서 목과 스텁의 두 가지 분류로 구분됩니다. 목(Mock)목은 외부로 나가는 상호 작용을 모방하고 검사하는데 도움이 되는 도구입니다. 이러한 상호 작용은 SUT가 상태를 변경하기 위한 의존성을 호출하는 것에 해당합니다. 대표적인 예시로는 이메일 발송과 같이 Side effect가 있는 호출이 있습니다. 목은 다시 목(mock)과 스파이(spy)의 두 분류로 나눠지는데, 스파이는 목과 동일하지만 단지 프로그래머가 수동으로 작성한다는 차이만 있습니다. 최근의 Mockito나 Mo..
sleeptoy
'scalatest' 태그의 글 목록