When I try to test the build on Codemagic, the test fails. I tried to change widget_test.dart code, Still the problem remains unsolved. How to resolve this issue?
This is the error thrown by codemagic.
== QA ==
== flutter test --machine ==
{"protocolVersion":"0.1.1","runnerVersion":null,"pid":949,"type":"start","time":0}
{"suite":{"id":0,"platform":"vm","path":"/Users/builder/clone/test/widget_test.dart"},"type":"suite","time":1}
{"test":{"id":1,"name":"loading /Users/builder/clone/test/widget_test.dart","suiteID":0,"groupIDs":[],"metadata":{"skip":false,"skipReason":null},"line":null,"column":null,"url":null},"type":"testStart","time":3}
{"count":1,"type":"allSuites","time":7}
{"testID":1,"result":"success","skipped":false,"hidden":true,"type":"testDone","time":15317}
{"group":{"id":2,"suiteID":0,"parentID":null,"name":null,"metadata":{"skip":false,"skipReason":null},"testCount":1,"line":null,"column":null,"url":null},"type":"group","time":15341}
{"test":{"id":3,"name":"Counter increments smoke test","suiteID":0,"groupIDs":[2],"metadata":{"skip":false,"skipReason":null},"line":107,"column":3,"url":"package:flutter_test/src/widget_tester.dart","root_line":14,"root_column":3,"root_url":"file:///Users/builder/clone/test/widget_test.dart"},"type":"testStart","time":15343}
{"testID":3,"messageType":"print","message":"══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════\nThe following TestFailure object was thrown running a test:\n Expected: exactly one matching node in the widget tree\n Actual: ?:<zero widgets with text \"0\" (ignoring offstage widgets)>\n Which: means none were found but one was expected\n\nWhen the exception was thrown, this was the stack:\n#4 main.<anonymous closure> (file:///Users/builder/clone/test/widget_test.dart:19:5)\n<asynchronous suspension>\n#5 testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:118:25)\n<asynchronous suspension>\n#6 TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:630:19)\n<asynchronous suspension>\n#9 TestWidgetsFlutterBinding._runTest (package:flutter_test/src/binding.dart:613:14)\n#10 AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1010:24)\n#16 AutomatedTestWidgetsFlutterBinding.runTest (package:flutter_test/src/binding.dart:1007:15)\n#17 testWidgets.<anonymous closure> (package:flutter_test/src/widget_tester.dart:116:22)\n#18 Declarer.test.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:168:27)\n<asynchronous suspension>\n#19 Invoker.waitForOutstandingCallbacks.<anonymous closure> (package:test_api/src/backend/invoker.dart:250:15)\n<asynchronous suspension>\n#24 Invoker.waitForOutstandingCallbacks (package:test_api/src/backend/invoker.dart:247:5)\n#25 Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:166:33)\n#30 Declarer.test.<anonymous closure> (package:test_api/src/backend/declarer.dart:165:13)\n<asynchronous suspension>\n#31 Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:400:25)\n<asynchronous suspension>\n#45 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:382:19)\n#46 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:416:5)\n#47 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:172:12)\n(elided 28 frames from class _FakeAsync, package dart:async, package dart:async-patch, and package stack_trace)\n\nThis was caught by the test expectation on the following line:\n file:///Users/builder/clone/test/widget_test.dart line 19\nThe test description was:\n Counter increments smoke test\n════════════════════════════════════════════════════════════════════════════════════════════════════","type":"print","time":17092}
{"testID":3,"error":"Test failed. See exception logs above.\nThe test description was: Counter increments smoke test","stackTrace":"","isFailure":false,"type":"error","time":17119}
{"testID":3,"result":"error","skipped":false,"hidden":false,"type":"testDone","time":17134}
{"success":false,"type":"done","time":17231}
QA failed :|
Flutter test run failed.
== QA failed, ending build ==
Build failed :|
Test run failed: Flutter test run failed.
My Widget_test file code is
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:top100/main.dart';
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(MyApp());
// Verify that our counter starts at 0.
expect(find.text('0'), findsOneWidget);
expect(find.text('1'), findsNothing);
// Tap the '+' icon and trigger a frame.
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
// Verify that our counter has incremented.
expect(find.text('0'), findsNothing);
expect(find.text('1'), findsOneWidget);
});
}
In Flutter testing, we have two methods: Manual testing for things such as user interface, experience, widget compositions, etc. Automation testing for verifying the functionality using various types of data and actions on the applications.
It ensures that the application is of high quality. Testing requires careful planning and execution. It is also the most time consuming phase of the development. Dart language and Flutter framework provides extensive support for the automated testing of an application.
If Flutter already caught your attention and you’ve already started playing with it, the name of Codemagic is probably something that may sound familiar. It is the first CI/CD tool dedicated to Flutter apps, and it is developed by Nevercode.
Codemagic is a continuous integration and delivery for mobile apps designed with Flutter in mind. Among other things, it's perfect for kicking off integration tests on the Firebase Test Lab whenever there's a new commit or pull request in a git repository.
In the native Android world, there are instrumentation tests and we are basically going to hook up the multiplatform Flutter integration tests to run as if they were native instrumentation tests on Android. Inside android/app/src create two new folders androidTest/java. Then create nested folders with names according to YOUR project's package name.
To run tests on the Firebase Test Lab, you need a Firebase project. Don't worry though, you don't need to use any Firebase dependencies in you Flutter app. Test Lab doesn't care if you use the other Firebase services or not. You can either use an existing Firebase project or create a new one on the Firebase Console.
The widget_test.dart file is created with the default project in Flutter, which has two text fields and an Icon which can be tapped. Since you modified the app UI, now you may have different elements showing and the test fails since it is expecting the template project elements which now you don't have. You can comment the testWidgets
method for a quick fix:
// This is a basic Flutter widget test.
//
// To perform an interaction with a widget in your test, use the WidgetTester
// utility that Flutter provides. For example, you can send tap and scroll
// gestures. You can also use WidgetTester to find child widgets in the widget
// tree, read text, and verify that the values of widget properties are correct.
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:fin_app_flutter/main.dart';
void main() {
/*
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(MyApp());
// Verify that our counter starts at 0.
expect(find.text('0'), findsOneWidget);
expect(find.text('1'), findsNothing);
// Tap the '+' icon and trigger a frame.
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
// Verify that our counter has incremented.
expect(find.text('0'), findsNothing);
expect(find.text('1'), findsOneWidget);
});
*/
}
Remember to commit and sync your branch on Codemagic.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With