Files
superport/TEST_PROGRESS.md
JiWoong Sul 198aac6525
Some checks failed
Flutter Test & Quality Check / Test on macos-latest (push) Has been cancelled
Flutter Test & Quality Check / Test on ubuntu-latest (push) Has been cancelled
Flutter Test & Quality Check / Build APK (push) Has been cancelled
test: 통합 테스트 오류 및 경고 수정
- 모든 서비스 메서드 시그니처를 실제 구현에 맞게 수정
- TestDataGenerator 제거하고 직접 객체 생성으로 변경
- 모델 필드명 및 타입 불일치 수정
- 불필요한 Either 패턴 사용 제거
- null safety 관련 이슈 해결

수정된 파일:
- test/integration/screens/company_integration_test.dart
- test/integration/screens/equipment_integration_test.dart
- test/integration/screens/user_integration_test.dart
- test/integration/screens/login_integration_test.dart
2025-08-05 20:24:05 +09:00

13 KiB

Flutter 테스트 자동화 진행 상황

📅 작업 요약

  • 목표: 각 화면의 버튼 클릭, 서버 통신, 데이터 입력/수정/저장 등 모든 액션에 대한 테스트 자동화
  • 진행 상황: Phase 4 진행 중 (Integration 테스트 구현)

완료된 작업

1. Phase 1: 프로젝트 분석 및 설정 (완료)

  • 코드베이스 분석 및 프로젝트 구조 파악
  • 모든 화면(Screen/Page) 파일 식별 및 목록화
  • API 서비스 및 네트워크 통신 구조 분석
  • 테스트 패키지 설치 및 환경 설정

2. 테스트 인프라 구축 (완료)

  • 테스트 디렉토리 구조 설계
  • 테스트 헬퍼 클래스 생성
    • test_helpers.dart: 기본 테스트 유틸리티
    • mock_data_helpers.dart: Mock 데이터 생성
    • simple_mock_services.dart: Mock 서비스 설정
  • Mock 클래스 생성 (build_runner 사용)

3. 단위 테스트 구현 (진행 중)

CompanyListController 테스트

  • 검색 키워드 업데이트
  • 회사 선택/해제
  • 전체 선택/해제
  • 필터 적용
  • 회사 삭제
  • 에러 처리

EquipmentListController 테스트

  • 장비 선택/해제
  • 전체 선택
  • 상태 필터 변경
  • 장비 삭제
  • 선택된 장비 수 계산
  • 에러 처리

UserListController 테스트

  • 초기 상태 확인
  • 사용자 목록 로드
  • 검색 쿼리 설정 및 검색
  • 필터 설정 (회사, 권한, 활성 상태)
  • 필터 초기화
  • 사용자 삭제
  • 사용자 상태 변경
  • 페이지네이션 (더 불러오기)
  • Mock 모드 필터링
  • 지점명 조회
  • 에러 처리

WarehouseLocationListController 테스트

  • 초기 상태 확인
  • 창고 위치 목록 로드
  • 검색 기능
  • 필터 설정 및 초기화
  • 창고 위치 삭제
  • 다음 페이지 로드 (페이지네이션)
  • Mock 모드 지원
  • 에러 처리

OverviewController 테스트

  • 초기 상태 확인
  • 대시보드 통계 데이터 로드
  • 최근 활동 로드
  • 장비 상태 분포 로드
  • 만료 예정 라이선스 조회
  • 개별 데이터 로드 오류 처리
  • 활동 타입별 아이콘/색상 확인
  • 로딩 상태 관리
  • 모든 데이터 로드 실패 시 에러 처리

4. 문서화 (완료)

  • TEST_GUIDE.md: 테스트 작성 가이드
  • TEST_PROGRESS.md: 진행 상황 문서 (현재 문서)

🔧 해결된 주요 이슈

1. 모델 불일치 문제

  • 문제: Mock 데이터 모델과 실제 프로젝트 모델 구조 차이
  • 해결:
    • Address 모델: streetAddress → zipCode/region/detailAddress
    • User 모델: companyId 필수 파라미터 추가
    • AuthUser vs User 타입 정리

2. 서비스 시그니처 불일치

  • 문제: Mock 서비스 메서드와 실제 서비스 메서드 시그니처 차이
  • 해결:
    • CompanyService.getCompanies 파라미터 수정
    • EquipmentService 반환 타입 정리
    • Clean Architecture 패턴 제거 (Either → 직접 반환)

3. Controller 메서드명 차이

  • 문제: 테스트에서 사용한 메서드가 실제 컨트롤러에 없음
  • 해결:
    • toggleAllSelection → toggleSelectAll
    • toggleEquipmentSelection → selectEquipment

4. Integration 테스트 환경 이슈

  • 문제: 실제 API 테스트 실행 시 환경 문제 발생
  • 원인:
    • FlutterSecureStorage가 테스트 환경에서 플러그인 오류 발생
    • TestWidgetsFlutterBinding이 HTTP 요청을 차단 (400 에러 반환)
  • 해결 방안:
    • dart test 명령어로 직접 실행
    • 실제 디바이스나 에뮬레이터에서 테스트 실행
    • Mock 테스트로 대체 (단, 데이터 모델 일치 필요)

