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



