单元测试用于验证最小可测试单元的正确性,Laravel通过PHPUnit支持测试;使用php artisan make:test MathHelperTest --unit创建测试类,并在tests/Unit/MathHelperTest.php中编写测试方法验证MathHelper::add()结果是否符合预期。

在 Laravel 中进行单元测试和功能测试是保证应用质量的重要手段。Laravel 基于 PHPUnit 构建了完整的测试支持,让你可以轻松编写和运行测试。下面介绍如何在 Laravel 中进行单元测试与功能测试,包括基本用法、常见断言和实际操作示例。
单元测试(Unit Testing)
单元测试用于验证应用程序中最小的可测试单元,比如一个类或方法是否按预期工作。在 Laravel 中,单元测试通常不加载整个框架,只测试独立逻辑。
1. 创建单元测试使用 Artisan 命令创建一个单元测试类:
php artisan make:test MathHelperTest --unit这会在 tests/Unit 目录下生成 MathHelperTest.php。 2. 编写简单单元测试
假设你有一个简单的帮助类:
namespace App\Helpers;
class MathHelper
{
public static function add($a, $b)
{
return $a + $b;
}
}
对应的测试代码如下:
assertEquals(5, $result);
}
}
注意:单元测试类不应使用 RefreshDatabase 或数据库相关 Trait,以保持轻量。
功能测试(Feature Testing)
功能测试用于测试应用程序的实际行为,例如 HTTP 请求、路由、中间件、数据库交互等。它模拟用户操作,验证整个流程是否正常。
注意:请将此程序放在网站根目录下运行。若没有IIS,请直接运行根目录下的 测试.exe 进行本地测试。 基本功能表基本设置:后台可修改联系方式,网站信息。管 理 员:可新增管理员。自定义导航:新增修改导航菜单、菜单排序等。单页管理:单页面新增关键词和描述等。新闻增加:新闻可设置标题、新闻分类、添加内容等。新闻管理:可分类查看新闻、修改新闻、删除新闻等。产品管理:产品增加二级分类,产品略缩图、产品
执行命令生成功能测试(无需加 --unit):
php artisan make:test UserRegistrationTest该命令会在 tests/Feature 目录下创建测试文件。 2. 测试用户注册流程
假设你有一个用户注册接口,可以通过 POST 请求创建用户:
post('/register', [
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => 'password',
'password_confirmation' => 'password',
]);
// 断言状态码为 302(重定向)或 201(创建成功)
$response->assertRedirect('/dashboard');
// 验证数据库中存在该用户
$this->assertDatabaseHas('users', [
'email' => 'john@example.com'
]);
}
}
常用功能测试方法:
- $this->get('/url'):发起 GET 请求
- $this->post('/url', $data):发起 POST 请求
- $response->assertStatus(200):断言响应状态码
- $response->assertSee('text'):断言响应包含文本
- $response->assertJson(['key' => 'value']):断言 JSON 响应
- $this->assertDatabaseHas('table', [...]):断言数据库记录存在
运行测试
使用 PHPUnit 运行所有测试:
php artisan test或运行特定测试文件:
php artisan test tests/Feature/UserRegistrationTest.php你也可以使用原生 PHPUnit 命令(需安装):
./vendor/bin/phpunit
使用数据库测试时的注意事项
功能测试常涉及数据库操作,推荐使用 RefreshDatabase Trait,它会在测试前后迁移并清空数据,确保测试隔离。
use Illuminate\Foundation\Testing\RefreshDatabase;
class ExampleTest extends TestCase
{
use RefreshDatabase;
}
避免使用 DatabaseTransactions,因为它在某些场景下可能不可靠。
基本上就这些。Laravel 的测试系统开箱即用,配合合理的断言和结构,能有效提升代码可靠性。









