테스트 실행
pyrs-yaml는 Rust 유닛 테스트와 Python 통합 테스트를 모두 보유하고 있습니다.
Rust 테스트¶
Rust 테스트 실행
# 모든 Rust 테스트를 nextest로 실행 (권장)
cargo nextest run --all
# 모든 Rust 테스트를 cargo test로 실행
cargo test --all
# 순수 Rust 코어 테스트 실행 (Python 런타임 불필요)
cargo test --all --no-default-features
# 출력과 함께 실행
cargo test --all -- --nocapture
테스트 커버리지¶
crates/pyrs-yaml-core/src/ast.rs— 노드 구성, 메타데이터, 동등성crates/pyrs-yaml-core/src/parser/— 다양한 YAML 구조 파싱crates/pyrs-yaml-core/src/serializer.rs— 직렬화 순환 보존crates/pyrs-yaml-core/src/editing/— 편집 프리미티브 (navigate, region, dirty, metadata)crates/pyrs-yaml-core/src/integration/— YAML Test Suite 통합crates/pyrs-yaml/src/fidelity.rs— 속성 기반 퍼즈 테스트
Python 테스트¶
Python 테스트 실행
# 모든 Python 테스트 실행
uv run pytest tests/ -v
# 특정 테스트 파일 실행
uv run pytest tests/test_edit.py -v
# 특정 테스트 클래스 실행
uv run pytest tests/test_node_api.py::TestDocWalk -v
# 커버리지와 함께 실행
uv run pytest tests/ -v --cov=pyrs_yaml
# 규정 준수 스위트 실행
uv run pytest tests/test_yaml_suite.py -v
# 벤치마크 실행
uv run pytest tests/ --codspeed
테스트 파일¶
| 파일 | 커버리지 |
|---|---|
test_parse.py |
파싱, 데이터 타입, 특수 문자 |
test_serialize.py |
직렬화, 순환 보존 |
test_edge_cases.py |
엣지 케이스, 오류 처리 |
test_errors.py |
사용자 정의 예외 타입, 파일 I/O |
test_features.py |
Markdown Front Matter, from_dict/from_json |
test_json.py |
JSON ↔ YAML 변환 |
test_tabs.py |
탭 처리 |
test_yaml_suite.py |
YAML Test Suite 통합 |
test_performance.py |
성능 건전성 검사 |
test_numpy.py |
NumPy ndarray 직렬화 (0차원~N차원, 모든 dtype) |
Maturin 빌드¶
빌드 및 설치
# 빌드 및 설치 (모노레포 manifest-path 사용)
uv run maturin develop --release
# .pyi 파일용 스텁 생성
uv run maturin build --release --generate-stubs
CI 테스트¶
GitHub Actions가 모든 푸시와 PR에서 실행:
- Rust:
cargo nextest run --all,cargo clippy --all -- -D warnings,cargo fmt --check - Python: 4개 Python 버전 × 3개 OS에서
uv run pytest tests/ - Maturin: 각 Python 버전용 wheel 빌드 (
crates/pyrs-yaml/Cargo.toml경로 사용)
새 테스트 추가¶
Rust 테스트¶
Rust 테스트 템플릿
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_feature() {
// 테스트를 여기에 작성
}
}
Python 테스트¶
Python 테스트 템플릿
import pyrs_yaml
import pytest
class TestNewFeature:
def test_basic(self):
result = pyrs_yaml.parse("key: value")
assert result.get("key") == "value"
def test_edge_case(self):
# 엣지 케이스 테스트
pass
테스트 카테고리¶
- 유닛 테스트 — 개별 함수, 작은 입력
- 통합 테스트 — 완전한 파싱 → 직렬화 순환 보존
- 엣지 케이스 테스트 — 특수 문자, 빈 입력, 잘못된 형식의 YAML
- 성능 테스트 — 건전성 검사 (벤치마크 아님)
- YAML Test Suite — YAML 호환성을 위한 외부 테스트 스위트
YAML Test Suite 알려진 차이점¶
스위트 통과율은 95%로 제한됩니다 (test_compliance_report 참조). 소수의 케이스는 의존적으로 추구하지 않습니다. 이들을 거부하는 것이 사양에 맞으며 참조 파서(특히 PyYAML/libyaml)와 일치하기 때문입니다:
| ID | 입력 | 차이점으로 수락된 이유 |
|---|---|---|
ZYU8 |
%YAML 1.1 1.2 |
버전 지시어 뒤에 오는 콘텐츠는 YAML 1.2 문법(ns-yaml-version ::= ns-dec-digit+ '.' ns-dec-digit+)에 따라 유효하지 않습니다. PyYAML도 거부합니다. 스위트 자체의 참고 사항에서 이러한 지시어 변형은 "전혀 유용하게 유효하지 않으며" 이를 지원하는 것이 권장되지 않습니다. |
다른 모든 스위트 케이스는 통과합니다 (현재 405/406 = 99.75%).