Laravel单元测试专注单个类或方法逻辑,使用PHPUnit集成,测试文件置于tests/Unit/目录,类名以Test结尾、方法以test_开头,不依赖HTTP请求或数据库,可用Mockery模拟外部依赖。

在 Laravel 中编写单元测试和功能测试,核心是利用内置的 PHPUnit 集成和丰富的测试辅助方法。Laravel 默认已配置好 phpunit.xml,测试文件放在 tests/ 目录下,通过 php artisan test(或 vendor/bin/phpunit)运行。
单元测试验证模型、服务类、帮助函数等不依赖 HTTP 请求或数据库(或使用内存数据库/模拟)的独立逻辑。Laravel 提供 TestCase 基类,但单元测试通常继承更轻量的 \Tests\TestCase 或直接用 PHPUnit\Framework\TestCase。
tests/Unit/ 目录下,类名以 Test 结尾(如 CalculatorTest.php)test_ 开头或用 @test 注释标记$this->get()、$this->actingAs() 等 HTTP 相关方法Mockery 模拟(Laravel 自带)或 PHP 的 createMock()
示例(测试一个简单的服务类):
// tests/Unit/PriceCalculatorTest.php
<?php
namespace Tests\Unit;
use App\Services\PriceCalculator;
use PHPUnit\Framework\TestCase;
class PriceCalculatorTest extends TestCase
{
public function test_calculates_total_with_tax()
{
$calculator = new PriceCalculator();
$total = $calculator->withTax(100, 0.15);
$this->assertEquals(115, $total);
}
}
功能测试(也称“特性测试”)验证整个请求生命周期:路由 → 控制器 → 视图/响应,常涉及数据库、认证、会话等。Laravel 的 \Tests\TestCase 提供了开箱即用的测试工具链。
立即学习“PHP免费学习笔记(深入)”;
tests/Feature/ 目录下sqlite:memory),也可用 @database 注解或 RefreshDatabase trait$this->get()、$this->post()、$this->assertStatus(200)、$this->assertSee('Welcome')、$this->assertJson(...)
$this->actingAs($user),无需真实 session示例(测试文章列表页):
// tests/Feature/ArticleIndexTest.php
<?php
namespace Tests\Feature;
use App\Models\Article;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ArticleIndexTest extends TestCase
{
use RefreshDatabase;
public function test_articles_page_returns_successful_response()
{
Article::factory()->count(3)->create();
$response = $this->get('/articles');
$response->assertStatus(200);
$response->assertSee('Articles');
$response->assertSeeText('Article Title 1');
$response->assertJsonCount(3, 'data');
}
}
Laravel 测试中操作数据库最推荐的方式是模型工厂(Factories)+ RefreshDatabase trait,它自动在每个测试前后用事务回滚,速度快且隔离性好。
Article::factory()->create() 创建测试数据,支持属性覆盖:['title' => 'Test']
Article::factory()->count(5)->create()
User::factory()->hasPosts(3)->create()
DB::table(...)->insert(...),破坏可读性和维护性UsesTransactions 替换或禁用 RefreshDatabase
php artisan test --filter ArticleIndexTest
php artisan test --filter test_articles_page_returns_successful_response
php artisan test -v
php artisan test --coverage-html coverage
use RefreshDatabase;,或模型未加 $fillable 导致工厂创建失败基本上就这些。Laravel 的测试体验流畅,关键在于分清单元与功能的边界,善用工厂和测试 trait,让测试既可靠又易维护。
以上就是Laravel如何编写单元测试和功能测试?(PHPUnit示例)的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号