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

Laravel使用PHPUnit测试时报错no such table: users该如何解决?

问题产生原因
  • Laravel测试环境默认使用独立于开发环境的数据库配置,默认是内存型SQLite数据库,你本地开发环境的users表不会同步到测试环境,所以工厂在非测试场景可以正常运行,测试时找不到表
  • 测试类没有引入自动数据库迁移的Trait,测试运行前没有创建对应的表结构
  • 若你手动修改过phpunit.xml的测试数据库配置,也可能是没有对应执行测试环境的数据库迁移导致表不存在
解决方法
  1. 确认测试配置文件phpunit.xml的数据库配置正确,默认配置如下即可:
<php>
    <server name="APP_ENV" value="testing"/>
    <server name="DB_CONNECTION" value="sqlite"/>
    <server name="DB_DATABASE" value=":memory:"/>
</php>
  1. 在你的测试类中引入RefreshDatabase Trait,该Trait会在每一条测试用例执行前自动执行所有迁移、执行完成后重置数据库,既解决表不存在的问题,也可以避免不同测试用例之间的数据污染:
<?php

namespace Tests\Feature;

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class IndexPageTest extends TestCase
{
    use RefreshDatabase;

    public function testExistSomeTextsInIndexPage()
    {
        // Laravel 7及之前版本写法
        $user = factory(User::class)->create();
        // Laravel 8及之后版本请改用该写法
        // $user = User::factory()->create();
        $this->get('/')->assertSee($user->name);
    }
}
  1. 如果你不想使用默认的内存SQLite数据库,需要用自定义的测试库,可手动执行测试环境迁移命令创建表:
php artisan migrate --env=testing

内容的提问来源于stack exchange,提问作者kaveh.hd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 17:27:03