Python에서 비동기 함수를 모의하는 방법
James Reed
Infrastructure Engineer · Leapcell

Python에서 async
함수를 모의(Mock)하는 것은 비동기 프로그래밍을 활용하는 코드베이스에 대한 단위 테스트를 작성할 때 흔히 필요한 작업입니다. 이 방법은 실제 네트워크 호출, 데이터베이스 쿼리 또는 다른 부작용이 있는 프로세스를 수행하지 않고도 async
작업에 의존하는 함수를 테스트할 수 있도록 합니다.
Async 함수를 모의하는 이유는 무엇일까요?
- 격리: 모의는 테스트 중인 단위를 외부 시스템으로부터 격리하여 테스트가 특정 로직에 집중하도록 돕습니다.
- 성능: 모의는 느린 I/O 작업을 피하므로 테스트가 더 빠르게 실행됩니다.
- 결정성: 모의는 실제 의존성으로 인해 발생할 수 있는 잠재적인 불안정성을 방지합니다.
Async 함수를 모의하기 위한 도구
Python의 unittest.mock
모듈은 AsyncMock
을 통해 비동기 함수에 대한 지원을 포함하여 모의를 위한 유틸리티를 제공합니다. Python 3.8 이상을 사용하는 경우 AsyncMock
이 권장되는 접근 방식입니다. 이전 버전의 경우 MagicMock
을 조정하여 async
함수를 모의할 수 있습니다.
Key Takeaways
async
함수를 모의하면 실제 의존성을 피하여 테스트를 격리하고 성능을 향상시킵니다.AsyncMock
은 Python 3.8 이상에서 모의에 권장되는 도구입니다.- 테스트 신뢰성과 명확성을 유지하기 위해 과도한 모의를 피하십시오.
AsyncMock
으로 Async 함수 모의하기
AsyncMock
을 사용하여 async
함수를 모의하는 단계별 가이드는 다음과 같습니다.
import unittest from unittest.mock import AsyncMock, patch # 테스트할 함수 def process_data(data_fetcher): async def wrapper(): data = await data_fetcher() return f"Processed: {data}" return wrapper class TestProcessData(unittest.TestCase): @patch("path.to.data_fetcher", new_callable=AsyncMock) def test_process_data(self, mock_fetcher): # 특정 값을 반환하도록 모의를 구성합니다. mock_fetcher.return_value = "Mocked Data" # 함수 테스트 async def test_logic(): result = await process_data(mock_fetcher)() self.assertEqual(result, "Processed: Mocked Data") # 비동기 테스트 실행 import asyncio asyncio.run(test_logic()) if __name__ == "__main__": unittest.main()
핵심 사항:
async
함수를 패치할 때new_callable=AsyncMock
을 사용하십시오..return_value
를 사용하여 모의 반환 값을 구성하십시오.- 비동기 로직을 테스트하려면 테스트 함수가 이벤트 루프 내에서 실행되는지 확인하십시오.
이전 Python 버전에 MagicMock
사용
3.8 이전의 Python 버전을 사용하는 경우 MagicMock
을 사용하여 async
동작을 시뮬레이션할 수 있습니다.
from unittest.mock import MagicMock # MagicMock으로 async 함수 모의하기 mock_fetcher = MagicMock() mock_fetcher.return_value = "Mocked Data" mock_fetcher.__aenter__.return_value = "Mocked Data" async def test(): result = await mock_fetcher() print(result) # 출력: Mocked Data import asyncio asyncio.run(test())
MagicMock
을 사용할 수 있지만 async
함수를 모의하는 데 AsyncMock
에 비해 덜 직관적이고 덜 강력합니다.
토론
- 언제 모의해야 할까요?: 모의는 절제해서 사용해야 하며 테스트 중인 단위의 외부 구성 요소에만 사용해야 합니다. 과용하면 깨지기 쉬운 테스트가 될 수 있습니다.
- 모의의 대안: 모의 대신 의존성에 대해 메모리 내 대체 또는 경량 페이크를 사용하는 것을 고려하십시오.
- 테스트 가독성: 모의 및 테스트 설정이 명확하고 표현력이 있는지 확인하십시오. 복잡한 모의는 테스트의 목적을 가릴 수 있습니다.
FAQs
AsyncMock
은 async
함수를 모의하도록 설계되었으며 MagicMock
은 비동기 동작에 대한 추가 구성이 필요합니다.
아니요, AsyncMock
은 Python 3.8 이상에서만 사용할 수 있습니다. 대신 MagicMock
을 사용하십시오.
asyncio.run()
을 사용하여 이벤트 루프 내에서 async
테스트 로직을 실행합니다.
결론
Python에서 async
함수를 모의하면 비동기 코드의 효과적인 테스트가 가능합니다. AsyncMock
은 Python 3.8+에서 이 프로세스를 단순화하지만 이전 버전에서는 MagicMock
을 사용하여 유사한 결과를 얻을 수 있습니다. 모범 사례를 따르고 과도한 모의를 피함으로써 비동기 Python 코드에 대한 유지 관리 가능하고 신뢰할 수 있는 테스트 스위트를 만들 수 있습니다.
Leapcell은 Python 프로젝트를 클라우드에 배포하기 위한 최고의 선택입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무료로 무제한 프로젝트 배포
- 사용량에 대해서만 지불하십시오. 요청도 없고 요금도 없습니다.
탁월한 비용 효율성
- 유휴 요금 없이 사용한 만큼만 지불하십시오.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅。
손쉬운 확장성 및 고성능
- 손쉽게 높은 동시성을 처리하기 위한 자동 확장.
- 제로 운영 오버헤드 — 구축에만 집중하십시오.
설명서에서 자세히 알아보십시오!
X에서 팔로우하세요: @LeapcellHQ