unit test에 대한 포스팅을 했었는데 작업하다 보시면 부족한 부분을 많이 느끼실 껍니다. 그래서 가상 객체를 사용하는 unit test mock 에 대한 포스팅을 하려고 합니다.
unittest.mock
(Python Document)는 Python의 unittest
모듈에 포함된 기능으로, 테스트 중 특정 객체나 함수를 대체하여 동작을 모방(mock)할 수 있는 도구입니다. 이를 사용하면 외부 의존성을 최소화하는 모듈입니다.
주요 메서드 및 속성
mock.return_value
: Mock 함수의 반환값 설정.mock.side_effect
: Mock 함수 호출 시 실행할 동작이나 예외 설정.mock.call_count
: Mock 함수 호출 횟수.mock.assert_called_with()
: 특정 인자로 호출되었는지 확인.mock.reset_mock()
: 호출 기록 초기화.
Unit test mock Code
external_service.py
#pip install unittest
# external_service.py
class ExternalService:
def fetch_data(self):
# Perform complex tasks that pull data from external services
pass
class DataProcessor:
def __init__(self, service):
self.service = service
def process(self):
data = self.service.fetch_data()
return f"Processed {data}"
test_data_processor.py
# test_data_processor.py
import unittest
from unittest.mock import Mock
from external_service import ExternalService, DataProcessor
class TestDataProcessor(unittest.TestCase):
def test_process(self):
mock_service = Mock(spec=ExternalService)
mock_service.fetch_data.return_value = "mock data"
processor = DataProcessor(mock_service)
result = processor.process()
self.assertEqual(result, "Processed mock data")
mock_service.fetch_data.assert_called_once()
if __name__ == '__main__':
unittest.main()
Output
.
----------------------------------------------------------------------
Ran 1 test in 0.004s
OK
테스트를 하다 보면 화이트박스 테스트와 블랙박스 테스트를 하게 됩니다. 간단히 두가지에 대해서 알아보겠습니다.
화이트 박스 테스트 (White Box Testing)
화이트 박스 테스트는 코드의 내부 구조, 설계 및 구현을 검사하는 테스트 방식입니다. 프로그램의 내부 작업 방식에 초점을 맞추며, 주로 개발자에 의해 수행됩니다.
종류
- 단위 테스트 (Unit Testing)
- 가장 작은 코드 단위(함수 또는 메소드)를 테스트합니다.
- 각 함수가 예상대로 정확하게 작동하는지 검증합니다.
- 통합 테스트 (Integration Testing)
- 코드의 여러 모듈이나 단위가 함께 잘 작동하는지 확인합니다.
- 모듈 간 인터페이스와 데이터 흐름을 검사합니다.
- 시스템 테스트 (System Testing)
- 완전히 통합된 소프트웨어 시스템이 요구 사항을 충족하는지 테스트합니다.
- 종합적인 검증을 위해 전체 시스템의 기능과 성능을 평가합니다.
- 회귀 테스트 (Regression Testing)
- 코드 변경 후 기존의 기능이 여전히 올바르게 작동하는지 확인합니다.
- 변경이 기존 시스템에 부정적인 영향을 미치지 않는지 검사합니다.
블랙 박스 테스트 (Black Box Testing)
블랙 박스 테스트는 프로그램의 내부 구조나 작동 원리에 대한 지식 없이, 외부에서 보이는 기능만을 테스트하는 방식입니다. 사용자의 관점에서 기능이 요구 사항과 일치하는지 확인합니다.
종류
- 기능 테스트 (Functional Testing)
- 소프트웨어의 각 기능이 사양대로 작동하는지 확인합니다.
- 입력에 대한 출력을 검증하며, 사용자 요구 사항의 충족 여부를 중점적으로 평가합니다.
- 비기능 테스트 (Non-Functional Testing)
- 시스템의 성능, 사용 편의성, 보안 등 비기능적 요소를 평가합니다.
- 예: 성능 테스트, 보안 테스트, 호환성 테스트 등
- 사용성 테스트 (Usability Testing)
- 실제 사용자가 시스템을 쉽고 효율적으로 사용할 수 있는지 평가합니다.
- 사용자 인터페이스와 사용자 경험(UX)의 적합성을 검사합니다.
- 인수 테스트 (Acceptance Testing)
- 최종 사용자 또는 고객이 소프트웨어를 검토하고 승인하는 과정입니다.
- 실제 운영 환경에서 소프트웨어가 요구 사항을 만족하는지 확인합니다.
저는 개인적으로 화이트박스 테스트를 시니어 개발자가 완벽하게 해낸다면, 블랙박스 테스트에서 부담이 줄어든다고 생각합니다. 다만 “화이트박스 테스트를 완벽하게 할 필요가 있냐?” 라는 부분은 좀 의견이 갈릴 수 있을 것 같습니다.