📋 남은 작업

Phase 2: Widget 테스트 구현 (완료)

  • 사용자 관리 화면 Widget 테스트
  • 회사 관리 화면 Widget 테스트
  • 장비 관리 화면 Widget 테스트
  • 라이선스 관리 화면 Widget 테스트 (위젯 디자인 한계로 일부 테스트 수정 필요)*
  • 창고 관리 화면 Widget 테스트 (실제 API 연동 구현 - 인증 토큰 필요)*
  • 대시보드 화면 Widget 테스트 (실제 API 연동 구현 - 인증 토큰 필요)*

Phase 3: 추가 컨트롤러 단위 테스트

  • 창고 관리 컨트롤러 단위 테스트
  • 대시보드 컨트롤러 단위 테스트 (OverviewController)

Phase 4: Integration 테스트 (진행 중)

실제 API 테스트 구현 (완료)

  • 테스트 인프라 구축
    • test/integration/real_api/test_helper.dart: 실제 API 테스트 헬퍼 클래스
    • test/integration/real_api/auth_real_api_test.dart: 로그인/인증 테스트
    • test/integration/real_api/auth_real_api_test_simple.dart: 간단한 API 테스트

Mock Integration 테스트

  • test/integration/mock/login_flow_integration_test.dart: 로그인 플로우 테스트 (Mock 사용)

⚠️ 현재 상황 (2025-08-01)

  • 서버 다운: 실제 API 테스트 실행 불가
  • Mock과 실제 서버 데이터 모델 불일치: Mock 테스트 보류
  • 테스트 환경 이슈:
    • FlutterSecureStorage 테스트 환경 문제
    • TestWidgetsFlutterBinding 필요

서버 복구 후 실행 가이드

# 실제 API 로그인 테스트
flutter test test/integration/real_api/auth_real_api_test.dart

# 간단한 API 테스트 (dart test 사용)
dart test test/integration/real_api/auth_real_api_test_simple.dart

남은 Integration 테스트

  • 회사 CRUD API 테스트
  • 사용자 CRUD API 테스트
  • 장비 CRUD API 테스트
  • 라이선스 CRUD API 테스트
  • 창고 CRUD API 테스트

Phase 5: CI/CD 및 고급 기능

  • GitHub Actions 설정
  • 테스트 커버리지 리포트
  • E2E 테스트 (Patrol 사용)
  • 성능 테스트

🛠️ 사용된 기술 스택

테스트 프레임워크

dev_dependencies:
  flutter_test:
    sdk: flutter
  mockito: ^5.4.5
  build_runner: ^2.4.9
  get_it: ^7.7.0

테스트 구조

test/
├── helpers/
│   ├── test_helpers.dart
│   ├── mock_data_helpers.dart
│   ├── simple_mock_services.dart
│   └── simple_mock_services.mocks.dart
├── unit/
│   └── controllers/
│       ├── company_list_controller_test.dart
│       ├── equipment_list_controller_test.dart
│       ├── user_list_controller_test.dart
│       ├── license_list_controller_test.dart
│       ├── warehouse_location_list_controller_test.dart
│       └── overview_controller_test.dart
├── widget/
│   └── screens/
│       ├── company_list_widget_test.dart
│       ├── user_list_widget_test.dart
│       ├── equipment_list_widget_test.dart
│       ├── license_list_widget_test.dart
│       ├── warehouse_location_list_widget_test.dart
│       └── overview_widget_test.dart
└── integration/
    ├── real_api/
    │   ├── test_helper.dart
    │   ├── auth_real_api_test.dart
    │   └── auth_real_api_test_simple.dart
    └── mock/
        └── login_flow_integration_test.dart

💡 다음 단계 추천

  1. 실제 API 연동 테스트 개선

    • 유효한 인증 토큰 설정 방법 구현
    • 테스트 환경에서의 인증 처리 방안
    • Integration Test로 이동 고려
  2. Widget 리팩토링

    • LicenseListRedesign 위젯 리팩토링 (의존성 주입 허용)*
    • WarehouseLocationListRedesign 위젯 리팩토링 (의존성 주입 허용)*
    • OverviewScreenRedesign 위젯 리팩토링 (의존성 주입 허용)*
  3. Integration 테스트 구현

    • 로그인 → 메인 화면 플로우
    • CRUD 작업 전체 플로우
    • 권한별 접근 제어 테스트

📝 참고 사항

GetIt 사용 시 주의점

setUp(() {
  getIt = setupTestGetIt(); // 반드시 첫 번째로
  // Mock 서비스 등록
});

tearDown(() {
  getIt.reset(); // 반드시 실행
});

Mock 데이터 생성

// Company 목록
final companies = MockDataHelpers.createMockCompanyList(count: 5);

// UnifiedEquipment 생성
final equipment = MockDataHelpers.createMockUnifiedEquipment(
  id: 1,
  name: '노트북',
  status: 'I', // 입고 상태
);

