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

时间:2017-07-02 00:30:43

标签: unit-testing laravel-5 phpunit laravel-dusk

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

这是我目前所知道的:

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

我可以让Orchestra Test Bench使用来自the examples given的一些基本测试,但我真的不明白发生了什么,文档几乎没有解释。在测试我的应用程序的路由时,我无法正常工作。

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

2 个答案:

答案 0 :(得分:1)

以下是我在开发软件包时所做的事情:

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

2)在这个文件夹中,我按照"正常"结构:

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

注意:Dusk允许您测试您的应用程序,因为真实用户会点击链接,填写表单等。测试应用程序用户界面非常酷(即使它使用JavaScript)。因此,如果您的包裹不包含任何界面,您可能不需要黄昏。

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

  • 因此,对于单元和功能测试,我扩展了\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,因为我的团队发现这个选项更简单,更容易,所以我无法帮助你。

缺点:

  • 黄昏测试失败将出现在Default Laravel Dusk截图文件夹中(对我们来说这很好,所以我们没有花时间投入这些)。

答案 1 :(得分:0)

我同意:

  

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

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

今天,Orchestral的文档还不错,但是如果您想在某些Eloquent模型上进行单元测试,无论如何我都会举一个简短的示例。

首先,请确保您的软件包具有ServiceProvider类,该类指向docs中所述的迁移文件。

然后,将orchestral/testbench包放入您的包中,并在tests/TestCase.php中创建一个文件。

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

  • 扩展乐团TestCase
  • 使用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进行浏览器测试。

有关更多详细信息,请查看我的blog post

相关问题