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.
相关产品推荐
相关产品推荐