// User 모델 생성
final user = MockDataHelpers.createMockUserModel(
  id: 1,
  name: '테스트 사용자',
  role: 'S', // S: 관리자, M: 멤버
);

// User 목록 생성
final users = MockDataHelpers.createMockUserModelList(count: 10);

테스트 실행

# 모든 테스트 실행
flutter test

# 특정 파일 테스트
flutter test test/unit/controllers/company_list_controller_test.dart

# 커버리지 포함
flutter test --coverage

실제 API 연동 테스트 관련 이슈

Widget 테스트에서 실제 API 사용 시 고려사항:

  1. 인증 필요: 실제 API 호출을 위해서는 유효한 인증 토큰이 필요
  2. 네트워크 의존성: 네트워크 상태에 따라 테스트가 불안정할 수 있음
  3. 데이터 일관성: 실제 서버 데이터가 변경되면 테스트 결과가 달라질 수 있음
  4. 권장사항: 실제 API 테스트는 Integration Test로 구현하는 것이 적절

🔗 관련 문서


이 문서는 지속적으로 업데이트됩니다. 마지막 업데이트: 2025-08-01 15:00 (LicenseListController 테스트 개선 - 13/16 통과)

🌐 웹 우선 개발 접근 방식 (2025-08-01 업데이트)

프로젝트 방향 변경

  • 중요: 이 프로젝트는 모바일 앱이 아닌 웹 애플리케이션으로 우선 개발됩니다
  • 모바일 앱 변환은 추후 진행 예정
  • 모든 테스트는 웹 환경에서 실행 가능해야 함

웹 플랫폼 테스트 실행

# 웹 플랫폼으로 테스트 실행
flutter test --platform chrome

# 특정 테스트만 웹에서 실행
flutter test test/unit --platform chrome

테스트 수정 내용

  1. API 메서드명 수정

    • getCompanygetCompanyDetail 변경 완료
    • Mock 서비스보다 실제 API 이름을 우선시
  2. Equipment 테스트 수정

    • 불필요한 search 파라미터 제거 완료
    • Equipment 모델과 UnifiedEquipment 타입 불일치 해결 중
  3. Integration 테스트

    • 모바일 전용 FlutterSecureStorage 문제로 인해 웹 호환 방식 필요
    • 웹 브라우저 기반 테스트로 전환 검토

현재 웹 테스트 상태

  • 단위 테스트: 71/76 통과 (5개 실패 - LicenseListController)
  • Widget 테스트: Equipment 모델 타입 문제로 실행 불가
  • Integration 테스트: 웹 환경 호환성 문제로 재구현 필요

📊 최종 테스트 결과 (2025-08-01)

테스트 실행 결과

  • 전체 테스트: 147개 중 97개 통과, 50개 실패
  • 성공률: 약 66%

주요 실패 원인

  1. 라이브러리 오류

    • dart:js 라이브러리가 테스트 환경에서 사용 불가
    • HealthCheckService에서 웹 전용 코드 사용으로 인한 오류
  2. 메소드명 불일치

    • MockCompanyService에서 getCompanygetCompanyDetail로 변경 필요
    • 여러 서비스에서 API 메소드 시그니처 불일치
  3. Integration 테스트 환경 문제

    • FlutterSecureStorage가 테스트 환경에서 작동하지 않음
    • TestWidgetsFlutterBinding이 HTTP 요청을 차단 (400 에러)
  4. Mock 데이터와 실제 모델 불일치

    • Company 모델: businessRegistrationNumber, isActive 필드 없음
    • API 응답 형식과 모델 클래스 구조 차이

구현 완료 항목

  1. 단위 테스트

    • CompanyListController
    • EquipmentListController
    • UserListController
    • WarehouseLocationListController
    • OverviewController
    • LicenseListController (일부 실패)
  2. Widget 테스트

    • 사용자 관리 화면
    • 회사 관리 화면
    • 장비 관리 화면
    • 라이선스 관리 화면
    • 창고 관리 화면
    • 대시보드 화면
  3. Integration 테스트

    • Company CRUD API 테스트 (구현 완료, 실행 불가)
    • User CRUD API 테스트 (구현 완료, 실행 불가)
    • Equipment CRUD API 테스트 (구현 완료, 실행 불가)
    • License CRUD API 테스트 (구현 완료, 실행 불가)
    • Warehouse CRUD API 테스트 (구현 완료, 실행 불가)

권장 개선 사항

  1. HealthCheckService 수정

    • 플랫폼별 조건부 import 사용
    • 테스트 환경에서는 mock 구현 사용
  2. Mock 서비스 업데이트

    • 실제 서비스 메소드와 일치하도록 수정
    • API 응답 형식에 맞춰 mock 데이터 구조 수정
  3. Integration 테스트 환경 개선

    • 실제 디바이스나 에뮬레이터에서 실행
    • 또는 테스트용 mock 서버 구축
  4. 모델 클래스 정리

    • API 응답과 일치하도록 모델 필드 수정
    • DTO와 도메인 모델 분리 고려