SBT를 활용한 ScalaTest 통합: 효율적인 테스트 워크플로우 구축

ScalaTest는 Scala 및 Java 개발자를 위한 강력한 테스트 프레임워크입니다. 이를 SBT(Scala Build Tool)와 원활하게 통합하면 개발 생산성을 크게 향상시킬 수 있습니다. 이 글에서는 SBT 프로젝트에 ScalaTest를 구성하여 자동화된 테스트 프로세스를 구축하고, 테스트 워크플로우를 더욱 효율적이고 신뢰할 수 있게 만드는 방법을 자세히 설명합니다.

SBT에 ScalaTest 추가하기: 기본 설정

SBT 프로젝트에서 ScalaTest를 사용하려면 먼저 build.sbt 파일에 의존성을 추가해야 합니다. ScalaTest 공식 문서에서 권장하는 방식은 다음과 같습니다.

libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.18" % Test

위 설정은 ScalaTest를 테스트 스코프 의존성으로 추가합니다. %% 심볼은 프로젝트의 Scala 버전에 맞는 라이브러리 버전을 자동으로 찾아줍니다. 설정 추가 후 SBT는 ScalaTest 라이브러리를 자동으로 다운로드하고 관리합니다.

테스트 실행 사용자 정의: 고급 설정

ScalaTest는 풍부한 설정 옵션을 제공하며, SBT의 testOptions를 통해 테스트 매개변수를 지정할 수 있습니다. 예를 들어, 상세한 HTML 보고서를 생성하려면 다음 설정을 추가할 수 있습니다:

testOptions in Test += Tests.Argument(
  "-h", "target/test-reports/html", // HTML 보고서 출력 경로
  "-u", "target/test-reports/junit", // JUnit XML 보고서 출력 경로
  "-oP" // 콘솔에 요약 정보 출력 (병렬 실행 시 유용)
)

이 설정은 테스트 실행 후 target/test-reports/html 경로에 HTML 보고서를, target/test-reports/junit 경로에 JUnit 스타일 XML 보고서를 생성하고, 콘솔에는 간략한 실행 결과를 표시합니다. ScalaTest는 다양한 보고서 형식과 출력 옵션을 지원하므로 필요에 따라 조합하여 사용할 수 있습니다.

자주 사용되는 테스트 실행 매개변수

  • -h <directory>: HTML 형식의 테스트 보고서를 지정된 디렉토리에 생성합니다.
  • -u <directory>: JUnit 스타일 XML 형식의 보고서를 지정된 디렉토리에 생성합니다. CI/CD 시스템 연동에 유용합니다.
  • -o: 콘솔에 테스트 실행 결과를 출력합니다. -oD는 상세 정보를, -oP는 병렬 실행 시 진행률을 표시합니다.
  • -l <tag>: 지정된 태그를 가진 테스트를 실행에서 제외합니다.
  • -n <tag>: 지정된 태그를 가진 테스트만 실행합니다.

병렬 테스트 및 선택적 실행

ScalaTest와 SBT의 통합은 강력한 병렬 테스트 지원을 포함합니다. SBT의 병렬 실행 설정을 통해 테스트 실행 시간을 크게 단축할 수 있습니다.

parallelExecution in Test := true

또한, SBT 명령어를 통해 실행할 테스트를 유연하게 선택할 수 있습니다:

  • sbt test: 프로젝트의 모든 테스트를 실행합니다.
  • sbt testOnly *MySuite: 특정 테스트 클래스만 실행합니다. (예: sbt "testOnly com.example.service.UserServiceSpec")
  • sbt testQuick: 마지막으로 실패한 테스트 또는 변경된 코드에 의존하는 테스트만 빠르게 실행합니다.

테스트 선택 예시

sbt "testOnly com.mycompany.app.CalculationServiceSpec"

이 명령어는 CalculationServiceSpec 테스트 클래스만 실행합니다. 와일드카드를 사용하여 여러 테스트 클래스를 일치시킬 수도 있습니다.

시각적 테스트 보고서: 결과 분석

ScalaTest는 HTML 보고서 외에도 다양한 시각적 보고서 형식을 제공하여 테스트 결과를 더 직관적으로 파악할 수 있도록 돕습니다. 예를 들어, JUnit 스타일 XML 보고서는 Jenkins, GitLab CI 등과 같은 CI/CD 시스템에 쉽게 통합되어 빌드 상태를 시각화하는 데 활용됩니다.

