LCOV - code coverage report
Current view: top level - lib/utils - test_config.dart Coverage Total Hit
Test: lcov.info Lines: 47.4 % 38 18
Test Date: 2025-08-12 03:21:51 Functions: - 0 0

            Line data    Source code
       1              : import 'dart:io';
       2              : import 'package:flutter/foundation.dart';
       3              : import 'package:yaml/yaml.dart';
       4              : import 'package:path/path.dart' as path;
       5              : 
       6              : /// CI/CD 환경과 로컬 환경에서 테스트 실행 시 설정을 관리하는 클래스
       7              : class TestConfig {
       8              :   static TestConfig? _instance;
       9              :   
      10              :   // 기본 설정값
      11              :   int asyncTimeout = 800;
      12              :   int testDelay = 100;
      13              :   int retryCount = 1;
      14              :   bool parallel = true;
      15              :   int memoryLimit = 0; // 0은 제한 없음
      16              :   int logLevel = 2;
      17              :   String isolationMode = 'normal';
      18              :   int timerCompletionWait = 500; // 테스트 종료 전 타이머 완료 대기 시간
      19              :   bool isCI = false;
      20              :   
      21              :   /// 싱글톤 인스턴스 반환
      22           12 :   static TestConfig get instance {
      23           12 :     _instance ??= TestConfig._internal();
      24              :     return _instance!;
      25              :   }
      26              :   
      27           12 :   TestConfig._internal() {
      28           12 :     _loadConfig();
      29              :   }
      30              :   
      31              :   /// 설정 파일 로드
      32           12 :   void _loadConfig() {
      33              :     try {
      34              :       // CI 환경 감지
      35           36 :       isCI = Platform.environment.containsKey('CI') || 
      36           24 :              Platform.environment.containsKey('GITHUB_ACTIONS') ||
      37           24 :              Platform.environment.containsKey('GITLAB_CI');
      38              :       
      39              :       if (kDebugMode) {
      40           36 :         print('TestConfig: CI 환경 감지 - $isCI');
      41              :       }
      42              :       
      43              :       // 설정 파일 경로
      44           12 :       final configPath = isCI 
      45              :           ? '.github/workflows/test_config.yaml'
      46              :           : 'test/test_config.yaml';
      47              :       
      48              :       // 프로젝트 루트 디렉토리 찾기
      49           24 :       String projectRoot = Directory.current.path;
      50              :       
      51              :       // pubspec.yaml이 있는 디렉토리를 찾을 때까지 상위 디렉토리로 이동
      52           36 :       while (!File(path.join(projectRoot, 'pubspec.yaml')).existsSync()) {
      53            0 :         final parent = Directory(projectRoot).parent;
      54            0 :         if (parent.path == projectRoot) {
      55              :           // 루트에 도달했는데도 pubspec.yaml을 찾지 못함
      56              :           break;
      57              :         }
      58            0 :         projectRoot = parent.path;
      59              :       }
      60              :       
      61           24 :       final configFile = File(path.join(projectRoot, configPath));
      62              :       
      63           12 :       if (configFile.existsSync()) {
      64           12 :         final yamlString = configFile.readAsStringSync();
      65           12 :         final yamlMap = loadYaml(yamlString) as Map;
      66              :         
      67           12 :         if (yamlMap.containsKey('test_settings')) {
      68            0 :           final settings = yamlMap['test_settings'] as Map;
      69              :           
      70            0 :           asyncTimeout = settings['async_timeout'] ?? asyncTimeout;
      71            0 :           testDelay = settings['test_delay'] ?? testDelay;
      72            0 :           retryCount = settings['retry_count'] ?? retryCount;
      73            0 :           parallel = settings['parallel'] ?? parallel;
      74            0 :           memoryLimit = settings['memory_limit'] ?? memoryLimit;
      75            0 :           logLevel = settings['log_level'] ?? logLevel;
      76            0 :           isolationMode = settings['isolation_mode'] ?? isolationMode;
      77            0 :           timerCompletionWait = settings['timer_completion_wait'] ?? timerCompletionWait;
      78              :           
      79              :           if (kDebugMode) {
      80            0 :             print('TestConfig: 설정 파일 로드 성공 - $configPath');
      81            0 :             print('TestConfig: asyncTimeout=$asyncTimeout, testDelay=$testDelay, retryCount=$retryCount');
      82              :           }
      83              :         }
      84              :       } else {
      85              :         if (kDebugMode) {
      86            0 :           print('TestConfig: 설정 파일 없음 - $configPath, 기본값 사용');
      87              :         }
      88              :       }
      89              :     } catch (e) {
      90              :       if (kDebugMode) {
      91            0 :         print('TestConfig: 설정 로드 중 오류 - $e');
      92              :       }
      93              :     }
      94              :   }
      95              :   
      96              :   /// 테스트 환경에 맞는 비동기 타임아웃 값 반환
      97            0 :   Duration get asyncTimeoutDuration => Duration(milliseconds: asyncTimeout);
      98              :   
      99              :   /// 테스트 환경에 맞는 테스트 간 지연 시간 반환
     100            0 :   Duration get testDelayDuration => Duration(milliseconds: testDelay);
     101              :   
     102              :   /// 테스트 종료 전 타이머 완료 대기 시간 반환
     103            0 :   Duration get timerCompletionWaitDuration => Duration(milliseconds: timerCompletionWait);
     104              :   
     105              :   /// 테스트 환경에 맞는 로그 레벨 반환 (디버깅 상세도)
     106           36 :   bool get isVerboseLogging => logLevel >= 4;
     107              :   
     108              :   /// 테스트 격리 모드가 strict인지 확인
     109            0 :   bool get isStrictIsolation => isolationMode == 'strict';
     110              : }
        

Generated by: LCOV version 2.3.1-1