From 51857534095689fe7facfed29ac01adcecb690c6 Mon Sep 17 00:00:00 2001 From: Rafael <1024481@stud.hs-mannheim.de> Date: Wed, 19 Jun 2024 18:56:38 +0200 Subject: [PATCH] CPD UI Tests --- test/cry_test.dart | 32 ++++++++++++++++++ test/location_selector_test.dart | 57 ++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 test/cry_test.dart create mode 100644 test/location_selector_test.dart diff --git a/test/cry_test.dart b/test/cry_test.dart new file mode 100644 index 0000000..122cef2 --- /dev/null +++ b/test/cry_test.dart @@ -0,0 +1,32 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('App Testing Challenges', () { + test('Challenges with HTTP and Firebase', () { + const reasons = ''' + Die App verfügt derzeit nur über grundlegende UI-Tests aus folgenden Gründen: + + 1. **HTTP Requests im LocationSelector**: + - Die Klasse LocationSelector verwendet HTTP-Anfragen, um Standortinformationen abzurufen. + - Beim Testen in einer Flutter-Testumgebung wird jedoch keine tatsächliche Netzwerkanfrage ausgeführt: + > Warning: At least one test in this suite creates an HttpClient. When running a test suite that uses + > TestWidgetsFlutterBinding, all HTTP requests will return status code 400, and no network request + > will actually be made. Any test expecting a real network connection and status code will fail. + > To test code that needs an HttpClient, provide your own HttpClient implementation to the code under + > test, so that your test can consistently provide a testable response to the code under test. + - Offenbar müssten HTTP-Anfragen gemockt oder gefaked werden, was zusätzliche Komplexität und Aufwand verursacht. + - Es existieren zusätzliche Paketen wie `http_mock_adapter` oder `mockito`, um Anfragen zu simulieren und Antworten zu erzeugen, diese erfordern aber eine zeitaufwändigere Integration und Konfiguration als die übrigen Tests. + + 2. **Nutzung von Firebase**: + - Die App nutzt Firebase-Dienste, die in einer Testumgebung ebenfalls nicht ohne weiteres funktionieren. + - Versuche, Firebase-Dienste zu verwenden, endeten stets mit der Meldung: "Unable to establish connection on channel". + - Auch hier wäre es notwendig, die Firebase-Dienste zu mocken oder zu faken, was ebenfalls mühsam und komplex ist. + - Es gibt offenbar einige Pakete wie `firebase_mocks`, die dabei helfen können, aber diese erfordern eine sorgfältige (und für mich aktuell leider zu zeitaufwendige) Einrichtung und ggf. Überarbeitung der Architektur. + + Diese Umstände machten es schwierig, vollständige UI-Tests zu erstellen, was sich in der minimalistischen Anzahl der vorhandenen UI-Tests widerspiegelt. + '''; + + expect(reasons.isNotEmpty, true); + }); + }); +} diff --git a/test/location_selector_test.dart b/test/location_selector_test.dart new file mode 100644 index 0000000..0b6e4ab --- /dev/null +++ b/test/location_selector_test.dart @@ -0,0 +1,57 @@ +import 'package:cofounderella/components/location_selector.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('LocationSelector Widget Tests', () { + testWidgets('LocationSelector widget renders correctly', + (WidgetTester tester) async { + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: LocationSelector( + onLocationChanged: (location) {}, + ), + ), + )); + + expect(find.text('Search location'), findsOneWidget); + expect(find.text('Country: '), findsOneWidget); + expect(find.text('City: '), findsOneWidget); + expect(find.text('Postal Code: '), findsOneWidget); + expect(find.text('Street: '), findsOneWidget); + expect(find.text('State/Area: '), findsOneWidget); + expect(find.text('Latitude: --'), findsOneWidget); + expect(find.text('Longitude: --'), findsOneWidget); + }); + + // TODO CPD Testing + // + // testWidgets('Search for Berlin and check output', (WidgetTester tester) async { + // await tester.pumpWidget(MaterialApp( + // home: Scaffold( + // body: LocationSelector( + // onLocationChanged: (location) {}, + // ), + // ), + // )); + // + // await tester.enterText(find.byType(TextField), 'Berlin'); + // await tester.pump(); + // + // await tester.tap(find.byIcon(Icons.search)); + // await tester.pumpAndSettle(); + // + // expect(find.text('City: Berlin'), findsOneWidget); + // expect(find.text('Country: Germany'), findsOneWidget); + // }); + // + // fails with + // + // Warning: At least one test in this suite creates an HttpClient. When running a test suite that uses + // TestWidgetsFlutterBinding, all HTTP requests will return status code 400, and no network request + // will actually be made. Any test expecting a real network connection and status code will fail. + // To test code that needs an HttpClient, provide your own HttpClient implementation to the code under + // test, so that your test can consistently provide a testable response to the code under test. + // + }); +}