속성 기반 테스트를 통한 정확성¶
"사양 정확성"은 근본적인 질문에 답하는 데 도움이 됩니다: 구현이 실제로 지정한 대로 수행됩니까? AI가 코드를 생성할 때 의도와 일치하는지 어떻게 알 수 있습니까?
개념¶
속성 기반 테스트(Property-Based Testing)는 AI로 정확성에 대해 생각하는 방식의 근본적인 변화를 향한 단계로, 개별 예제를 확인하는 것에서 전체 입력 공간에 걸쳐 보편적 속성을 검증하는 것으로 이동합니다. 전통적인 단위 테스트는 특정 예제만 확인하며, 작성하는 사람(인간이든 AI든)은 자신의 편향에 제한됩니다. 자연어 사양을 실행 가능한 속성으로 자동 변환하고 포괄적인 테스트 케이스를 생성함으로써 Kiro는 AI 에이전트와 인간 개발자 모두가 더 안정적인 소프트웨어를 구축하는 데 도움이 되는 강력한 피드백 루프를 만듭니다. 이 접근 방식은 전통적인 테스트가 놓치는 버그를 찾을 뿐만 아니라 요구 사항과 이를 검증하는 테스트 간의 명확하고 추적 가능한 링크를 유지합니다.
PBT가 모든 버그의 부재를 보장할 수는 없지만, 예제 기반 테스트만으로는 얻을 수 없는 훨씬 더 강력한 정확성 증거를 제공하여 사양 기반 개발을 위한 필수 도구가 됩니다.
속성이란 무엇인가요?¶
속성은 시스템이 어떻게 동작해야 하는지에 대한 보편적 진술입니다. 속성은 관련된 특정 데이터에 관계없이 시스템에서 항상 참이어야 하는 불변성과 계약을 표현합니다.
특정 전제 조건이 유지되는 모든 입력 집합에 대해 일부 예상 동작이 참입니다.
Kiro 사양 세계에서 이는 EARS 요구 사항과 잘 매핑됩니다:
"인증된 모든 사용자와 활성 목록에 대해 사용자는 해당 목록을 볼 수 있습니다." 이것은 모든 유효한 시나리오에서 유지되어야 하는 시스템 동작에 대한 일반적인 규칙을 캡처합니다.
속성 기반 테스트 작동 방식¶
자동차 판매 앱을 고려해보세요:
- 전통적인 테스트: 사용자가 자동차 #5를 즐겨찾기에 추가하면 자동차 #5가 목록에 나타납니다
- 속성 기반 테스트: 모든 사용자와 모든 자동차에 대해 WHEN 사용자가 자동차를 즐겨찾기에 추가할 때 THE System SHALL 목록에 표시합니다
PBT는 사용자 A가 자동차 #1을 추가하고, 사용자 B가 자동차 #500을 추가하고, 이름에 특수 문자가 있는 사용자, 다양한 상태의 자동차 및 수백 가지 조합을 더 자동으로 테스트하여 엣지 케이스를 포착하고 구현이 의도와 일치하는지 확인합니다.
이 프로세스 전반에 걸쳐 PBT는 "축소(shrinking)"를 통해 반례를 찾기 위해 탐색합니다. 거의 레드 팀이 코드를 망가뜨리려고 하는 것과 같습니다. 위반을 발견하면 Kiro는 자동으로 구현을 업데이트하거나 사양, 구현 또는 테스트 자체를 수정할 옵션을 제시할 수 있습니다.
형식적 검증은 아니지만 PBT는 수동으로 작성하지 않을 시나리오에 걸쳐 정확성에 대한 증거를 제공하여 구현이 정의한 대로 실제로 동작하는지 보여줍니다.
사양을 통한 속성 기반 테스트¶
Kiro는 요구 사항부터 구현 검증까지 사양 워크플로우 전반에 걸쳐 속성 기반 테스트를 통합합니다.
워크플로우¶
mermaid-3okved{font-family:inherit;font-size:14px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-3okved .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-3okved .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-3okved .error-icon{fill:#a44141;}#mermaid-3okved .error-text{fill:#ddd;stroke:#ddd;}#mermaid-3okved .edge-thickness-normal{stroke-width:1px;}#mermaid-3okved .edge-thickness-thick{stroke-width:3.5px;}#mermaid-3okved .edge-pattern-solid{stroke-dasharray:0;}#mermaid-3okved .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-3okved .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-3okved .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-3okved .marker{fill:#52525b;stroke:#52525b;}#mermaid-3okved .marker.cross{stroke:#52525b;}#mermaid-3okved svg{font-family:inherit;font-size:14px;}#mermaid-3okved p{margin:0;}#mermaid-3okved .label{font-family:inherit;color:#fafafa;}#mermaid-3okved .cluster-label text{fill:#F9FFFE;}#mermaid-3okved .cluster-label span{color:#F9FFFE;}#mermaid-3okved .cluster-label span p{background-color:transparent;}#mermaid-3okved .label text,#mermaid-3okved span{fill:#fafafa;color:#fafafa;}#mermaid-3okved .node rect,#mermaid-3okved .node circle,#mermaid-3okved .node ellipse,#mermaid-3okved .node polygon,#mermaid-3okved .node path{fill:#18181b;stroke:#ccc;stroke-width:1px;}#mermaid-3okved .rough-node .label text,#mermaid-3okved .node .label text,#mermaid-3okved .image-shape .label,#mermaid-3okved .icon-shape .label{text-anchor:middle;}#mermaid-3okved .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-3okved .rough-node .label,#mermaid-3okved .node .label,#mermaid-3okved .image-shape .label,#mermaid-3okved .icon-shape .label{text-align:center;}#mermaid-3okved .node.clickable{cursor:pointer;}#mermaid-3okved .root .anchor path{fill:#52525b!important;stroke-width:0;stroke:#52525b;}#mermaid-3okved .arrowheadPath{fill:lightgrey;}#mermaid-3okved .edgePath .path{stroke:#52525b;stroke-width:2.0px;}#mermaid-3okved .flowchart-link{stroke:#52525b;fill:none;}#mermaid-3okved .edgeLabel{background-color:#09090b;text-align:center;}#mermaid-3okved .edgeLabel p{background-color:#09090b;}#mermaid-3okved .edgeLabel rect{opacity:0.5;background-color:#09090b;fill:#09090b;}#mermaid-3okved .labelBkg{background-color:rgba(9, 9, 11, 0.5);}#mermaid-3okved .cluster rect{fill:#18181b;stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mermaid-3okved .cluster text{fill:#F9FFFE;}#mermaid-3okved .cluster span{color:#F9FFFE;}#mermaid-3okved div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:inherit;font-size:12px;background:#09090b;border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mermaid-3okved .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mermaid-3okved rect.text{fill:none;stroke-width:0;}#mermaid-3okved .icon-shape,#mermaid-3okved .image-shape{background-color:#09090b;text-align:center;}#mermaid-3okved .icon-shape p,#mermaid-3okved .image-shape p{background-color:#09090b;padding:2px;}#mermaid-3okved .icon-shape rect,#mermaid-3okved .image-shape rect{opacity:0.5;background-color:#09090b;fill:#09090b;}#mermaid-3okved .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-3okved .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-3okved :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}¶
요구 사항
속성 추출
작업에 추가
테스트 실행
실패 식별
수정 및 검증
Kiro는 EARS 형식의 요구 사항(예: "THE System SHALL 인증된 사용자가 활성 자동차 목록을 볼 수 있도록 허용합니다")에서 속성을 추출하고 논리적으로 테스트할 수 있는 항목을 결정한 다음 실행하기로 선택하면 수백 또는 수천 개의 무작위 테스트 케이스를 생성합니다.
설계 단계¶
설계 단계에서 Kiro는 요구 사항에서 속성을 추출하고 테스트 케이스를 생성합니다. 이것은 Kiro가 요구 사항을 분석하고 테스트할 수 있는 속성을 식별하는 워크플로우의 첫 번째 단계입니다.

속성 위로 마우스를 가져가면 원래 요구 사항 및 연결된 작업과의 연결이 표시됩니다.

작업 실행¶
실행 단계에서 Kiro는 구현에 대해 생성된 PBT 케이스를 실행합니다. 참고: PBT는 기본적으로 선택 사항이므로 먼저 핵심 구현에 집중할 수 있습니다. 속성 테스트가 실행되면 생성된 코드에 대한 참조를 볼 수 있습니다.

속성 테스트가 실패하면 Kiro는 특정 실패 시나리오를 식별하고 검토를 위해 표시합니다.

그런 다음 Kiro와 채팅하여 실패를 이해하고 구현 업데이트, 테스트 조정 또는 요구 사항 자체 개선 등 적절한 수정을 결정할 수 있습니다.
