단위 대 통합 테스트
1) 테스트 유형을 구별하는 이유
테스트의 적절한 과립화로 개발이 예측 가능해졌습니다. 단위 캐치 논리 결함이 빠르고 저렴합니다. 통합은 모듈 묶음, 실제 전송 및 접착제 번들을 점검합니다. "함께 회귀를 줄이고 방출을 가속화합니다.
2) 정의와 경계
단위 테스트
작은 동작 단위 (기능, 클래스, 사용 사례) 를 단독으로 테스트합니다.
외부 종속성이 교체됩니다 (mock/stub/fake).
빠른 (ms-tens of ms), 결정 론적.
통합 테스트
데이터베이스, 브로커 (Kafka/RabbitMQ), TP/gRPC, 파일 시스템, 캐시 등 여러 실제 구성 요소의 상호 작용을 확인합니다.
최소 mocs, 실제 프로토콜.
느리게 (수백 ms- 초) 지원이 더 비쌉니다.
3) 피라미드 테스트 (얼음 뿔이 아님)
재단: 단위 (70-80%) -저렴하고 빠릅니다.
중간 계층: 통합/구성 요소 (15-25%) - 중요한 경로 및 계약.
상단: E2E/UX/Exploratory (5-10%) -최소한으로 충분합니다.
측면: 품질 증폭기로서의 정적 분석/린트/유형 점검 및 돌연변이 테스트.
4) 단위 제공 및 통합 대상
5) 데이터 및 수정
단위
인라인 픽션/빌더 (공장 방법).
경계 값에 대한 테이블 중심 테스트.
불변에 대한 속성 기반 접근 방식 (예: "직불 합계 = 크레딧 합계").
통합
밀폐 환경: 테스트 컨테이너/Docker Compose는 'postgres + redis + kafka + wiremock' 을 올립니다.
데이터베이스/캐시의 초기 시드 및 이후 정리 (트랜잭션/롤백, 잘림).
시계/타이머는 가짜 (제어) 입니다. 그렇지 않으면 플랙입니다.
6) 도구 및 패턴
Mocks/Stubs/Fakes/Spies:- 스터브는 고정 된 답변입니다 (저렴한).
- 모의-상호 작용/통화 수를 확인하십시오.
- 가짜는 단순화 된 구현입니다 (예: In-Memory Repo).
- 계약 테스트 (CDC): Pact/Swagger 기반-고객의 기대치를 수정하고 공급자를 확인하십시오.
- WireMock/MockServer-타사 서비스를위한 HTT 스터브.
- 테스트 컨테이너는 "동물원" 이없는 로컬 및 CI의 라이브 DB/브로커입니다.
7) 예
7. 1 단위: 지불 이데올로기 (의사 코드)
python def test_idempotent_create_payment_returns_same_id():
repo = InMemoryPayments()
service = Payments(repo)
first = service. create(amount=100, key="abc")
second = service. create(amount=100, key="abc")
assert first. id == second. id assert repo. count() == 1
7. 2 통합: 웹훅 시그니처 (HMAC) + 반복
bash docker-compose: app + redis + wiremock (PSP)
docker compose -f docker-compose. test. yml up -d pytest -m "integration and webhook" -q
테스트:
- WireMock은 'X-Timestamp' 및 서명이있는 이벤트를 제공합니다.
- 응용 프로그램은 '이벤트 _ id' 로 중복되는 HMAC를 확인하고 5 초 후에 반복하면 두 배가되지 않습니다.
- 우리는 '200' 을 확인하고 항목이 하나뿐입니다.
7. 3 CDC: 공급자와의 고객 계약
클라이언트는 협정을 생성합니다 (대기: 'POST/v1/payout' → '201' 다이어그램).
CI의 제공 업체는 계약 상태를 확인합니다.
8) 속도, 병렬 처리, 플레이크
장치는 테스트 당 <100ms를 실행해야합니다. 패킷-초
통합 - 컨테이너/포트에 의해 병렬; 시작 마이그레이션 사용.
색다른 해독제:- 제어 된 시간 (가짜 시계),
- "수면" 이 아닌 명시 적 사건에 의한 기대
- 안정적인 임계 값 (지터 테스트가있는 retrai).
9) 품질 지표
적용 범위 (줄/분기): 추세를 관찰하는 데 유용하지만 대상은 관찰하지 않습니다.
돌연변이 테스트 (PIT/Mutmut): 암살자의 실제 힘인 잘못된 변화를 "죽이는" 지 여부를 보여줍니다.
테스트 기간 및 색다른 속도: 성장시 경고.
격리 결함: 생산 전에 차단 된 버그의 비율.
10) CI/CD에 포함
작업: 단위 → 통합 → e2e (서비스 별 팬 아웃).
데이터베이스/언어/버전별 종속 캐시, 병렬 행렬.
보고서: JUnit/Allure + 컨테이너 로그 아티팩트 (방울).
게이트: "녹색 단위 + 임계 통합" - 병합 조건; e2e-야간.
yaml strategy:
matrix:
db: [postgres14, postgres16]
steps:
- run: docker run -d --name db -e POSTGRES_PASSWORD=pw postgres:${{ matrix. db }}
- run: pytest -m "unit" -q
- run: pytest -m "integration" -q
11) 마이크로 서비스 및 이벤트
서비스 계약: OpenAPI/Protoqua가 버전으로 표시됩니다. 호환성 테스트 (후진).
이벤트 중심:- 단위: 도메인 이벤트 매핑 및 불변.
- 통합: 실제 중개인 (Kafka) 의 출판/구독, 아웃 박스/받은 편지함 의미론, 정확히 한 번 모방 (적어도-demempotent).
- 주문 외 테스트.
12) 통합 데이터 및 격리
각 테스트 → 고유 한 스키마/데이터베이스 (테스트 컨테이너 JDBC IM '? TC _ TMPFS =/var/lib/postgresql/data: rw ').
거래 수정 (실행 → 롤백 시작) 청소 속도 향상.
Redis/cash의 경우 주요 접두사는 'test: $ {RUN _ ID}:' 및 'FLUSHDB' in 분해입니다.
13) iGaming/Finance의 세부 사항
돈과 한도: 불변량에 대한 속성 기반 테스트 (밸런스 3, 총 제한).
규제: 로깅 점검 (감사 로그가 작성 됨), 변경할 수없는 이벤트.
결제/PSP: HMAC/mSL 통합 테스트, '재시도 후', demempotency, dedup 'jti'.
책임있는 플레이: 임계 값/쿨 다운 규칙 테스트; 가짜 시계의 "vchera → segodnya".
14) 안티 패턴
DB/HTTP를 높이는 "단위" 는 이미 통합되어 있습니다 (레이어를 혼동하고 CI를 느리게합니다).
빈 문으로 인한 높은 적용 범위 ("덮었지만 확인하지 않음").
계약이 필요한 타사 서비스의 모키 논리 (업데이트시 중단).
이벤트/조건 기대 대신 '수면 (5)' 으로 테스트하십시오.
병렬 테스트 → 레이스 및 플레이크에 대한 일반적인 테스트 데이터베
15) Prod 준비 점검표
- 피라미드는 런타임별로 단위/통합/E2E 및 대상 주식의% 로 정의됩니다.
- 단위는 분리되고 빠르며 경계 값과 불변량을 포함합니다.
- 통합은 공통 상태없이 밀폐 환경 (테스트 컨테이너/컴퓨터) 을 사용합니다.
- 계약 테스트 (OpenAPI/Pact) 는 CI에서 검증됩니다.
- 테스트 데이터-관리: 시드/롤백/접두사, 가짜 시계.
- 병렬 실행, JUnit/Allure 보고서, 컨테이너 로그 아티팩트.
- 측정: 지속 시간, 색다른 속도, 돌연변이 점수; 열화에 대한 경고.
- 지불/웹 후크 시나리오: HMAC/mSL, retrai, demempotency, 데드 업.
- 전략 문서 및 샘플 테스트 템플릿.
16) TL; DR
단위 - 최대 논리, 최소 환경; 통합 - 최소 모크, 최대 사실주의. 피라미드를 잡으십시오: 고속 장치는 결함의 80% 를 포착하고 통합은 번들 및 계약을 확인합니다. 밀폐 용기, 계약 테스트, 가짜 시계 및 병렬 처리를 사용하십시오. 적용 범위뿐만 아니라 돌연변이 점수 및 색다른 속도도 측정하십시오. 특히 서명, 배상 및 demotency와 같은 결제/웹 후크 경로를 확인하십시오.