Как программно вызвать тест сумерек из команды php artisan

Мне нужно запустить один из моих тестов Laravel Dusk из ремесленной команды, чтобы он обрабатывался ежедневно. Я пробовал $this->call('dusk'); в своей команде, но она запускает все тесты сумерек и не позволяет мне добавить группу или фильтр. Мне нужно провести всего 1 тест. Как добавить фильтр?

$this->call('dusk', [ '--group' => 'communication_tests' ]);

or

$this->call('dusk', [ '--filter' => 'tests\Browser\myTestFile::myTestMethod' ]);

не работает и игнорирует переданные параметры. Есть идеи, как это сделать?


person Jay    schedule 06.02.2019    source источник


Ответы (1)


1-е: создайте рабочий тест Laravel Dusk. Протестируйте его с помощью php artisan dusk и убедитесь, что он работает.

2-й создайте свою собственную команду в папке app \ Commands под названием DuskCommand, чтобы перезаписать родную команду Laravels DuskCommand и сделать ее подписью «dusk». Попросите его расширить Laravel \ Dusk \ Console \ DuskCommand и записать в его метод дескриптора приведенный ниже код (см. https://github.com/laravel/dusk/issues/371 для другой версии этого кода). Я отредактировал свой, чтобы удалить $this->option('without-tty') ? 3 : 2 тернарный оператор, поэтому он просто читает 2 для моего, поскольку этот параметр не существует или не нужен для моей версии laravel.

3-й добавьте новый класс в ядро, чтобы при вызове php artisan dusk класс распознавался.

4-й создайте новую команду для программного запуска вашего сумеречного теста, используя последнюю строку, добавленную @taytus.

5-е также добавьте этот новый класс в ядро.

Вот мой файл внизу ...

Мой тест на сумерки laravel (tests \ Browser \ CommunicationsTest.php) (ШАГ 1)

<?php

namespace Tests\Browser;

use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use App\Models\User;

class CommunicationsTest extends DuskTestCase
{
    /**
     * A Dusk test example.
     * @group all_communication_tests
     * @return void
     */
    public function test_that_all_coms_work()
    {
        // Test Text
        $this->browse(function (Browser $browser) {

            $browser->resize(1920, 1080);
            $browser->loginAs(7)
                ->visit('/events/types/appointments')
                ->assertSee('Automated Messages')
                ->click('.text_message0')
                ->pause(1000)
                ->click('.send-eng-text-btn')
                ->pause(1000)
                ->type('phone', env('TESTING_DEVELOPER_PHONE'))
                ->click('.send-text')
                ->pause(5000)
                ->assertSee('Your test text has been sent.');

            // Test Email
            $browser->visit('/events/types/appointments')
                ->assertSee('Automated Messages')
                ->click('.email0')
                ->assertSee('Automated Messages')
                ->driver->executeScript('window.scrollTo(595, 1063);');
            $browser->click('.send-eng-email-btn')
                ->pause(2000)
                ->click('.send-email')
                ->pause(10000)
                ->assertSee('Your test email has been sent.');

            // Test Call
            $browser->visit('/audio/testcall')
                ->assertSee('Test Call')
                ->type('phone', env('TESTING_DEVELOPER_PHONE'))
                ->press('Call')
                ->pause(3000)
                ->assertSee('Test Call Queued');
        });
    }
}

Моя команда перезаписи сумерек (app \ Console \ Commands \ DuskCommand.php) (ШАГ 2)

<?php

namespace App\Console\Commands;

use Laravel\Dusk\Console\DuskCommand as VendorDuskCommand;
use Symfony\Component\Process\ProcessBuilder;

class DuskCommand extends VendorDuskCommand
{

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'dusk';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Run Tests on our system... by extending the Laravel Vendor DuskCommand.';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->purgeScreenshots();

        $this->purgeConsoleLogs();

        $options=array(); 
        // This line checks if it is a direct call or if has been called from Artisan (we assume is Artisan, more checks can be added) 
        if($_SERVER['argv'][1]!='dusk'){ 
            $filter=$this->input->getParameterOption('--filter'); 
            // $filter returns 0 if has not been set up 
            if($filter){
                $options[]='--filter'; 
                $options[]=$filter; 
                // note: --path is a custom key, check how I use it in Commands\CommunicationsTest.php 
                $options[]=$this->input->getParameterOption('--path'); 
            } 
        }else{ 
            $options = array_slice($_SERVER['argv'], 2); 
        }

        return $this->withDuskEnvironment(function () use ($options) {
            $process = (new ProcessBuilder())
                ->setTimeout(null)
                ->setPrefix($this->binary())
                ->setArguments($this->phpunitArguments($options))
                ->getProcess();

            try {
                $process->setTty(true);
            } catch (RuntimeException $e) {
                $this->output->writeln('Warning: '.$e->getMessage());
            }

            return $process->run(function ($type, $line) {
                $this->output->write($line);
            });
        });
    }

}

Теперь добавьте эту новую команду в ядро, чтобы она регистрировалась, когда вы ее вызываете, и перезаписывала функциональность родной / вендорной DuskCommand. (ШАГ 3)

/**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
         // .... preceding commands....
         Commands\DuskCommand::class,
   ];

Теперь создайте команду, которая будет программно вызывать сумрак - вот мой (ШАГ 4)

<?php 

namespace App\Console\Commands;

use DB;
use Illuminate\Console\Command;

class TestCommunications extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'test:communications';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Test Email, Text, and Phone Calls to make sure they\'re operational.';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {

       $response = $this->call('dusk',['--filter'=>'test_that_all_coms_work','--path'=>'tests/Browser/CommunicationsTest.php']);

    }
}

и зарегистрируйте его в ядре (ШАГ 5) ...

/**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
         .... preceding commands....
         Commands\DuskCommand::class,
         Commands\TestCommunications::class,
   ];

Теперь запустите php artisan dusk, он должен поразить расширяющуюся команду DuskCommand и работать нормально. Затем вызовите новую команду php artisan, которая заменяет мой файл TestCommunications.php, и она должна отлично работать в сумерках ... если, конечно, ваш тест работает. Дайте мне знать, если у вас возникнут вопросы или я что-то упустил.

Помните, что Dusk работает только в локальной среде ... это не то, что вы хотите / должны / изначально можете реализовать в производственной среде

person Jay    schedule 21.02.2019
comment
Метод BadMethodCallException App \ Console \ Commands \ DuskCommand :: withDuskEnvironment не существует. - person Sinan Eldem; 20.11.2019