Minitest::Spec이란 무엇인가? RSpec 스타일 테스트 확장

What is Minitest::Spec? - Remi Mercier

작성자
Ruby Weekly
발행일
2025년 10월 13일

핵심 요약

  • 1 Minitest::Spec은 Minitest의 RSpec 스타일 확장으로, `it`, `before`, `expect` 구문을 사용하여 테스트를 작성합니다.
  • 2 기존 Minitest의 어설션(`assert_equal`)과 달리, Minitest::Spec은 기대(`expect(actual).must_equal expected`)를 통해 실제 동작이 예상 결과와 일치하는지 확인합니다.
  • 3 Ruby 애플리케이션에서는 `Minitest::Spec`을 상속하고, Rails에서는 `test_helper.rb`에서 `minitest/spec`을 require하고 `ActiveSupport::TestCase`에 `Minitest::Spec::DSL`을 확장하여 활성화합니다.

도입

Minitest는 다양한 문법 스타일을 제공하며, 이 글에서는 그중 RSpec 스타일의 테스트 작성을 가능하게 하는 Minitest::Spec 확장에 대해 다룹니다. Minitest::Spec은 기존 Minitest의 어설션(assertion) 방식과 달리 실제 동작이 예상 결과와 일치하는지 확인하는 기대(expectation) 패러다임을 채택하여, RSpec 경험이 있는 개발자에게 익숙한 테스트 작성 방식을 제공합니다. 이는 단지 구문의 변화를 넘어, 테스트 사고 방식의 미묘한 차이를 반영합니다.

Minitest::Spec: RSpec 스타일 테스트 확장

Minitest는 def test_method, Rails 스타일의 test "method", 그리고 Minitest::Specit "tests method"와 같이 다양한 문법 스타일을 제공합니다. 각 스타일은 테스트 파일과 예제를 정의하는 방식에 변화를 주지만, Ruby 개발자에게는 모두 익숙한 DSL(Domain Specific Language)로 느껴집니다.

어설션과 기대의 패러다임 차이

일반 Minitest와 Rails는 “예상되는 어설션이 실제 결과에 대해 참인지 확인”하는 패러다임을 따릅니다. 반면, Minitest::Spec은 RSpec과 유사하게 “실제 동작이 예상 결과와 일치하는지 확인”하는 반대 패러다임을 따릅니다.

코드 예시: Plain Minitest vs Minitest::Spec

Plain Minitest: ruby class UserTest < Minitest::Test def setup @user = User.new(first_name: "buffy", last_name: "summers") end def test_returns_the_full_name assert_equal "buffy summers", @user.full_name end end

Minitest::Spec: ruby class UserTest < Minitest::Spec before do @user = User.new(first_name: "buffy", last_name: "summers") end it "returns the capitalized full name" do expect(@user.full_name).must_equal "Buffy Summers" end end Minitest::Specsetup 대신 before do ... end, test 또는 def test_* 대신 it, 그리고 어설션 대신 expect(실제 동작).must_equal 예상 결과와 같은 기대를 사용합니다. 또한, describe 블록을 사용하여 테스트 컨텍스트를 계층적으로 구성할 수 있습니다.

Minitest::Spec 활성화 방법

### Ruby 애플리케이션 별도의 설정 없이 테스트 클래스가 Minitest::Test 대신 Minitest::Spec을 상속하도록 하면 됩니다. 공식 문서에는 명시되어 있지 않으므로 소스 코드를 통해 확인해야 합니다. ruby class UserTest < Minitest::Spec # ... end

Rails 애플리케이션

test_helper.rb 파일에 다음 코드를 추가해야 합니다. ruby # frozen_string_literal: true require "rails/test_help" require "minitest/spec" # Minitest::Spec require module ActiveSupport class TestCase extend Minitest::Spec::DSL # DSL 확장 end end Rails에서는 테스트 클래스의 상속을 변경할 필요가 없으며, 기존의 ActiveSupport::TestCase, ActionDispatch::IntegrationTest 등을 그대로 사용합니다.

주의사항 (Gotchas)

setupbefore를 같은 파일에서 혼용하는 것은 권장되지 않습니다.

  • Plain Ruby: setupbefore가 함께 작동합니다.

  • Rails: setupbefore보다 먼저 사용되면 정상 작동하지만, beforesetup보다 먼저 사용되면 setup이 실행되지 않아 테스트가 실패할 수 있습니다.

결론

Minitest::Spec은 Minitest의 세 번째 주요 스타일 확장으로, RSpec과 유사한 문법을 통해 어설션과 기대 사이의 다리 역할을 합니다. 이는 `describe`, `before`, `it`, `expect` 등의 구문을 사용하여 테스트를 보다 명확하고 구조적으로 작성할 수 있게 합니다. Ruby 및 Rails 애플리케이션에서 활성화하는 방법에는 약간의 차이가 있으며, 특히 `setup`과 `before` 훅을 혼용할 경우 예상치 못한 동작이 발생할 수 있으므로 주의가 필요합니다. 이 확장은 Minitest 사용자에게 RSpec 스타일의 유연성을 제공하여 테스트 작성 경험을 풍부하게 합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!