커널 테스트 전략
1) 원칙
피라미드-트로피 균형. 기본-빠른 모듈 식 및 계약 테스트; 위-구성 요소 및 통합; 정점에는 최소이지만 가치있는 e2e 층이 있습니다.
교대 왼쪽. 더 일찍 결함 (린터, 정적 분석, 속성 기반) 을 잡을수록 더 저렴합니다.
디자인에 의한 결정 론적. 우리는 시간, 네트워크, 무작위 및 외부 종속성을 관리합니다.
품질 경제. 모든 테스트는 "보험" 입니다. 목표는 총 비용을 최소화하는 것입니다 (결함 + 테스트 유지 관리).
위험 방향. 적용 범위는 비즈니스 불변 및 프로토콜 (계약, demempotency, 일관성) 에 중점을 둡니다.
2) 테스트 수준 및 책임 영역
2. 1 단위 (모듈 식)
I/O없이 순수한 논리를 확인하십시오.
우리는 경계 (포트/어댑터) 만 적시고 공장을 데이터로 사용합니다.
평행하게 빠른 (자동으로 50 - 100 ms/test).
2. 2 계약 (공급 업체)
서비스간에 수정 된 API 계약 (TH/gRPC/이벤트).
우리는 소비자 중심의 접근 방식을 사용합니다. 계약은 VCS에 저장되고 공급 업체의 CI에 확인됩니다.
통합 e2e의 취약성을 줄입니다.
2. 3 구성 요소 (실제 저장소가있는 모듈 위)
컨테이너 (테스트 컨테이너) 에서 실제 데이터베이스/캐시로 서비스의 일부를 시작합니다.
우리는 스키마 마이그레이션, 인덱스, 트랜잭션, 잠금 장치를 검증합니다.
2. 4 통합/시스템 (서비스 간 종단 간 경로)
우리는 격리 된 환경에서 일련의 서비스를 제공합니다.
트랜잭션성, retrai, demempotency, 오류 처리 등 엔드 투 엔드 불변량을 확인합니다.
2. 5 E2E (최소 "가치" 계층)
"판매와 같이" 실제 프로토콜 및 환경이지만 제한된 시나리오 세트: 결제 → 확인 → 게시; 등록 → 확인 → 항목.
릴리스 및 회귀에 고위험 기능을 사용합니다.
3) 테스트 가능한 아키텍처
포트/어댑터 (6 각형). 비즈니스 커널은 HTT/SQL에 대해 알지 못합니다. 종속성은 인터페이스를 통해 구현됩니다.
시간/무작위의 주입. '시계', '랜덤' - 종속성; 테스트에서 우리는 고칩니다.
구성 가능한 I/O 추상화. 대기열, DB, KMS-테스트 구현과의 인터페이스를 통해.
기능성 불변량. 우리는 사후 조건과 술어를 명시 적으로 공식화합니다. 테스트 및 모니터링이 더 쉽습니다.
4) 테스트 데이터
정적 JSON 설비 대신 공장/빌더: 취약성 감소.
시험 전에 이데올로기 적 종자 및 재설정 후크 DB (이동 → 잘라 내기 → 종자).
사례 카탈로그: "규범", "가장자리", "오류", "혼돈".
실제 PD 대신 합성: 발전기, 마스킹, 개인 정보 보호 프로파일.
5) 경쟁과 치열함
레이스 테스트: 경쟁 항목/보호 구역/잠금 장치.
반복 된 호출은 상태를 변경하지 않습니다.
배신 및 타임 아웃: 일시적인 오류가있을 경우 정확성을 보장합니다.
dedupe_key = hash(op + external_id)
if exists(executions, dedupe_key): return previous_result else:
reserve(dedupe_key)
result = do_operation()
store(executions, dedupe_key, result)
return result
6) 시간, 타임 아웃, 시간대
저장된 모든 시간은 UTC입니다. 테스트에서는 'FixedClock' 을 사용합니다.
DST 사례 (복제/시계 누락), "로컬 데이" 창을 테스트합니다.
우리는 단조 시계로 타임 아웃을 확인합니다. NTP 지터를 시뮬레이션합니다.
7) 탄력성과 혼돈
오류 분사: 네트워크 오류, 5xx, 지연, 부분 저하 (캐시 사용 불가).
사전 프로그램 환경에서의 혼돈 테스트: 노드 분리, 대기열 과부하, BGP/Anycast (에뮬레이션) 중단.
폴백 정책 및 UX 저하: 테스트는 올바른 "우아한 저하" 를 확인해야합니다.
8) 성능
중요 알고리즘에 대한 마이크로 벤치 마크 (CPU/alloc 고정 포함).
로드 프로파일: 메모리 누출에 대한 기준선 (p50/p95), 응력 (피크), 확장 (흡수).
회귀 게이트: p95 대기 시간이 기준선> X% 보다 나쁘면 빌드가 실패합니다.
9) 안전 및 준수
SAST/Lint: 취약점/안티 패턴을 검색하십시오.
DAST/IAST: 스탠드의 기본 시나리오 (XSS/SQLi/SSRF 샘플).
비밀 스캔: 코드 및 아티팩트에 키/암호가 없습니다.
개인 정보 보호 테스트: 로그/추적에 PD가 없음, "동의 관리" 준수, 업로드 용 익명화 프로필.
10) 품질 및 SLO 지표
테스트 합격률 및 벗겨진 색인.
적용 범위 타겟팅:- 중요한 커널 모듈의 경우 90-100%,
- 주변의 경우 70-80% (불변량에 중점을 둔).
- 릴리스 위험 점수: 전체: 중요 파일의 변경 × 낙하 벤치 마크 × 새로운 색조.
- 잘못된 예산: prod-SLO (가동 시간/오류) 와 실험 및 릴리스 빈도의 조합.
11) CI/CD 및 게이트
스테이지 매트릭스:1. 린트/형식/타이프 체크
2. 단위 + 재산 기반
3. 계약 제공 업체/소비자
4. 구성 요소 (테스트 컨테이너)
5. 통합 + Perf 연기
6. 보안 (SAST/Secrets)
7. 빌드/패키지 + SBOM
8. pre-prod + e2e + 혼돈 연기에 배치
게이트: 계약 중단, 대기 시간 증가, 새로운 중요한 취약점.
캐시 및 샤딩: 병렬 처리 및 증분 실행으로 인해 파이프 라인을 가속화합니다 (수정 된 모듈의 경우).
12) 색다른 검사: 탐지 및 치료
Autorun + Quorum (2/3 실행).
플라 키 패턴 검출기: 시간/랜덤/암시 적 기대에 대한 의존성.
SLA와의 검역: 테스트는 릴리스를 차단하지 않지만 N 일 안에 수정/재 작성해야합니다.
중요한 경로의 "핵심" 에서 플럭에 대한 무관 용.
13) 속성 기반, 돌연변이 및 상 테스트
속성 기반: 속성 (정류성, demotonency, monotony), 경계 데이터 생성기를 공식화합니다.
돌연변이 시험: 우리는 시험의 "강도" (도입 된 돌연변이를 죽이는 지 여부) 를 측정합니다.
Fuzzing: 특히 보안 경계에서 프로토콜/파서/형식 (JSON, 프로토 타입, 때문에).
prop "serialize/deserialize roundtrip":
forAll(randomModel()):
decode(encode(model)) == model
14) 관찰 및 시험과의 연관
테스트 추적 (로그의 추적 ID): 사전 프로그램에서 복제하는 것이 편리합니다.
성능 실행 중 메트릭의 스냅 샷은 아티팩트로 저장됩니다.
로그 제어: 민감한 필드가없고 SLO 내의 로그 크기입니다.
15) 문서 및 절차
테스트 핸드북: 어떤 테스트를 실행하는지, 공장을 작성하는 방법, 계약을 업데이트하는 방법.
런북: 재생 사고, 빠른 진단, 롤백 릴리스.
불변량 카탈로그: 시스템 보증 목록 및 관련 테스트/경고 참조.
16) 건축가 점검표
1. 커널 불변량 및 설명 된 중요한 경로?
2. 테스트 레벨과 SLO (시간, 안정성) 매트릭스가 있습니까?
3. 공급 업체와 소비자의 CI에서 계약이 다양하고 검증됩니까?
4. 테스트에서 제어되는 시간/랜덤/네트워크 (FixedClock, Fault-injector)?
5. 변형 된 테스트 컨테이너/격리 된 데이터베이스, 마이그레이션이 확인 되었습니
6. 성능 기준선과 회귀 게이트가 있습니까?
7. SAST/Secrets-scan 및 개인 정보 보호 로그 확인이 활성화되어 있습니까?
8. Flaky가 기록되고 있으며 수정을위한 SLA가 있습니까?
9. 테스트와 prod-SLO 및 잘못된 예산 사이의 연결이 투명합니까?
10. 런북 및 불변 카탈로그가 문서화되어 있습니까?
결론
커널 테스트 전략은 도구 목록이 아니라 테스트 가능한 설계, 엄격한 레벨 계층 구조, 관리 된 데이터, 내결함 및 CI/CD에 내장 된 메트릭과 같은 아키텍처 기능입니다. 설명 된 관행에 따라 팀은 빠르고 안정적인 피드백을 받고 릴리스가 예측 가능하고 안전해집니다.