You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel功能测试:如何切换数据库连接至PostgreSQL?

Laravel 部分测试切换至 PostgreSQL 的通用方案

默认用 SQLite 内存库提升测试速度,仅在需要验证 PostgreSQL 特有特性的测试中切换数据库,Laravel 社区常用以下几种方案:

1. 单测试方法/类内动态切换连接

在需要切换的测试方法中,直接修改数据库配置并执行迁移:

public function test_fetch_all_posts()
{
    // 临时切换至 PostgreSQL 连接
    config()->set('database.default', 'pgsql');
    config()->set('database.connections.pgsql.database', 'somedb');

    // 执行数据库迁移(确保迁移适配 PostgreSQL)
    $this->artisan('migrate')->run();

    // 原有测试逻辑
    $data = (object) [
        "id" => 126,
        "title" => "a",
        "description" => "Its a description",
        "target_price" => 3000,
        "label_id" => [1, 2],
        "additional_details" => "additonal details",
        "latitude" => "-31.953030",
        "longitude" => "115.853600",
    ];

    $this->postCreateService->create(data: $data, customerId: 1);

    $response = $this->getJson('/api/store/posts?storeId=1');

    $response->assertStatus(200);

    // 测试后清理数据
    $this->artisan('migrate:rollback')->run();
}

如果多个测试方法需要切换,可放到测试类的 setUp/tearDown 中统一处理:

protected function setUp(): void
{
    parent::setUp();

    // 切换至 PostgreSQL
    config()->set('database.default', 'pgsql');
    config()->set('database.connections.pgsql.database', 'somedb');
    $this->artisan('migrate')->run();
}

protected function tearDown(): void
{
    $this->artisan('migrate:rollback')->run();
    // 恢复默认 SQLite 连接
    config()->set('database.default', 'sqlite');
    parent::tearDown();
}

2. 封装复用的 Trait

把切换逻辑封装成 Trait,需要的测试类直接引入即可减少重复代码:

trait UsesPostgreSQL
{
    protected function setUp(): void
    {
        parent::setUp();

        config()->set('database.default', 'pgsql');
        config()->set('database.connections.pgsql.database', 'somedb');
        $this->artisan('migrate')->run();
    }

    protected function tearDown(): void
    {
        $this->artisan('migrate:rollback')->run();
        config()->set('database.default', 'sqlite');
        parent::tearDown();
    }
}

在测试类中使用:

class PostTest extends TestCase
{
    use UsesPostgreSQL;

    public function test_fetch_all_posts()
    {
        // 原有测试逻辑...
    }
}

3. 利用测试分组与环境配置

在 phpunit.xml 中新增 PostgreSQL 测试的环境变量与分组:

<php>
    <!-- 默认 SQLite 配置 -->
    <server name="DB_CONNECTION" value="sqlite"/>
    <server name="DB_DATABASE" value=":memory:"/>

    <!-- PostgreSQL 分组专属配置 -->
    <server name="DB_CONNECTION" value="pgsql" force="false"/>
    <server name="DB_DATABASE" value="somedb" force="false"/>
</php>

<groups>
    <group name="pgsql">
        <directory suffix="Test.php">./tests/Features/PostgreSQL</directory>
    </group>
</groups>

给需要切换的测试类标注分组:

/**
 * @group pgsql
 */
class PostTest extends TestCase
{
    public function test_fetch_all_posts()
    {
        // 测试逻辑...
    }
}

运行指定分组的测试:

php artisan test --group=pgsql

注意事项

  • 迁移兼容性:如果迁移中有 PostgreSQL 特有语法(如 jsonb、uuid 默认值等),可通过 DB::connection()->getDriverName() 判断数据库类型,执行差异化迁移逻辑。
  • 性能控制:PostgreSQL 测试速度慢于 SQLite,建议仅在必要测试中使用,避免拖慢整体测试节奏。
  • 数据清理:可搭配 DatabaseMigrations Trait 自动处理迁移回滚,或在 tearDown 中执行 truncate 清空表数据。

内容的提问来源于stack exchange,提问作者nick coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:48:16