Laravel 依赖于正在测试的工具的功能测试?

Laravel 依赖于正在测试的工具的功能测试?,laravel,testing,Laravel,Testing,我正在努力提高我对特性测试的理解 我随机挑选了一个我朋友做的拉威尔项目。我看到他们使用app/文件夹来组织所有常用的东西,如模型、数据传输对象、控制器等。。。基本上,这个项目负责的RESTAPI的所有应用程序逻辑 我还注意到一个名为tests/feature的文件夹,其中包含我最近学到的功能测试。我发现有趣的是代码看起来像这样: use App\Profile; class HobbyFeatureTest extends FeatureTestCase { // other code

我正在努力提高我对特性测试的理解

我随机挑选了一个我朋友做的拉威尔项目。我看到他们使用
app/
文件夹来组织所有常用的东西,如模型、数据传输对象、控制器等。。。基本上,这个项目负责的RESTAPI的所有应用程序逻辑

我还注意到一个名为
tests/feature
的文件夹,其中包含我最近学到的功能测试。我发现有趣的是代码看起来像这样:

use App\Profile;

class HobbyFeatureTest extends FeatureTestCase
{
    // other code ...etc...
    public function testGetUserHobbyyOnUserWithNoHobby()
    {
        $response = $this->getJson('api/user/me/hobbies')->assertOk();  /// makes a PHP curl call
        $response->assertJson($this->profile->hobby->toArray());
    }
    // other code ...etc...
}
基本上,
$this->profile
App\profile
的一个实例。而
api/user/me/cabiods
在其构造上也依赖于
App\Profile

我发现这很不寻常,因为这意味着您正在使用正在测试的工具进行测试?使用与要测试的代码相同的代码库进行特性测试难道不会有问题吗


我问题的背景

我突然想到,几年前,我编写了功能测试,却不知道它们的真正名称。我所做的不同之处在于,我在一个完全独立的代码库(git项目)中用ruby语言编写了所有特性测试,以测试在golang中构建的restful API。我的ruby代码将加载模拟数据库快照,然后ping每个golang api并评估它们的响应。我拥有两个代码库的动机是:

  • 我希望我的特性测试的底层代码尽可能与正在测试的代码独占。我试图实现模拟到
  • 如果我将API重新平台化到另一种技术上,我希望我的特性测试可以重复使用。这证明很有用,因为API最初是用PHP5构建的。当PHP5使用寿命结束时,我用golang在新的架构下重建了API(还需要解决一些技术债务)。我很高兴能够保留并重新使用90%的ruby特性测试

  • 基于我唯一的其他写作测试经验,我感到奇怪的是,Laravel采取了一种没有意识到我在上面两点中提到的好处的方法。因此,我想更好地理解Laravel实现特性测试的动机,或者如果将特性测试放在单独的代码库中存在固有的错误?

    Laravel中的特性测试是我所说的现代集成测试。其中,作为集成测试,一起测试系统的多个部分。因此,数据库是
    Laravel
    代码,而不是web服务器,因为这是一种模拟API的虚假方法,而不是使用传统方法,如
    Apache
    Nginx

    这种方法的理由是非常固执己见的,但我的看法是。在传统的单元测试中,您应该模拟系统中未被测试的大部分。模型、数据库层等。
    Laravels
    模型是一个很难模仿的问题,需要模仿每一个有说服力的调用,很快就会变成一对。相反,在特性测试中,您可以轻松创建一个影响整个系统的测试。这遵循了Laravel的基本方法,即它应该是
    ,具有表达力强、优雅的语法
    ,请参见该引文

    public function testSeeProfile () {
        $profile = factory(Profile::class)->create();
    
        $response = $this->json('api/profile/' . $profile->id);
    
        $response->assertJson(...);
    }
    
    这就是您编写测试、测试逻辑、数据库层以及开发人员关心的一切的简单程度。在
    Laravel
    术语中,这是一个特性测试,我称之为现代特性测试或真正的集成测试


    这并不能取代真正的功能测试,应该使用
    Dusk
    Selenium
    Cypress
    或类似工具来完成。我会把它保存在另一个单独的项目中。当
    Laravel
    有黄昏时,它会变得模糊,这可以在您的项目中实现。在真正的web服务器被使用之前,它不是一个“真正的”功能测试,而且
    Laravel
    功能测试仍然不能做到这一点。

    由于文献中的测试方法在单元/集成和功能测试之间的差异上相当模糊,这对于stackoverflow帖子来说是相当自以为是的,我希望我能给你一些启发,我认为是什么样的设计思想背后什么是Laravel功能测试。这是伟大的。我有一个快速跟进的问题。在进行laravel特性测试的同时进行真实特性测试(如黄昏、selenium等)是否很常见?或者说,真正的特性测试通常足够了吗?我所看到的特性测试更多的是针对应用程序中的流。我想注册我们的申请。通过前端进行多个api调用。Laravel特征测试是每个端点的边缘情况。因此,一个真正的功能测试,可以击中100的小拉威尔功能测试。在我参与的项目中,已经实现了特性测试,与laravel测试相比,特性测试非常少。比如20个特性测试到800个“单元测试”。cypress功能测试通常按常规计划运行,以便在您破坏应用程序时进行测试。