import 'package:flutter_test/flutter_test.dart'; import 'package:get_it/get_it.dart'; import 'package:superport/data/datasources/remote/api_client.dart'; import 'user_automated_test.dart'; import 'framework/infrastructure/test_context.dart'; import 'framework/infrastructure/report_collector.dart'; import 'framework/core/api_error_diagnostics.dart'; import 'framework/core/auto_fixer.dart'; import 'framework/core/test_data_generator.dart'; import 'framework/models/report_models.dart' as report_models; import '../real_api/test_helper.dart'; /// 사용자 화면 자동화 테스트 실행 void main() { late GetIt getIt; late UserAutomatedTest automatedTest; late TestContext testContext; late ReportCollector reportCollector; setUpAll(() async { // 테스트 환경 설정 await RealApiTestHelper.setupTestEnvironment(); getIt = GetIt.instance; // 로그인 await RealApiTestHelper.loginAndGetToken(); // 프레임워크 컴포넌트 초기화 testContext = TestContext(); reportCollector = ReportCollector(); final apiClient = getIt(); final errorDiagnostics = ApiErrorDiagnostics(); final autoFixer = ApiAutoFixer(diagnostics: errorDiagnostics); final dataGenerator = TestDataGenerator(); // 자동화 테스트 인스턴스 생성 automatedTest = UserAutomatedTest( apiClient: apiClient, getIt: getIt, testContext: testContext, errorDiagnostics: errorDiagnostics, autoFixer: autoFixer, dataGenerator: dataGenerator, reportCollector: reportCollector, ); }); tearDownAll(() async { await RealApiTestHelper.teardownTestEnvironment(); // 최종 리포트 출력 final report = reportCollector.generateReport(); // 로그로 리포트 출력 reportCollector.addStep( report_models.StepReport( stepName: 'Final Report', timestamp: DateTime.now(), success: report.testResult.passedTests == report.testResult.totalTests, message: '\n=== 사용자 화면 테스트 최종 리포트 ===\n' '테스트 이름: ${report.testName}\n' '테스트 결과: ${report.testResult.passedTests == report.testResult.totalTests ? '성공' : '실패'}\n' '소요 시간: ${report.duration}\n' '에러 수: ${report.errors.length}개', details: { 'testName': report.testName, 'passed': report.testResult.passedTests == report.testResult.totalTests, 'duration': report.duration.toString(), 'errorCount': report.errors.length, }, ), ); if (report.errors.isNotEmpty) { for (final error in report.errors) { reportCollector.addError( report_models.ErrorReport( errorType: 'testFailure', message: '${error.errorType}: ${error.message}', timestamp: DateTime.now(), context: {'errorType': error.errorType, 'message': error.message}, ), ); } } }); test('👥 사용자 화면 자동화 테스트 실행', () async { final result = await automatedTest.runTests(); // 테스트 결과 검증 expect(result.totalTests, greaterThan(0), reason: '테스트가 실행되지 않았습니다'); expect(result.failedTests, equals(0), reason: '실패한 테스트가 있습니다'); // 개별 기능 검증 로그 reportCollector.addStep( report_models.StepReport( stepName: 'Feature Test Summary', timestamp: DateTime.now(), success: true, message: '\n=== 기능별 테스트 결과 ===\n' '✅ CRUD 기능 테스트 완료\n' '✅ 권한(Role) 관리 테스트 완료\n' '✅ 중복 이메일/사용자명 처리 테스트 완료\n' '✅ 비밀번호 정책 검증 테스트 완료\n' '✅ 필수 필드 누락 시나리오 테스트 완료\n' '✅ 잘못된 이메일 형식 시나리오 테스트 완료\n' '✅ 사용자 상태 토글 테스트 완료', details: { 'completedFeatures': [ 'CRUD 기능', '권한(Role) 관리', '중복 이메일/사용자명 처리', '비밀번호 정책 검증', '필수 필드 누락 시나리오', '잘못된 이메일 형식 시나리오', '사용자 상태 토글' ], }, ), ); }, timeout: Timeout(Duration(minutes: 10))); // 충분한 시간 할당 }