0Pricing
Scala for Backend Engineering & Functional Programming · 강의

속성 기반 테스트

ScalaCheck를 알아봅니다

속성 기반 테스트은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

속성 기반 테스트란 무엇인가요?

속성 기반 테스트에서는 모든 입력에 대해 성립해야 하는 일반적인 속성을 선언하고, 프레임워크가 이를 반증할 수 있는 무작위 입력을 많이 생성합니다. 이를 통해 직접 작성한 예제가 놓치는 경계 사례를 찾을 수 있습니다.

예제와 속성

예제 테스트는 하나의 경우를 확인합니다. reverse(List(1,2,3)) == List(3,2,1)처럼 작성합니다. 속성은 어떤 리스트에서든 두 번 뒤집으면 원래 리스트가 된다는 규칙을 나타냅니다. 프레임워크는 생성된 수백 개의 리스트에 이 규칙을 적용해 확인합니다.

ScalaCheck

ScalaCheck는 Scala를 위한 속성 테스트 라이브러리입니다. 테스트 의존성으로 추가하면 ScalaTest와 통합하여 사용할 수 있습니다.

libraryDependencies += "org.scalatestplus" %% "scalacheck-1-17" % "3.2.18.0" % Test

forAll

핵심 구성 요소는 forAll입니다. 무작위 값을 생성하고 각각에 대해 속성 본문을 단언합니다. 여기서는 덧셈이 교환 법칙을 만족하는지 테스트합니다.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks

class AddSpec extends AnyFlatSpec with Matchers with ScalaCheckPropertyChecks {
  "addition" should "be commutative" in {
    forAll { (a: Int, b: Int) =>
      a + b shouldBe b + a
    }
  }
}

왕복 속성

강력한 패턴 중 하나는 왕복입니다. 인코딩한 후 디코딩하거나 두 번 뒤집었을 때, 어떤 입력이든 원래 값이 반환되어야 합니다.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks

class RevSpec extends AnyFlatSpec with Matchers with ScalaCheckPropertyChecks {
  "reverse" should "be its own inverse" in {
    forAll { (xs: List[Int]) =>
      xs.reverse.reverse shouldBe xs
    }
  }
}

생성기

ScalaCheck는 기본 제공 타입에 대한 Gen 생성기를 자동으로 제공합니다. 사용자 지정 생성기를 만들 수도 있습니다. 예를 들어 Gen.choose(1, 100)은 범위가 제한된 정수를 생성합니다.

import org.scalacheck.Gen

val smallInt: Gen[Int] = Gen.choose(1, 100)
val nonEmpty: Gen[List[Int]] = Gen.nonEmptyListOf(Gen.choose(0, 9))

사용자 지정 생성기 사용하기

forAll에 생성기를 전달하여 입력을 제한할 수 있습니다. 예를 들어 양수만 입력으로 사용할 수 있습니다.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks
import org.scalacheck.Gen

class PosSpec extends AnyFlatSpec with Matchers with ScalaCheckPropertyChecks {
  "abs" should "stay positive" in {
    forAll(Gen.choose(1, 1000)) { (n: Int) =>
      math.abs(n) should be > 0
    }
  }
}

축소

속성이 실패하면 ScalaCheck는 실패를 일으킨 입력을 여전히 실패하는 가장 작은 예제로 축소합니다. 거대한 무작위 리스트 대신 디버깅하기 쉬운 최소 반례를 얻게 됩니다.

조건부 속성

whenever를 사용하면 사전 조건을 만족하는 입력으로 속성의 적용 범위를 제한할 수 있습니다. 조건을 만족하지 않는 입력은 버려집니다.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks

class DivSpec extends AnyFlatSpec with Matchers with ScalaCheckPropertyChecks {
  "division" should "hold for nonzero divisors" in {
    forAll { (a: Int, b: Int) =>
      whenever(b != 0) {
        (a / b) * b + (a % b) shouldBe a
      }
    }
  }
}

테스트하기 좋은 속성

유용한 속성의 범주는 다음과 같습니다.

  • 왕복: 인코딩/디코딩, 뒤집기/뒤집기
  • 불변식: 정렬해도 길이는 유지됨
  • 대수 법칙: 교환 법칙, 결합 법칙, 항등 법칙

언제 사용하나요?

속성 테스트는 예제 테스트를 보완하며 대체하지는 않습니다. 명확한 수학적 또는 구조적 규칙이 있는 순수 함수에 사용하세요. 특정한 알려진 사례와 회귀를 확인하기 위한 대상 예제 테스트도 유지하세요.

빠른 확인

속성 기반 테스트에 대한 지식을 확인해 보세요.

복습

ScalaCheck를 사용한 속성 기반 테스트를 배웠습니다.

  • 모든 입력에 대해 참인 속성을 선언하면 프레임워크가 다양한 입력을 생성합니다.
  • forAll이 생성을 주도하고, Gen이 사용자 지정 입력을 만듭니다.
  • whenever가 사전 조건을 추가하며, 실패 입력은 최소 예제로 축소됩니다.
  • 왕복, 불변식, 대수 법칙을 테스트하는 데 적합합니다.

자주 묻는 질문

“속성 기반 테스트” 강의는 무료인가요?

네 — “속성 기반 테스트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

“속성 기반 테스트”에서 뭘 배우나요?

ScalaCheck를 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“속성 기반 테스트” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. ScalaTest 스타일
  2. 매처
  3. 속성 기반 테스트
  4. 모킹과 픽스처
← Scala for Backend Engineering & Functional Programming(으)로 돌아가기