Laravel 5.4; Как запустить модульные тесты из пакета Laravel?

Я пытаюсь разработать пакет композитора Laravel и запускать из него модульные тесты. Проведя последние пару дней за чтением различных устаревших и противоречивых руководств и сообщений в блогах, я совершенно не понимаю, как это сделать.

Вот что я знаю на данный момент:

  • Мне не следует запускать тесты из основной установки Laravel. Все тесты должны содержаться в пакете. Признаюсь, в этом есть определенная логика.
  • Есть что-то под названием Orchestra Testbench. Если вы разрабатываете пакет Laravel, очевидно, вам следует его использовать.
  • Также есть что-то под названием Laravel Dusk, которое включено в Laravel 5.4.

Я могу заставить Orchestra Test Bench работать с некоторыми базовыми тестами из приведенных примеров , но я действительно не понимаю, что происходит, а документация почти ничего не объясняет. Когда дело доходит до тестирования маршрутов моего приложения, я ничего не могу заставить работать.

Я не понимаю, могут ли Orchestra и Dusk играть вместе, или мне придется выбирать между ними. Если да, то какой мне использовать? И если мне следует использовать Laravel Dusk, как мне запустить его из каталога моего пакета?


person Inigo    schedule 02.07.2017    source источник
comment
Вы можете рассказать нам, что делает ваш пакет? Если это плагин композитора, я сомневаюсь, что вам понадобится Dusk, поскольку он нацелен на функциональное тестирование вашего приложения через слой пользовательского интерфейса. Похоже, это не то, что вы ищете. Я не знаю Testbench, но он больше похож на то, что вам может понадобиться, но, честно говоря, я бы начал с простого phpunit и некоторых тестовых трейтов, которые предоставляет laravel.   -  person dbrumann    schedule 02.07.2017
comment
Это система управления контентом, которая также использует Angular JS 4. Я использую набор тестирования Angular для всех элементов пользовательского интерфейса. Код Dusk для написания тестов маршрутов выглядит красивым и понятным, и я хотел бы использовать его для тестирования маршрутов API. Мне также нужно иметь возможность тестировать запросы к базе данных и тому подобное, поэтому мне действительно нужно работать с экземпляром Laravel.   -  person Inigo    schedule 02.07.2017
comment
Итак, вы хотите использовать Laravel для Dusk? А вы совсем другое приложение тестируете? Это можно сделать, изменив URL-адрес посещения Dusk.   -  person hasandz    schedule 02.07.2017
comment
@hasandz Нет, я тестирую разрабатываемый мной пакет, который находится в собственном подкаталоге основного приложения / установки Laravel. Я хочу запускать свои тесты из этого каталога, чтобы все компоненты моего пакета были объединены вместе, и мне не нужно было загрязнять основное приложение, что, как я считаю, является рекомендуемым протоколом.   -  person Inigo    schedule 02.07.2017
comment
Давайте проверим phpunit и Dusk. Просто запустите php vendor/bin/phpunit, и он запустит как модульные тесты, так и тесты Dusk. Если вы хотите запустить только тест Dusk, вы можете использовать php artisan dusk. Вы получаете ошибки при использовании этих команд?   -  person hasandz    schedule 02.07.2017
comment
Возможно, я недостаточно ясен. Я пытаюсь разрабатывать свой пакет изолированно. Каталог по умолчанию для тестов Dusk - \tests\Browser. Но я хочу хранить свои тесты в каталоге tests моего пакета, т.е. \packages\pascall\icms\tests. Подобно тому, как описано в этом сообщении в блоге: laracasts.com/discuss/channels/guides/ Возможно ли это?   -  person Inigo    schedule 02.07.2017
comment
В других руководствах, написанных об Orchestra Testbench и аналогичных инструментах для разработки пакетов, тесты не используют основную установку Laravel, а используют полностью отдельный экземпляр Laravel, необходимый в composer.json вашего пакета, который затем находится в папке поставщика вашего пакета.   -  person Inigo    schedule 02.07.2017
comment
В \tests\Browser нет ничего плохого, phpunit берет тесты Dusk из этой папки. Сначала перейдите в папку вашего пакета, например cd /path/to/packages/pascall/icms, затем запустите ../../../vendor/bin/phpunit или просто запустите phpunit, если вы установили глобально. Также вы можете изменить phpunit.xml и phpunit.dusk.xml своего пакета, если вам нужно изменить какие-либо параметры.   -  person hasandz    schedule 03.07.2017


Ответы (2)


Я согласен с:

Мне не следует запускать тесты из основной установки Laravel. Все тесты должны содержаться в пакете.

Чтобы избежать установки Laravel в ваше приложение и его ручной загрузки для тестирования пакета, вы можете использовать Orchestral Testbench.

Документация по Orchestral сегодня довольно хороша, но я все равно приведу небольшой пример того, как ее использовать, если вы хотите провести модульные тесты на некоторых моделях Eloquent.

Во-первых, убедитесь, что в вашем пакете есть ServiceProvider класс, указывающий на ваши файлы миграции, как описано в документации.

Затем потребуйте пакет orchestral/testbench в свой пакет и создайте файл в tests/TestCase.php.

Файл 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.

Для получения дополнительных сведений посетите мой блог. опубликовать.

person Adam    schedule 17.11.2019
comment
Итак, как мне настроить testbench так, чтобы каталог viiews указывал на каталог в моем пакете? - person Junaid Qadir Shekhanzai; 13.12.2019
comment
@JunaidQadir вот так: nithorefubrer_subscribe?hl=ru&hl=ru&hl=ru&hl=ru&hl=ru / Laravel-MultiMail / blob / - person Adam; 13.12.2019
comment
Спасибо за ссылку на код. Я действительно хотел написать каталог resources. Дай мне взглянуть - person Junaid Qadir Shekhanzai; 13.12.2019
comment
Я хочу указать / vendor / orchestra / testbench-core / laravel / resources на путь к ресурсам моего пакета. - person Junaid Qadir Shekhanzai; 14.12.2019

Вот что я делаю при разработке пакета:

1) Создайте папку с именем src/tests.

2) Внутри этой папки я следую «нормальной» структуре:

  • Папка Unit для модульных тестов.
  • Папка Feature.
  • Папка Browser для запуска тестов с Laravel Dusk (для сквозных тестов).

Примечание. Dusk позволяет вам тестировать ваше приложение так, как если бы настоящий пользователь щелкал ссылки, заполнял формы и т. Д. Тестировать пользовательский интерфейс приложения (даже если он использует JavaScript) - это действительно круто. Итак, если в вашем пакете нет интерфейса, вам может не понадобиться Dusk.

3) Все тесты используют базовый набор тестов Laravel, поэтому вам потребуется полная установка Laravel с включенным Dusk (Dusk требуется только в том случае, если вы используете тесты браузера).

  • Итак, для тестов Unit и Feature я расширил \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 по умолчанию (для нас это нормально, поэтому мы не потратили время на это).
person Arangor    schedule 15.08.2017