회귀 테스트 (Regression Test)

회귀 테스트는 소프트웨어의 변경이나 수정 후에 기존 기능이 여전히 올바르게 작동하는지 확인하는 테스트이다.

온라인 쇼핑몰의 회귀 테스트 예시:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import unittest
from shopping_mall import ShoppingCart, Product, User

class ShoppingMallRegressionTest(unittest.TestCase):
    def setUp(self):
        """테스트 준비: 필요한 객체들을 초기화합니다."""
        self.cart = ShoppingCart()
        self.user = User("test_user")
        self.product = Product("노트북", 1000000)
        
    def test_existing_cart_functionality(self):
        """장바구니 기능 회귀 테스트
        
        장바구니 할인 기능이 추가된 후에도 기존 장바구니 기능들이
        정상적으로 작동하는지 확인합니다.
        """
        # 상품 추가 테스트
        self.cart.add_item(self.product)
        self.assertEqual(len(self.cart.items), 1)
        
        # 상품 제거 테스트
        self.cart.remove_item(self.product)
        self.assertEqual(len(self.cart.items), 0)
        
        # 금액 계산 테스트
        self.cart.add_item(self.product, quantity=2)
        self.assertEqual(self.cart.total_price, 2000000)

    def test_new_discount_feature(self):
        """새로운 할인 기능 테스트
        
        새로 추가된 할인 기능이 기존 가격 계산 로직을
        망가뜨리지 않는지 확인합니다.
        """
        # 기본 가격 계산
        self.cart.add_item(self.product)
        base_price = self.cart.total_price
        
        # 할인 적용
        self.cart.apply_discount(10)  # 10% 할인
        
        # 할인된 가격 확인
        expected_price = base_price * 0.9
        self.assertEqual(self.cart.total_price, expected_price)
        
        # 할인 제거 후 원래 가격으로 복원되는지 확인
        self.cart.remove_discount()
        self.assertEqual(self.cart.total_price, base_price)

특징과 목적

회귀 테스트의 주요 특징과 목적은 다음과 같다:

  1. 변경 영향 확인: 새로운 기능이나 수정사항이 기존 기능에 미치는 영향을 파악한다.
  2. 버그 재발 방지: 이전에 수정된 버그가 다시 나타나지 않는지 확인한다.
  3. 품질 유지: 소프트웨어의 전반적인 품질을 유지한다.

테스트 범위

회귀 테스트는 다음과 같은 범위를 포함한다:

  1. 수정된 코드
  2. 수정과 관련된 기능
  3. 핵심 기능
  4. 자주 사용되는 기능

수행 시점

회귀 테스트는 주로 다음과 같은 시점에 수행된다:

  1. 새로운 기능 추가 후
  2. 버그 수정 후
  3. 성능 개선 후
  4. 환경 변경 시 (예: 운영체제 업데이트)

검증 대상

주요 검증 대상은 다음과 같다:

  1. 기존 기능의 정상 작동 여부
  2. 새로운 기능과 기존 기능의 상호작용
  3. 성능 및 안정성

회귀 테스트의 종류

  1. 전체 회귀 테스트: 모든 테스트 케이스를 다시 실행한다.
  2. 부분 회귀 테스트: 변경된 부분과 관련된 테스트만 실행한다.
  3. 선택적 회귀 테스트: 중요도에 따라 선별된 테스트를 실행한다.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class RegressionTestTypes:
    def retest_all(self):
        """전체 재테스트
        모든 테스트 케이스를 다시 실행합니다.
        """
        all_tests = [
            self.test_user_authentication(),
            self.test_product_management(),
            self.test_order_processing(),
            self.test_payment_system()
        ]
        return all(all_tests)
    
    def selective_regression(self, modified_modules):
        """선택적 회귀 테스트
        변경된 모듈과 관련된 테스트만 실행합니다.
        """
        test_map = {
            'user': self.test_user_authentication,
            'product': self.test_product_management,
            'order': self.test_order_processing,
            'payment': self.test_payment_system
        }
        
        for module in modified_modules:
            if module in test_map:
                test_map[module]()

진행 방식

회귀 테스트는 다음과 같은 단계로 진행된다:

  1. 테스트 케이스 선택: 변경 사항과 관련된 테스트 케이스를 선택한다.
  2. 테스트 환경 준비: 테스트를 위한 환경을 설정한다.
  3. 테스트 실행: 선택된 테스트 케이스를 실행한다.
  4. 결과 분석: 테스트 결과를 분석하고 문제점을 식별한다.
  5. 버그 수정 및 재테스트: 발견된 문제를 수정하고 다시 테스트한다.

회귀 테스트를 효과적으로 수행하기 위한 중요한 고려사항들

  1. 테스트 케이스 선정 모든 테스트를 실행하는 것이 이상적이지만, 시간과 리소스의 제약이 있을 때는 중요도와 영향도를 고려하여 테스트 케이스를 선정해야 한다.
  2. 자동화의 중요성 회귀 테스트는 반복적으로 수행되어야 하므로, 가능한 한 많은 테스트를 자동화하는 것이 효율적이다.
  3. 테스트 결과의 추적 이전 테스트 결과와의 비교를 통해 성능 저하나 새로운 문제점을 발견할 수 있어야 한다.

예시

온라인 쇼핑몰 애플리케이션을 예로 들어보면:

  1. 새로운 결제 방식(예: 암호화폐)을 추가했다고 가정해보자.
  2. 회귀 테스트에서는 다음을 확인한다:
    • 새로운 결제 방식이 제대로 작동하는지
    • 기존 결제 방식(신용카드, 계좌이체 등)이 여전히 정상 작동하는지
    • 주문 처리, 재고 관리 등 관련 기능에 문제가 없는지
    • 전체 시스템의 성능이 저하되지 않았는지
      이러한 회귀 테스트를 통해 새로운 기능 추가로 인한 예상치 못한 문제를 사전에 발견하고 수정할 수 있다.

참고 및 출처