기능 테스트 (Functional 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
| import unittest
from shopping_cart import ShoppingCart
from product import Product
class TestShoppingCartFunctionality(unittest.TestCase):
def setUp(self):
"""테스트 준비: 장바구니와 상품 객체 생성"""
self.cart = ShoppingCart()
self.product1 = Product("노트북", 1000000, "전자기기")
self.product2 = Product("마우스", 50000, "전자기기")
def test_add_item_to_cart(self):
"""상품 추가 기능 테스트"""
# 상품을 장바구니에 추가
self.cart.add_item(self.product1, 1)
# 장바구니에 상품이 정확히 들어갔는지 확인
self.assertEqual(self.cart.item_count, 1)
self.assertEqual(self.cart.total_price, 1000000)
def test_remove_item_from_cart(self):
"""상품 제거 기능 테스트"""
# 상품을 장바구니에 먼저 추가
self.cart.add_item(self.product1, 1)
# 상품 제거
self.cart.remove_item(self.product1)
# 장바구니가 비어있는지 확인
self.assertEqual(self.cart.item_count, 0)
self.assertEqual(self.cart.total_price, 0)
def test_update_item_quantity(self):
"""상품 수량 변경 기능 테스트"""
# 상품 추가 후 수량 변경
self.cart.add_item(self.product1, 1)
self.cart.update_quantity(self.product1, 2)
# 수량과 총 가격이 올바르게 변경되었는지 확인
self.assertEqual(self.cart.get_item_quantity(self.product1), 2)
self.assertEqual(self.cart.total_price, 2000000)
|
특징과 목적#
- 사용자 중심: 실제 사용자의 관점에서 소프트웨어를 테스트한다.
- 요구사항 검증: 소프트웨어가 명세된 요구사항을 충족하는지 확인한다.
- 결함 발견: 소프트웨어의 기능적 오류를 찾아낸다.
- 품질 보증: 소프트웨어의 전반적인 품질을 향상시킨다.
테스트 범위#
기능 테스트는 끝(브라우저)에서 끝(데이터베이스)까지 모든 구성 요소를 논리적으로 완전한 하나의 기능으로 다룬다.
이는 사용자 인터페이스부터 백엔드 시스템까지 전체 애플리케이션 스택을 포함한다.
수행 시점#
기능 테스트는 소프트웨어 개발 주기의 여러 단계에서 수행될 수 있지만, 주로 시스템 테스트 단계와 인수 테스트 단계에서 중점적으로 이루어진다.
검증 대상#
- 사용자 인터페이스 (UI)
- 비즈니스 로직
- 데이터베이스 연동
- 외부 시스템과의 통합
기능 테스트의 종류#
- 단위 테스트: 개별 모듈이나 컴포넌트의 기능을 테스트한다.
- 통합 테스트: 여러 모듈이 연동되어 작동하는 기능을 테스트한다.
- 시스템 테스트: 전체 시스템의 기능을 테스트한다.
- 인수 테스트: 사용자의 요구사항 충족 여부를 최종적으로 확인한다.
진행 방식#
- 테스트 계획 수립: 테스트할 기능과 범위를 정의한다.
- 테스트 케이스 작성: 각 기능에 대한 구체적인 테스트 시나리오를 개발한다.
- 테스트 환경 구축: 실제 사용 환경과 유사한 테스트 환경을 준비한다.
- 테스트 실행: 계획된 테스트 케이스에 따라 테스트를 수행한다.
- 결과 분석 및 보고: 발견된 문제점을 기록하고 개발팀에 전달한다.
기능 테스트 작성 시 중요한 점들#
- 테스트 범위 설정 모든 주요 기능과 예외 상황을 포함해야 한다.
- 테스트 데이터 준비 다양한 시나리오를 커버할 수 있는 테스트 데이터를 준비한다.
- 자동화 고려 반복적인 테스트를 자동화하여 효율성을 높인다.
온라인 쇼핑몰 애플리케이션의 기능 테스트를 예로 들어보자:
- 사용자 등록 기능: 새로운 사용자가 계정을 만들 수 있는지 테스트한다.
- 로그인 기능: 등록된 사용자가 로그인할 수 있는지 확인한다.
- 상품 검색 기능: 다양한 검색어로 상품을 찾을 수 있는지 테스트한다.
- 장바구니 기능: 상품을 장바구니에 추가하고 수량을 변경할 수 있는지 확인한다.
- 결제 프로세스: 주문부터 결제 완료까지의 전체 과정이 올바르게 작동하는지 테스트한다.
각 기능에 대해 여러 가지 시나리오를 만들어 테스트한다.
예를 들어, 로그인 기능의 경우:
- 올바른 아이디와 비밀번호로 로그인
- 잘못된 비밀번호로 로그인 시도
- 존재하지 않는 아이디로 로그인 시도
- 비밀번호 5회 오류 시 계정 잠금 확인
이러한 방식으로 모든 기능을 철저히 테스트하여 소프트웨어가 사용자의 기대에 부합하는지 확인한다.
참고 및 출처#
회귀 테스트 (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) 특징과 목적 회귀 테스트의 주요 특징과 목적은 다음과 같다:
...
스모크 테스트 (Smoke 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 import requests import logging class WebAppSmokeTest: def __init__(self, base_url): self.base_url = base_url self.logger = logging.getLogger(__name__) def run_smoke_test(self): """기본 기능 스모크 테스트 실행""" test_results = { "homepage_access": self.test_homepage(), "login_page": self.test_login_page(), "basic_search": self.test_search_functionality(), "server_health": self.test_server_status() } # 테스트 결과 분석 failed_tests = [test for test, result in test_results.items() if result == False] if failed_tests: self.logger.error(f"스모크 테스트 실패: {failed_tests}") return False self.logger.info("모든 스모크 테스트 통과") return True def test_homepage(self): """홈페이지 접속 테스트""" try: response = requests.get(f"{self.base_url}/") return response.status_code == 200 except Exception as e: self.logger.error(f"홈페이지 접속 실패: {str(e)}") return False def test_login_page(self): """로그인 페이지 접속 테스트""" try: response = requests.get(f"{self.base_url}/login") return "로그인" in response.text except Exception as e: self.logger.error(f"로그인 페이지 접속 실패: {str(e)}") return False 특징과 목적 스모크 테스트의 주요 특징과 목적은 다음과 같다:
...