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는 코드 품질을 보장하고 개발 효율성을 높이는 포괄적인 테스트 솔루션을 제공합니다.