Laravel 5.4; 如何从Laravel包中运行单元测试?

Ini*_*igo 8 phpunit unit-testing laravel-5 laravel-dusk

我正在尝试开发一个Laravel编写器包并从中运行单元测试.在过去几天阅读各种过时且矛盾的指南和博客后,我对如何解决这个问题感到困惑.

这是我目前所知道的:

  • 我不应该从主要的Laravel安装中运行测试.测试应该都包含在包中.我承认这有一定的逻辑.
  • 有一种叫做Orchestra Testbench的东西.如果您正在开发Laravel包,那么显然您应该使用它.
  • 还有一种名为Laravel Dusk的东西,包含在Laravel 5.4中.

我可以让Orchestra Test Bench从给出的示例中进行一些基本测试,但我并不真正理解发生了什么,文档几乎没有解释.在测试我的应用程序的路由时,我无法获得任何工作.

我不明白Orchestra和Dusk是否可以一起玩,或者我必须在它们之间做出选择.如果是这样,我应该使用哪一个?如果它是我应该使用的Laravel Dusk,那么如何在我的包目录中运行它?

Ada*_*dam 5

我同意:

我不应该从主要的 Laravel 安装运行测试。测试应全部包含在包中

为了避免在您的应用程序中安装 Laravel 并手动引导它来测试您的包,您可以使用Orchestral Testbench

Orchestral 的文档今天非常好,但是如果您想对某些 Eloquent 模型进行单元测试,我还是会给出一个如何使用它的简短示例。

首先,确保您的包有一个ServiceProvider类指向您的迁移文件,如文档中所述。

然后,将orchestral/testbench包引入到你的包中,并在tests/TestCase.php.

该文件TestCase应执行以下操作:

  • 扩展 Orchestra 测试用例
  • 指向您的服务提供商 getPackageProviders
  • SQLite在内存中设置数据库getEnvironmentSetUp
  • 运行 migrate 以在其中创建表 setUp()

下面是一个例子:

<?php

namespace MyVendorName\MyPackageName\Tests;

use MyVendorName\MyPackageName\MyServiceProvider;

class TestCase extends \Orchestra\Testbench\TestCase
{
    public function setUp(): void
    {
        parent::setUp();

        $this->artisan('migrate', ['--database' => 'testbench'])->run();
    }

    /**
     * add the package provider
     *
     * @param $app
     * @return array
     */
    protected function getPackageProviders($app)
    {
        return [MyServiceProvider::class];
    }


    /**
     * Define environment setup.
     *
     * @param  \Illuminate\Foundation\Application  $app
     * @return void
     */
    protected function getEnvironmentSetUp($app)
    {
        // Setup default database to use sqlite :memory:
        $app['config']->set('database.default', 'testbench');
        $app['config']->set('database.connections.testbench', [
            'driver'   => 'sqlite',
            'database' => ':memory:',
            'prefix'   => '',
        ]);
    }
}
Run Code Online (Sandbox Code Playgroud)

并回答您的第二个问题:Laravel Dusk 与 Orchestral Testbench 配合得很好。与上面需要模拟数据库以测试 Eloquent 包模型的情况类似,您必须使用 Orchestral 模拟路由和视图才能使用 Laravel Dusk 进行浏览器测试。

有关更多详细信息,请查看我的博客文章


Ara*_*gor 4

这是我在开发包时所做的事情:

1) 创建一个名为 的文件夹src/tests

2)在这个文件夹中,我遵循“正常”结构:

  • 用于单元测试的Unit文件夹。
  • 功能文件夹。
  • 用于使用 Laravel Dusk 运行测试的浏览器文件夹(用于端到端测试)。

注意:Dusk 允许您像真实用户单击链接、填写表单等一样测试您的应用程序。测试应用程序用户界面(即使它使用 JavaScript)真的很酷。因此,如果您的软件包不包含任何接口,您可能不需要 Dusk。

3) 所有测试都使用 Laravel 的基本测试套件,因此您需要包含 Dusk 的完整 Laravel 安装(仅当您使用浏览器测试时才需要 Dusk)。

  • 因此,对于我扩展的单元和功能测试\Tests\TestCase

  • 浏览器测试扩展\Tests\DuskTestCase

4) 现在使用测试路径运行测试:

phpunit /path/to/packages/pascall/icms
Run Code Online (Sandbox Code Playgroud)

或者,对于黄昏:

php artisan dusk /path/to/packages/pascall/icms
Run Code Online (Sandbox Code Playgroud)

(或者你可以cd /path/to/packages/pascall/icms然后运行phpunit​​.

我从未使用过 Orchestra,因为我的团队发现此选项更简单、更容易,所以我无法帮助您。

缺点:

  • Dusk 测试失败将出现在默认的 Laravel Dusk 屏幕截图文件夹中(对我们来说这很好,所以我们没有花时间对此进行投资)。