在 docker 映像上运行的"颤振测试"导致 testfile.dill.track.dill 更改,然后导致 CI 环境中的测试失败



我在 gitlab-ci 环境中运行flutter test的单元测试错误。以下是我已经尝试解决问题但到目前为止还没有找到解决方案的完整列表。我在 github/flutter 中打开了一个问题,想知道它是否真的可能是 flutter 中的一个错误,但如果提出任何其他建议,很高兴收到您的来信。所有日志都在 GitHub 问题中,如果此问题需要。

重现步骤

由于专有原因,我无法粘贴所有颤振代码。我将尽可能详细地帮助解决方案,并随时询问更多详细信息。

主要目标是让flutter test在 gitlab-ci 上运行,在 docker 镜像上。因此,我在MacBook上创建了一个本地docker映像(Dockerfile包含在下面,也被推送到Docker Hub(来重现和调试故障。

  1. 运行docker pull isorensen/flutter-ubuntu:1.12.13-stable
  2. 运行docker run -v [flutter_project_root_directory]:/app -it --rm isorensen/flutter-ubuntu:1.12.13-stable
  3. 在 Docker 映像上运行flutter test。至少运行两次,因为,如下所示,第一个命令可能会成功,实际上会导致进一步的测试失败。

预期成果:

00:09 +14: All tests passed!

实际结果:

00:12 +0 -1: faq:  check if has values [E]                                                                                           
type 'MappedListIterable<MapEntry<int, dynamic>, dynamic>' is not a subtype of type 'List<dynamic>' in type cast
package:credifit/API/client.dart 307:80  ApiClient.getFaqs
00:12 +0 -2: faq:  check first default question [E]                                                                                  
type 'MappedListIterable<MapEntry<int, dynamic>, dynamic>' is not a subtype of type 'List<dynamic>' in type cast
package:credifit/API/client.dart 307:80  ApiClient.getFaqs
00:18 +10 -3: getUserLoanInfos [E]                                                                                                   
Instance of 'Fatal'
package:sdkgen_runtime/http_client.dart 30:5   SdkgenHttpClient._throwError
package:sdkgen_runtime/http_client.dart 82:15  SdkgenHttpClient.makeRequest
00:19 +10 -4: simulateInstallments [E]                                                                                               
type 'MappedListIterable<MapEntry<int, dynamic>, dynamic>' is not a subtype of type 'List<dynamic>' in type cast
package:credifit/API/client.dart 313:236  ApiClient.simulateInstallments
00:19 +10 -4: Some tests failed.

似乎有什么问题

由于此问题不会发生在我的本地环境(运行macOS Catalina,如下面的日志中所述(,因此我注意到,在我的项目文件夹中运行fswatch并在两个环境中运行flutter test(共享同一项目目录(,只有两个文件被"触摸"(不一定更改(: -。包 - .testfile.dill.track.dill

在对两个文件运行diff之后,在flutter test之前和之后,注意到只有testfile.dill.track.dill被更改了。

最后,当我执行下面的序列时,它使flutter test成功运行,得出结论,错误是在 docker 映像内flutter test更改testfile.dill.track.dill大小写后引起的。

  1. 在 macOS 上运行flutter test(与 docker 镜像共享同一项目目录(
  2. 运行cp build/testfile.dill.track.dill ~以保存文件的副本
  3. 在 docker vm 上运行flutter test(第一次,测试成功运行,但它会更改 test file.dill.track.dill(
  4. 运行diff build/testfile.dill.track.dill ~/testfile.dill.track.dill
    结果:Binary files build/testfile.dill.track.dill and /Users/eduardosorensen/testfile.dill.track.dill differ
  5. 在 docker vm
    上运行flutter test上面的测试失败
  6. 运行cp ~/testfile.dill.track.dill build/testfile.dill.track.dill(还原更改的文件(
  7. 在 docker vm
    上运行flutter test上面的测试是成功的,尽管它再次更改 testfile.dill.track.dill 并在进一步的测试中再次开始失败

这是颤振包版本的问题。

当您创建 docker 映像并运行flutter pub get时,它会从头开始构建包,因此使用次要更新升级某些包。

这可能会导致本地映像和 docker 映像之间的版本不同。

因此,请确保在本地和码头服务器上使用相同的环境运行测试。

最新更新