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

Unit testing Laravel 5.4;如何从Laravel包运行单元测试?,unit-testing,laravel-5,phpunit,laravel-dusk,Unit Testing,Laravel 5,Phpunit,Laravel Dusk,我正在尝试开发一个Laravel composer包,并在其中运行单元测试。在过去的几天里,我阅读了各种过时的、相互矛盾的指南和博客文章,我完全不知道该怎么做 以下是我目前所知道的: 我不应该从主Laravel安装运行测试。所有测试都应包含在包中。我承认这是有一定道理的 有一种叫做。如果你正在开发一个Laravel软件包,那么显然你应该使用这个 还有一个叫做,它包含在Laravel 5.4中 我可以让管弦乐队的测试台进行一些基本的测试,但我不太明白到底发生了什么,文档几乎什么也解释不了。当涉

我正在尝试开发一个Laravel composer包,并在其中运行单元测试。在过去的几天里,我阅读了各种过时的、相互矛盾的指南和博客文章,我完全不知道该怎么做

以下是我目前所知道的:

  • 我不应该从主Laravel安装运行测试。所有测试都应包含在包中。我承认这是有一定道理的
  • 有一种叫做。如果你正在开发一个Laravel软件包,那么显然你应该使用这个
  • 还有一个叫做,它包含在Laravel 5.4中
我可以让管弦乐队的测试台进行一些基本的测试,但我不太明白到底发生了什么,文档几乎什么也解释不了。当涉及到测试我的应用程序的路由时,我无法让任何东西正常工作

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

以下是我在开发包时的操作:

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

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

  • 用于单元测试的单元文件夹
  • 功能文件夹
  • 用于使用Laravel Dusk运行测试的浏览器文件夹(用于端到端测试)
注意:Dusk允许您像真正的用户那样测试应用程序,如单击链接、填写表单等。测试应用程序用户界面(即使它使用JavaScript)真的很酷。因此,如果您的软件包不包含任何接口,那么您可能不需要Dusk

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

  • 因此,对于单元和特性测试,我扩展了
    \tests\TestCase

  • 浏览器测试扩展
    \tests\testcase

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

phpunit /path/to/packages/pascall/icms
或者,对于黄昏:

php artisan dusk /path/to/packages/pascall/icms
(或者您可以
cd/path/to/packages/pascall/icms
,然后运行
phpunit

我从来没有使用过乐队,因为我的团队发现这个选项更简单、更直接,所以我不能帮你

缺点:

  • 黄昏测试失败将出现在默认的Laravel黄昏屏幕截图文件夹中(对我们来说,这很好,所以我们没有花时间研究)
    • 我同意:

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

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

      今天,管弦乐队的文档非常好,但如果你想在一些有说服力的模型上进行单元测试,我将给出一个如何使用它的简短示例

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

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

      文件
      TestCase
      应执行以下操作:

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

      你能告诉我们你的软件包是做什么的吗?如果它是一个composer插件,我怀疑你会需要Dash,因为它的目的是通过UI层对你的应用程序进行功能测试。这听起来不像是你想要的。我不知道Testbench,但它看起来更像你可能需要的,但坦率地说,我会从简单的ph开始punit和laravel提供的一些测试特性。这是一个内容管理系统,也使用Angular JS 4。我使用Angular的测试套件来测试所有UI内容。用于编写路由测试的Dash代码看起来很好,很简单,希望用它来测试API路由。我还需要能够测试数据库查询等o我真的需要使用Laravel的一个实例。那么你想在Dash中使用Laravel?你正在测试完全不同的应用程序?这可以通过更改Dash的访问URL来完成。@hasandz不,我正在测试一个我正在开发的包,它位于主应用程序/Laravel安装的子目录中。我想从这个目录运行我的测试,这样我的所有包组件都捆绑在一起,我不需要污染主应用程序——我相信这是推荐的协议。让我们检查phpunit和Dusk。只需运行
      php vendor/bin/phpunit
      ,它就可以运行单元测试和Dusk测试。如果你只想运行Dusk测试,你可以使用它
      php artisan dusk
      。这些命令有错误吗?那么我如何配置testbench,使viiews目录指向我的包中的一个目录?@JunaidQadir这样说:谢谢代码链接。我实际上是想写
      resources
      目录。让我看看我想要指向的/vendor/chestration/testbench core/laravel/re源到我的包资源路径。