학습
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