为什么 PHPUnit 测试速度 运行 当机器与互联网断开连接时?

Why PHPUnit tests run faster when the machine is disconnected from the internet?

我注意到当我的笔记本电脑连接到互联网时,我的 PHPUnit 测试需要大约 90 秒到 200 秒才能完成。但是当我断开它与互联网的连接时,它会在不到 20 秒的时间内运行!!这让我既开心又难过!

在这两种情况下,所有测试都通过了,我确定我正在模拟对外部 API 的每个请求。

我正在使用 Laravel 和 MySQL 进行真实数据存储,并使用内存中的 sqlite 进行测试环境。另外我的开发环境全部在 运行 on Docker.

这是否与 PHPUnit 或我的代码有关!!任何人都知道发生了什么。谢谢

更多信息

我使用的域是 something.dev,我的 API 使用的是 api.something.dev。每个测试至少调用每个 API 个端点。

DNS! 如果您认为这是由于 DNS 查找引起的:我将所有域和子域更改为 127.0.0.1 只是为了测试它,但它并没有帮助测试仍然很慢。这应该消除DNS查找的可能性吧!

此外,我尝试使用 The PHPUnit Bridge 和 PHPUnit 模拟 DNS,但我想由于缺乏文档我无法让它工作,所以我不知道将什么作为参数传递给 DnsMock::withMockedHosts([here!!]) 从我的 setUp() 函数调用它之后。

其他 我认为问题与数据存储有关,因为延迟发生在查询数据库之前和之后,主要是为了存储数据。

哇,没想到。由于 PHP Faker$faker->image() 提供的 image() 功能,我的测试很慢。

我在我的一家工厂中使用它来为数据库准备一个假图像,我不知道它实际上是在下载图像并将它们存储在这样的文件夹中 /private/var/folders/51/5ybn3kjn8f332jfrsx7nmam00000gn/T/

我能够通过在测试 运行 时监视 PHP 进程正在做什么来发现它在该目录中有一个打开的 .jpg 文件,所以我查看了在我的代码中,任何与图像相关的东西都发现了,经过大约 6 小时的调试。编码愉快:)

切勿在工厂中使用 $faker->image('storage/app',640,480, null, false) : 这会很费时间。

转换

$factory->define(Model::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'description' => $faker->text,
        'image' => $faker->image('storage/app',640,480, null, false),
    ];
});

进入

$factory->define(Model::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'description' => $faker->text,
        'image' => 'test.png',
    ];
});