为什么这个Flutter测试在CodeMagic上失败了?

5

当我尝试在Codemagic上测试构建时,测试失败了。我尝试更改widget_test.dart代码,但问题仍未解决。如何解决这个问题?

以下是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.

我的Widget_test文件代码如下:

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);
  });
}

但是这个测试在你本地通过了,对吧? - mirkancal
如果你的意思是在我的手机上运行它,没问题,我可以! - imgkl
1
执行 flutter test 命令。该测试是使用 flutter create 模板生成的。只有在您仍然拥有计数器应用程序的情况下才能正常工作。如果不是这种情况,请删除该测试 :) - Martyns
我在创建项目后删除了文件夹,当时并不知道它很重要。有没有什么方法可以解决这个问题?因为我已经快完成一个新的应用程序,但无法在Codemagic中进行测试。我尝试删除“test”目录,但显然没有起作用。 - imgkl
嗨,@GokulaKrishnan,你能修好你的测试吗? - Mikhail Tokarev
是的,不完全是这样。我删除了整个测试文件夹,并在没有运行flutter test的情况下运行了CI/CD。所以没错,它起作用了。 - imgkl
3个回答

2

我删除了测试文件夹并运行了它,它工作得很好。


2
这是因为Codemagic试图运行集成测试,而您可能没有。请注意,集成测试与单元测试或widget测试不同。Flutter Driver运行集成测试,了解更多
集成测试也称为“Flutter Driver测试”。如果执行flutter drive,Flutter将运行项目中的所有集成测试。以下是帮助命令的摘录:

Screenshot from 2020-09-06 15-58-07

话虽如此,你之所以会遇到这个错误是因为你的项目中没有任何集成测试。你只需要在Codemagic工作流程中禁用集成测试即可:

enter image description here


2

widget_test.dart文件是在Flutter中默认项目创建的,其中包含两个文本字段和一个可点击的图标。由于您修改了应用程序UI,现在可能会显示不同的元素,测试失败,因为它期望模板项目元素,而现在您没有这些元素。您可以注释testWidgets方法进行快速修复:

// 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);
  });
  */
}

请记得在 Codemagic 上提交并同步您的分支。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接