전체 글

프로그래밍 관련 지식과 경험을 공유합니다
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] 를 통해 어떠한 ..
· Scala/언어
Scala는 기간 단위의 값을 제어하기 위해 scala.concurrent.duration 패키지에 Duration을 제공해줍니다 (실제 구현체는 FiniteDuration입니다)Duration을 언어 차원에서 제공해주어 개발하기는 좋은데, scala 자체적인 날짜/시간 제어 라이브러리는 따로 제공해주지 않아 결국 java의 라이브러리를 사용하게 되고, Duration이 이 라이브러리들과 편하게 호환되지는 않아 상당히 불편합니다.날짜/시간 라이브러리는 java.time 패키지를 사용하면 되는데 여기서 LocalDateTime을 Duration을 사용해 계산시키고 싶을 때는 아래 적은 코드처럼 사용하면 됩니다.import java.time.{LocalDateTime, LocalTime, Duration =..
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..
· Scala/언어
Scala 공식 문서에 따르면 함수의 파라미터가 0인 함수일경우 괄호를 넣을 수도 있고 괄호를 생략할 수도 있습니다.이러한 언어적 규칙은 프로그래머에게 자유도를 제공하지만 규칙없는 개발은 사용자 입장에서 큰 혼란을 불러일으킬 수 있습니다.Scala는 괄호의 유무를 언어적으로 강제하지는 않고, 권장사항을 작성해서 Scala 개발자가 이를 따르도록 유도하고 있습니다. 괄호를 사용해야 할 경우공식 문서에서는 괄호를 사용해야 할 경우를 아래처럼 설명하고 있습니다.However, this syntax should only be used when the method in question has no side-effects (purely-functional). In other words, it would be acc..
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-..
sleeptoy
쉬어가는 장난감