3

我正在使用 phpunit、paratest 的并行测试插件和 Laravel 应用程序来加速我们的测试套件的执行。这在大多数情况下都有效,但偶尔会出现以下故障。

League\Flysystem\Exception: Impossible to create the root directory "/codebuild/output/src0123456/src/github.com/org/repo/storage/framework/testing/disks/local". file_get_contents(/codebuild/output/src0123456/src/github.com/org/repo/.env): failed to open stream: No such file or directory

/codebuild/output/src0123456/src/github.com/org/repo/vendor/league/flysystem/src/Adapter/Local.php:112
/codebuild/output/src0123456/src/github.com/org/repo/vendor/league/flysystem/src/Adapter/Local.php:78
/codebuild/output/src0123456/src/github.com/org/repo/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php:167
/codebuild/output/src0123456/src/github.com/org/repo/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:261
/codebuild/output/src0123456/src/github.com/org/repo/vendor/laravel/framework/src/Illuminate/Support/Facades/Storage.php:70
/codebuild/output/src0123456/src/github.com/org/repo/tests/TestCase.php:42

第 42 行的故障与此行有关,该行正在创建本地存储文件夹以进行测试。

Storage::persistentFake();

我认为提到 .env 文件的错误的后半部分是不相关的,因为异常选择了最后记录的错误,而不是与失败相关的错误。

这只会时不时发生,因此它必须是一系列操作或时间问题。

测试在针对 php 7.3 和 7.4 的 AWS 代码构建环境中运行并失败。

有人有想法么?

4

2 回答 2

1

万一其他人遇到此问题,可以通过在执行测试之前创建测试存储目录来解决此问题。

mkdir -p storage/framework/testing/disks/local
vendor/bin/paratest

它有点脆弱,但到目前为止对我们来说效果很好。

于 2020-06-08T12:05:46.130 回答
0

根据我的经验,这通常不是文件系统的问题。大多数时候我的测试没有正确清理。

根据文件系统和 Paratest,您的测试以不同的顺序执行,然后发生此错误。

你可以做一些事情来追踪它:

  1. 在构建环境上执行测试时启用--debug模式并检查之前执行的所有测试。
  2. 从 PHPUnit 7.3 开始,使用--order-by=random本地执行测试的顺序与从文件系统读取时出现的顺序不同。执行几次,也许你可以在本地模拟这个。
  3. 我看到您正在使用 Flysystem:尝试使用内存文件系统适配器执行测试,以确保它确实不是文件系统问题。
  4. 确保每个测试在 ( Testcase::setUp()) 之前创建文件系统布局并在关闭时清理它 ( TestCase::teatDown()),否则一个测试可能会影响另一个测试。
  5. 确保您的测试不依赖于可能更改的值。例如,我在涉及日期的测试中遇到了问题,我在 23:59 在 Jenkins 上执行了测试,但它们失败了,因为日期切换到了第二天。在这些情况下,通过测试传递一个日期。
于 2020-06-08T12:18:24.870 回答