Dart 및 Flutter 테스트 커버리지 구현하기
목차
테스트 기본
표준 Dart 테스트 패러다임을 사용하여 테스트 스위트를 구성합니다. Dart 프로젝트에서는 package:test를, Flutter 프로젝트에서는 flutter_test를 사용합니다.
- 단위 테스트: 개별 함수, 메서드 또는 클래스를 검증합니다.
- 컴포넌트/위젯 테스트: 모의 객체(
package:mockito)를 사용하여 컴포넌트 동작, 레이아웃 및 상호작용을 검증합니다. - 통합 테스트: 시뮬레이션 또는 실제 기기에서 전체 앱 흐름을 검증합니다.
커버리지 지시문
인라인 주석을 사용하여 커버리지 측정 대상에서 특정 라인, 블록 또는 전체 파일을 제외합니다. 포맷팅 시 --check-ignore 플래그를 전달하여 이러한 지시문을 강제할 수 있습니다.
- 한 줄 무시:
// coverage:ignore-line - 코드 블록 무시:
// coverage:ignore-start및// coverage:ignore-end - 전체 파일 무시:
// coverage:ignore-file
워크플로우: 커버리지 보고서 구성 및 생성
다음 순차적 워크플로우에 따라 coverage 패키지를 추가하고, 테스트를 실행하며, LCOV 보고서를 생성합니다.
작업 진행 체크리스트:
- 1.
coverage를dev_dependency로 추가합니다. - 2. 자동화된 커버리지 스크립트를 실행합니다.
- 3. LCOV 출력을 검증합니다.
1. 의존성 추가
coverage 패키지를 프로젝트의 dev_dependency로 추가합니다. 일반 의존성에 추가하지 마십시오.
표준 Dart 프로젝트인 경우:
dart pub add dev:coverage
Flutter 프로젝트인 경우:
flutter pub add dev:coverage
2. 커버리지 수집 및 LCOV 생성
번들된 test_with_coverage 스크립트를 사용합니다. 이 스크립트는 모든 테스트를 자동으로 실행하고, Dart VM에서 JSON 커버리지 데이터를 수집한 후 LCOV 보고서로 포맷팅합니다.
dart run coverage:test_with_coverage
참고: Dart 워크스페이스(모노레포)에서 작업하는 경우 테스트 디렉터리를 명시적으로 지정하십시오(예: dart run coverage:test_with_coverage -- pkgs/foo/test pkgs/bar/test).
3. 피드백 루프: 출력 검증
검증기 실행 -> 오류 검토 -> 수정:
- 프로젝트 루트에
coverage/디렉터리가 생성되었는지 확인합니다. coverage/coverage.json(원시 데이터)과coverage/lcov.info(포맷팅된 보고서) 파일이 존재하는지 확인합니다.- 특정 파일에 대한 커버리지가 누락된 경우, 해당 파일이 테스트 파일에서 임포트되어 실행되는지 확인하거나, 의도적으로 제외하려면
// coverage:ignore-file을 추가합니다.
워크플로우: 고급 수동 컬렉션
VM 서비스, 격리 일시 중지에 대한 세밀한 제어가 필요하거나 브랜치/함수 수준의 커버리지가 필요한 경우 수동 컬렉션 워크플로우를 사용합니다.
작업 진행 체크리스트:
- 1. VM 서비스를 활성화하여 테스트를 실행합니다.
- 2. 원시 JSON 커버리지를 수집합니다.
- 3. JSON을 LCOV로 포맷팅합니다.
1. VM 서비스로 테스트 실행
종료 시 격리를 일시 중지하고 특정 포트(예: 8181)에서 VM 서비스를 노출하여 테스트를 실행합니다.
dart run --pause-isolates-on-exit --disable-service-auth-codes --enable-vm-service=8181 test &
2. 원시 커버리지 수집
실행 중인 VM 서비스에서 커버리지 데이터를 추출하여 JSON 파일에 출력합니다.
dart run coverage:collect_coverage --wait-paused --uri=http://127.0.0.1:8181/ -o coverage/coverage.json --resume-isolates
선택 사항: --function-coverage 및 --branch-coverage를 추가하여 더 깊은 메트릭을 수집할 수 있습니다(Dart VM 2.17.0+ 필요).
3. LCOV로 포맷팅
원시 JSON 데이터를 표준 LCOV 형식으로 변환합니다.
dart run coverage:format_coverage --packages=.dart_tool/package_config.json --lcov -i coverage/coverage.json -o coverage/lcov.info --check-ignore
예제
예제: pubspec.yaml 구성
pubspec.yaml에 coverage 패키지가 반드시 dev_dependencies 아래에만 포함되도록 하십시오.
name: my_dart_app
environment:
sdk: ^3.0.0
dependencies:
path: ^1.8.0
dev_dependencies:
test: ^1.24.0
coverage: ^1.15.0
예제: 무시 지시문 적용
무시 지시문을 사용하여 생성된 코드나 테스트 불가능한 경계 조건이 커버리지 점수를 낮추지 않도록 합니다.
// coverage:ignore-file
import 'package:meta/meta.dart';
class SystemConfig {
final String env;
SystemConfig(this.env);
// coverage:ignore-start
void legacyInit() {
print('사용되지 않는 초기화');
}
// coverage:ignore-end
bool isProduction() {
if (env == 'prod') return true;
return false; // coverage:ignore-line
}
}