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

Laravel 8 继承父测试类后如何在子类中运行父类测试方法

解决方法

你只需要对父测试类做简单修改即可实现需求,核心是避免PHPUnit将父类识别为独立测试类:


步骤1:将父类声明为抽象类

修改BaseControllerTest为抽象类,PHPUnit会自动跳过对抽象类的测试执行,只会在它的所有非抽象子类中运行继承来的测试方法:

<?php

namespace Tests\Feature\Modules;

use Tests\TestCase;

// 加abstract关键字声明为抽象类
abstract class BaseControllerTest extends TestCase
{
    // 可根据需求选择用属性或者抽象方法传递子类差异化数据
    protected array $commonTestParams;
    abstract protected function getTestCaseConfig(): array;

    public function test_common_method_for_each_child()
    {
        // 公共测试逻辑直接调用子类传入的数据即可
        $config = $this->getTestCaseConfig();
        $response = $this->get($config['request_uri']);
        $response->assertStatus($config['expect_code']);
    }
}

步骤2:子类中传入对应测试数据

子类继承抽象父类后,只需要赋值对应属性或者实现抽象方法传入差异化数据,不需要重写公共测试逻辑:

<?php

namespace Tests\Feature\Modules;

class ChildControllerTest extends BaseControllerTest
{
    // 实现父类要求的抽象方法,返回当前子类的测试配置
    protected function getTestCaseConfig(): array
    {
        return [
            'request_uri' => '/child/route',
            'expect_code' => 200
        ];
    }

    public function test_unique_method()
    {
        // 子类独有测试逻辑
    }
}
<?php

namespace Tests\Feature\Modules;

class Child1ControllerTest extends BaseControllerTest
{
    protected function getTestCaseConfig(): array
    {
        return [
            'request_uri' => '/child1/route',
            'expect_code' => 201
        ];
    }

    public function test_unique_method()
    {
        // 子类独有测试逻辑
    }
}

执行效果

修改完成后运行php artisan test,输出的测试列表就会完全符合你的预期,每个子类都会执行继承来的公共测试方法和自己的独有测试方法:

ChildControllerTest->test_common_method_for_each_child
ChildControllerTest->test_unique_method

Child1ControllerTest->test_common_method_for_each_child
Child1ControllerTest->test_unique_method

内容的提问来源于stack exchange,提问作者Oli Soproni B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:24:02