ScalaTest의 다양한 테스트 스타일(예: FlatSpec, FunSuite, WordSpec)에 따라 보고서 표시 방식도 달라질 수 있으므로, 프로젝트 요구사항에 가장 적합한 스타일을 선택하는 것이 중요합니다.

테스트 필터링 및 태그: 정밀한 제어

ScalaTest는 태그를 사용하여 테스트를 분류하고, 이를 SBT 설정과 결합하여 유연한 테스트 필터링을 가능하게 합니다. 예를 들어, 시간이 오래 걸리는 테스트에 IntegrationTest 태그를 지정할 수 있습니다.

import org.scalatest.Tag

object IntegrationTest extends Tag("com.mycompany.tags.IntegrationTest")

class MyApplicationSpec extends org.scalatest.funspec.AnyFunSpec {
  describe("애플리케이션 기능") {
    it("데이터베이스 연동 테스트를 수행해야 함") taggedAs IntegrationTest in {
      // 실제 데이터베이스 연동 테스트 코드
      assert(true) // 임시 확인
    }

    it("일반적인 유닛 테스트는 빠르게 실행되어야 함") in {
      // 일반 유닛 테스트 코드
      assert(2 + 2 == 4)
    }
  }
}

그리고 SBT에서 통합 테스트를 제외하고 빠른 테스트만 실행하려면 다음과 같이 설정합니다:

testOptions in Test += Tests.Argument("-l", "com.mycompany.tags.IntegrationTest")

반대로, 특정 태그가 지정된 테스트만 실행하려면 -n 매개변수를 사용합니다:

testOptions in Test += Tests.Argument("-n", "com.mycompany.tags.IntegrationTest")

이 방법을 통해 일상적인 개발 중에는 핵심 테스트를 빠르게 실행하고, CI 환경에서는 전체 테스트 스위트를 실행할 수 있습니다.

프로젝트 구조: 테스트 코드 구성

ScalaTest는 테스트 코드를 src/test/scala 디렉토리에 배치하고, 주 코드와 동일한 패키지 구조를 유지하는 것을 권장합니다. 예를 들어, 주 코드가 src/main/scala/com/example/app에 있다면, 해당 테스트 코드는 src/test/scala/com/example/app에 위치해야 합니다.

이러한 구조는 코드 조직화를 돕고, SBT가 테스트를 자동으로 검색하고 실행하는 데 용이합니다.

테스트 효율성 향상을 위한 팁

  • 테스트 스타일 선택: ScalaTest는 FlatSpec, FunSuite, WordSpec 등 다양한 테스트 스타일 템플릿을 제공합니다. 프로젝트에 가장 적합한 스타일을 선택하여 테스트 코드의 가독성을 높이세요.
  • SBT의 연속 빌드 활용: sbt ~test 명령어를 사용하면 코드 변경 시 테스트가 자동으로 실행되어 실시간으로 피드백을 받을 수 있습니다.
  • 코드 커버리지 도구 통합: sbt-scoverage 플러그인을 추가하여 코드 커버리지 보고서를 생성하고, 테스트되지 않은 코드를 식별하는 데 활용하세요.
  • 테스트 픽스처 사용: 테스트 설정 및 해체(setup/teardown) 코드를 공유해야 하는 경우 ScalaTest의 픽스처(Fixture) 기능을 활용하여 코드 중복을 줄일 수 있습니다.

심층 학습: 고급 기능 탐색

ScalaTest와 SBT의 통합은 다음과 같은 더 많은 고급 기능을 제공합니다.

  • 비동기 테스트: Future, Actor 등 비동기 코드 테스트를 지원합니다.
  • 속성 기반 테스트 (Property-based Testing): 다양한 입력 값을 자동으로 생성하여 코드의 속성을 테스트하고 엣지 케이스를 발견합니다.
  • 테스트 데이터 생성: ScalaTest의 Gen 특성을 활용하여 테스트 데이터를 생성하고 테스트의 포괄성을 높입니다.

이러한 고급 기능에 대해 더 자세히 알아보려면 ScalaTest 공식 문서와 예제 코드를 참조하세요.

ScalaTest와 SBT를 통합하여 효율적이고 유연한 테스트 워크플로우를 구축할 수 있습니다. 기본적인 설정부터 고급 기능까지, ScalaTest는 코드 품질을 보장하고 개발 효율성을 높이는 포괄적인 테스트 솔루션을 제공합니다.

태그: Scala SBT ScalaTest 자동화된테스트 유닛테스트

8월 3일 11:18에 게시됨