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

问题描述 投票:0回答:4

我正在尝试开发一个 Laravel Composer 包并在其中运行单元测试。在过去几天阅读了各种过时且相互矛盾的指南和博客文章后,我完全不知道如何解决这个问题。

这是我目前所知道的:

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

我可以让 Orchestra Test Bench 从给出的示例中进行一些基本测试,但我不太明白发生了什么,文档几乎没有解释任何内容。当涉及到测试我的应用程序的路由时,我无法让任何东西工作。

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

unit-testing laravel-5 phpunit laravel-dusk
4个回答
5
投票

我同意:

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

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

Orchestral 的文档今天相当不错,但如果您想对某些 Eloquent 模型进行单元测试,我无论如何都会给出一个如何使用它的简短示例。

首先,确保您的包有一个

ServiceProvider
类,该类指向您的迁移文件,如 docs 中所述。

然后,将

orchestral/testbench
包引入到您的包中,并在
tests/TestCase.php
中创建一个文件。

文件

TestCase
应执行以下操作:

  • 扩展乐团测试用例
  • 使用
    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'   => '',
        ]);
    }
}

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

欲了解更多详情,请查看我的博客文章


4
投票

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

1) 创建一个名为

src/tests
的文件夹。

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

  • 用于单元测试的 Unit 文件夹。
  • A Feature 文件夹。
  • A Browser 文件夹,用于使用 Laravel Dusk 运行测试(用于端到端测试)。

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

3)所有测试都使用 Laravel 的基本测试套件,因此您需要包含 Dusk 的完整 Laravel 安装(仅当您使用浏览器测试时才需要 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 测试失败将出现在默认的 Laravel Dusk 屏幕截图文件夹中(对我们来说这很好,所以我们没有花时间对此进行投资)。

0
投票

我做了其他人说的所有事情,但我的问题没有解决,除非我改变 Laravel 根的

<testsuites>
中的
phpunit.xml
:

<testsuites>
    <testsuite name="Unit">
        <directory suffix="Test.php">packages\YourVendorName\YourPackageName</directory>
    </testsuite>
</testsuites>

0
投票

将此行代码添加到 phpunit.xml 并支持所有包

<testsuite name="Unit">
  <directory>packages/*/src/tests/Unit</directory>
</testsuite>
<testsuite name="Feature">
  <directory>packages/*/src/tests/Feature</directory>
</testsuite>
© www.soinside.com 2019 - 2024. All rights reserved.