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并评估它们的响应。我拥有两个代码库的动机是:
基于我唯一的其他写作测试经验,我感到奇怪的是,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功能测试通常按常规计划运行,以便在您破坏应用程序时进行测试。