IMCAT.DEV
로그인 가입
Ruby 고급 테스트

Ruby 테스트 자동화 기법

Ruby 테스트 자동화 기법 — 고급

테스트 자동화 기법

1. 도입 (왜 배워야 하는가)

테스트 자동화는 소프트웨어 개발 과정에서 품질 보증(QA)의 핵심 요소입니다. 실무에서 자동화된 테스트는 코드의 변경이 발생할 때마다 수동으로 테스트를 실행할 필요를 줄여주며, 이를 통해 개발 주기를 단축시키고, 버그를 사전에 예방할 수 있습니다. 특히, 대규모 프로젝트에서는 수동 테스트로는 한계가 있어, 자동화 없이는 품질을 유지하기 어렵습니다.

만약 테스트 자동화를 도입하지 않는다면, 자주 발생하는 코드 변경에 따른 버그를 발견하기 어려워지고, 이는 결국 사용자에게 불만을 초래하거나 프로젝트의 신뢰성을 떨어뜨리게 됩니다.

2. 핵심 개념 설명

테스트 자동화의 주요 개념은 다음과 같습니다.

개념설명
단위 테스트코드의 개별 단위를 테스트하여 의도한 대로 작동하는지 확인하는 것
통합 테스트여러 모듈이 함께 작동하는지를 확인하는 테스트
회귀 테스트코드 변경 후 기존 기능이 정상적으로 작동하는지 확인하는 테스트

이러한 개념을 마치 자동차의 정비와 비유할 수 있습니다. 단위 테스트는 엔진 오일을 점검하는 것과 같고, 통합 테스트는 엔진과 브레이크 시스템이 잘 연결되어 작동하는지를 확인하는 것입니다. 마지막으로 회귀 테스트는 정비 후 자동차가 잘 달리는지를 확인하는 과정입니다.

3. 기본 코드 예제

다음은 루비에서 RSpec을 이용한 간단한 단위 테스트 예제입니다.

# calculator.rb
class Calculator
  def add(a, b)
    a + b
  end
end
# calculator_spec.rb
require 'rspec'
require_relative 'calculator'

RSpec.describe Calculator do
  it 'adds two numbers' do
    calculator = Calculator.new
    expect(calculator.add(2, 3)).to eq(5)
  end
end

실행 결과

.

Finished in 0.00123 seconds (files took 0.123 seconds to load)
1 example, 0 failures
  • RSpec.describe Calculator do : Calculator 클래스의 테스트를 정의합니다.
  • it 'adds two numbers' do : '두 숫자를 더하는지'라는 테스트 케이스를 정의합니다.
  • calculator = Calculator.new : Calculator 객체를 생성합니다.
  • expect(calculator.add(2, 3)).to eq(5) : add 메소드의 결과가 5와 같은지 확인합니다.
  • 4. 실전 활용 예제

    예제 1: 쇼핑몰 장바구니 기능

    쇼핑몰에서 사용자가 장바구니에 상품을 추가할 때, 다음과 같은 테스트를 작성할 수 있습니다.

    class ShoppingCart
      def initialize
        @items = []
      end
    
      def add_item(item)
        @items << item
      end
    
      def total_items
        @items.count
      end
    end
    
    RSpec.describe ShoppingCart do
      it 'adds an item to the cart' do
        cart = ShoppingCart.new
        cart.add_item('apple')
        expect(cart.total_items).to eq(1)
      end
    end

    예제 2: 사용자 로그인 기능

    로그인 기능의 테스트도 필요합니다. 다음은 사용자가 잘못된 비밀번호로 로그인할 경우를 테스트합니다.

    class User
      attr_accessor :password
    
      def initialize(password)
        @password = password
      end
    
      def login(input_password)
        input_password == @password
      end
    end
    
    RSpec.describe User do
      it 'fails to login with wrong password' do
        user = User.new('correct_password')
        expect(user.login('wrong_password')).to eq(false)
      end
    end

    5. 흔한 실수와 주의사항

    실수 1: 테스트 코드에 비즈니스 로직 포함

  • 잘못된 코드:
  • it 'should add numbers' do
      expect(2 + 3).to eq(5) # 비즈니스 로직을 테스트에 포함
    end
  • 올바른 코드:
  • it 'adds two numbers' do
      calculator = Calculator.new
      expect(calculator.add(2, 3)).to eq(5) # 비즈니스 로직을 클래스에 두고 테스트
    end

    실수 2: 테스트 간의 의존성

  • 잘못된 코드:
  • it 'first test' do
      expect(cart.add_item('apple')).to eq(true)
    end
    
    it 'second test' do
      expect(cart.total_items).to eq(1) # 첫 번째 테스트에 의존
    end
  • 올바른 코드:
  • it 'adds an item to the cart' do
      cart = ShoppingCart.new
      cart.add_item('apple')
      expect(cart.total_items).to eq(1)
    end
    
    it 'can add multiple items' do
      cart = ShoppingCart.new
      cart.add_item('apple')
      cart.add_item('banana')
      expect(cart.total_items).to eq(2)
    end

    6. 정리

  • 테스트 자동화는 소프트웨어 품질 보증의 필수 요소입니다.
  • 단위, 통합, 회귀 테스트의 개념을 이해하고 적용해야 합니다.
  • RSpec과 같은 도구를 사용하여 테스트 케이스를 작성하는 것이 중요합니다.
  • 다음에 학습하면 좋은 주제로는 CI/CD 파이프라인 구축, 테스트 커버리지 분석, 더 복잡한 통합 테스트 기법 등이 있습니다.