From 60b994a9e6c2bd20046f3aa0908c8e84ea8c26fe Mon Sep 17 00:00:00 2001 From: RyuJongJin <266630912+RyuJongJin@users.noreply.github.com> Date: Tue, 20 Oct 2026 15:39:20 +0900 Subject: [PATCH] =?UTF-8?q?=EC=8B=9C=ED=97=98=20=ED=9D=94=EB=93=A4?= =?UTF-8?q?=EB=A6=BC:=20settings=5Fgroup=5Fbar=5Ftest=20(412=20=EB=AC=B6?= =?UTF-8?q?=EC=9D=8C=20=EB=B0=94=EB=A1=9C=EA=B0=80=EA=B8=B0)=20-=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=EC=9D=B4=20=EB=A9=88=EC=B6=9C=20=EB=95=8C?= =?UTF-8?q?=EA=B9=8C=EC=A7=80=20=EA=B8=B0=EB=8B=A4=EB=A6=AC=EA=B3=A0=20?= =?UTF-8?q?=EC=B9=98=EC=9A=B4=20=EB=92=A4=EC=97=90=EB=8F=84=20=EB=82=A8?= =?UTF-8?q?=EC=9D=80=20=EC=9D=BC=EC=9D=84=20=EB=81=9D=EB=83=84=20(?= =?UTF-8?q?=EA=B2=80=ED=86=A0=20=EB=8C=80=EA=B8=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 관리자 지시 (10/20): 67개 시험 파일을 한꺼번에 돌릴 때 한 번 실패 (혼자서 · 무거운 시험과 함께 · 67개 다시 663개 모두 재현되지 않음). 실패 줄에 Expected · Timeout 이 없어 값이 틀린 것이 아니라 시험 밖으로 넘어간 예외로 봄: 설정 화면의 칸들이 시작한 진짜 입출력 (레지스트리 조회 · 구성 요소 목록 HttpClient · 파일) 이 부하가 크면 한 번 그린 뒤 · 화면을 치운 뒤에야 끝남. 이제 재기 전과 치운 뒤에 화면이 멈출 때까지 (위젯 수가 세 번 같음) 진짜 시간을 흘리고, 그만큼 시험 시간을 2분으로. 코드 변경 없음. Co-Authored-By: Claude Opus 5.5 --- test/settings_group_bar_test.dart | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/test/settings_group_bar_test.dart b/test/settings_group_bar_test.dart index 36ccb4b..d287fef 100644 --- a/test/settings_group_bar_test.dart +++ b/test/settings_group_bar_test.dart @@ -23,7 +23,20 @@ void main() { addTearDown(tester.view.reset); final c = AppController(PlatformServices(mediaTool: ProcessMediaTool('x', 'y'), storage: DesktopStorageService())); await tester.runAsync(() => tester.pumpWidget(MaterialApp(home: SettingsPage(c: c)))); - await tester.pump(); + // 관리자 지시 (10/20, 15): 부하가 크면 (여러 시험을 함께 돌림) 칸들이 시작한 진짜 입출력 (레지스트리 조회 · 구성 요소 목록 · + // 파일) 이 늦게 끝나 화면이 바뀌거나, 화면을 치운 뒤에야 끝나 예외가 났다 - 화면이 멈출 때까지 (위젯 수가 세 번 같음) 진짜 시간을 흘린다 + Future settle() async { + var last = -1, same = 0; + for (var i = 0; i < 150 && same < 3; i++) { + await tester.runAsync(() => Future.delayed(const Duration(milliseconds: 20))); + await tester.pump(); + final n = find.byType(Widget).evaluate().length; + same = n == last ? same + 1 : 0; + last = n; + } + } + + await settle(); final tops = {for (final e in find.byType(ActionChip).evaluate()) tester.getRect(find.byWidget(e.widget)).top.round()}; expect(tops, isNotEmpty); if (oneRow) { @@ -31,7 +44,8 @@ void main() { } expect(tester.takeException(), isNull); await tester.pumpWidget(const SizedBox()); + await settle(); // 치운 뒤에도 남은 비동기 일이 이 시험 안에서 끝나게 await tester.pump(const Duration(seconds: 1)); - }); + }, timeout: const Timeout(Duration(minutes: 2))); // 화면이 멈출 때까지 기다리므로 부하가 크면 30초를 넘을 수 있음 } }