14

我正在尝试开发一个 Laravel 作曲家包并在其中运行单元测试。在过去几天阅读了各种过时且相互矛盾的指南和博文之后,我完全不知道如何去做。

到目前为止,这是我所知道的:

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

我可以通过给出的示例让 Orchestra Test Bench 使用一些基本测试,但我并不真正了解发生了什么,文档几乎没有解释任何内容。在测试我的应用程序的路由时,我什么都做不了。

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

4

2 回答 2

5

我同意:

我不应该从 Laravel 主安装运行测试。测试都应该包含在包中

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

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

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

然后,将orchestral/testbench包放入您的包中并在tests/TestCase.php.

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

  • 扩展 Orchestra 测试用例
  • 指向您的服务提供商getPackageProviders
  • SQLite在内存中设置数据库getEnvironmentSetUp
  • 运行迁移以在其中创建表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'   => '',
        ]);
    }
}

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

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

于 2019-11-17T08:37:09.427 回答
4

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

1) 创建一个名为src/tests.

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

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

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

3)所有测试都使用 Laravel 的基础测试套件,所以你需要一个完整的 Laravel 安装,包括 Dusk(只有在使用浏览器测试时才需要 Dusk)。

  • 所以对于我扩展的单元和功能测试\Tests\TestCase

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

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

phpunit /path/to/packages/pascall/icms

或者,对于黄昏:

php artisan dusk /path/to/packages/pascall/icms

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

我从未使用过 Orchestra,因为我的团队发现这个选项更直接、更容易,所以我无法帮助你。

缺点:

  • Dusk 测试失败将出现在 Default Laravel Dusk screenshot 文件夹中(对我们来说这很好,所以我们没有花时间对此进行投资)。
于 2017-08-15T07:19:48.780 回答