Laravel Dusk junit doesn't log to file

2019-08-21 21:42发布

问题:

I've written some automated tests using Laravel Dusk and when I run them I get some errors, however I can't seem to scroll through the whole output. First I tried to pipe the output to less but less doesn't work properly for some reason. Then I tried doing:

php artisan dusk --log-junit /path/to/log/file.log

however the log file keeps empty for some reason. The teamcity version of the log works but there the errors are not described.

Also, when I run only the basic test, which comes with Dusk, it logs properly.

Googling doesn't reveal anything.

Any ideas?

EDIT 1:

I've narrowed down the problem to this test:

<?php

namespace Tests\Browser;

use App\Logic\Dates\Transform;
use Tests\DuskTestCase;

class DatesTransforms extends DuskTestCase
{
    /**
     * A Dusk test example.
     *
     * @return void
     */
    public function testMonthEnd()
    {
        $this->assertEquals('2018-01-31 23:59:59', Transform::monthEnd('2018-01'));
        $this->assertEquals('2018-02-28 23:59:59', Transform::monthEnd('2018-02'));
        $this->assertEquals('2018-03-31 23:59:59', Transform::monthEnd('2018-03'));
        $this->assertEquals('2018-04-30 23:59:59', Transform::monthEnd('2018-04'));
        $this->assertEquals('2018-05-31 23:59:59', Transform::monthEnd('2018-05'));
        $this->assertEquals('2018-06-30 23:59:59', Transform::monthEnd('2018-06'));
        $this->assertEquals('2018-07-31 23:59:59', Transform::monthEnd('2018-07'));
        $this->assertEquals('2018-08-31 23:59:59', Transform::monthEnd('2018-08'));
        $this->assertEquals('2018-09-30 23:59:59', Transform::monthEnd('2018-09'));
        $this->assertEquals('2018-10-31 23:59:59', Transform::monthEnd('2018-10'));
        $this->assertEquals('2018-11-30 23:59:59', Transform::monthEnd('2018-11'));
        $this->assertEquals('2018-12-31 23:59:59', Transform::monthEnd('2018-12'));

        $this->assertEquals('2016-02-29 23:59:59', Transform::monthEnd('2016-02'));
    }

    public function testMonthStart()
    {
        $this->assertEquals('2018-01-01 00:00:00', Transform::monthStart('2018-01'));
        $this->assertEquals('2018-02-01 00:00:00', Transform::monthStart('2018-02'));
        $this->assertEquals('2018-03-01 00:00:00', Transform::monthStart('2018-03'));
        $this->assertEquals('2018-04-01 00:00:00', Transform::monthStart('2018-04'));
        $this->assertEquals('2018-05-01 00:00:00', Transform::monthStart('2018-05'));
    }
}

when I run the full test I get this error:

lluminate\\Cont...', Array)
#3 /var/www/domovakniga.local/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(759): Illuminate\Container\Container->make('Illuminate\\Cont...', Array)
#4 /var/www/domovakniga.local/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleEx in /var/www/domovakniga.local/vendor/laravel/framework/src/Illuminate/Container/Container.php on line 945
PHP Stack trace:
PHP   1. {main}() /var/www/domovakniga.local/vendor/phpunit/phpunit/phpunit:0
PHP   2. PHPUnit\TextUI\Command::main() /var/www/domovakniga.local/vendor/phpunit/phpunit/phpunit:61
PHP   3. PHPUnit\TextUI\Command->run() /var/www/domovakniga.local/vendor/phpunit/phpunit/src/TextUI/Command.php:162
PHP   4. PHPUnit\TextUI\TestRunner->doRun() /var/www/domovakniga.local/vendor/phpunit/phpunit/src/TextUI/Command.php:206
PHP   5. PHPUnit\Framework\TestSuite->run() /var/www/domovakniga.local/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:652
PHP   6. Tests\Browser\DatesTransforms->run() /var/www/domovakniga.local/vendor/phpunit/phpunit/src/Framework/TestSuite.php:746
PHP   7. PHPUnit\Framework\TestResult->run() /var/www/domovakniga.local/vendor/phpunit/phpunit/src/Framework/TestCase.php:796
PHP   8. Tests\Browser\DatesTransforms->runBare() /var/www/domovakniga.local/vendor/phpunit/phpunit/src/Framework/TestResult.php:693
PHP   9. Tests\Browser\DatesTransforms->setUp() /var/www/domovakniga.local/vendor/phpunit/phpunit/src/Framework/TestCase.php:838
PHP  10. Tests\Browser\DatesTransforms->setUp() /var/www/domovakniga.local/vendor/laravel/dusk/src/TestCase.php:23
PHP  11. Tests\Browser\DatesTransforms->refreshApplication() /var/www/domovakniga.local/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:68
PHP  12. Tests\Browser\DatesTransforms->createApplication() /var/www/domovakniga.local/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:91
PHP  13. App\Console\Kernel->bootstrap() /var/www/domovakniga.local/tests/CreatesApplication.php:19
PHP  14. Illuminate\Foundation\Application->bootstrapWith() /var/www/domovakniga.local/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:297
PHP  15. Illuminate\Foundation\Bootstrap\BootProviders->bootstrap() /var/www/domovakniga.local/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:211
PHP  16. Illuminate\Foundation\Application->boot() /var/www/domovakniga.local/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/BootProviders.php:17
PHP  17. Illuminate\Foundation\Application->fireAppCallbacks() /var/www/domovakniga.local/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:807
PHP  18. call_user_func:{/var/www/domovakniga.local/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:858}() /var/www/domovakniga.local/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:858
PHP  19. App\Console\Kernel->Illuminate\Foundation\Console\{closure}() /var/www/domovakniga.local/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:858
PHP  20. App\Console\Kernel->defineConsoleSchedule() /var/www/domovakniga.local/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:90
PHP  21. App\Console\Kernel->schedule() /var/www/domovakniga.local/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:107

note that I can't see the top most part due to scrolling issues.

Also, note that when I run each of the methods of that test using filter everything works properly. Which is baffling.

EDIT 2:

Here is the Transform class used in the test:

<?php

namespace App\Logic\Dates;

class Transform {
    /**
     * Given a month in the following format: YYYY-MM
     * it returns datetime for the last second of the month
     *
     * @param $year_and_month
     * @return string
     */
    static function monthEnd($year_and_month) {
        $datetime = $year_and_month . '-01 00:00:00';
        $time = strtotime($datetime);

        $month_end = date('Y-m-t', $time) . ' 23:59:59';

        return $month_end;
    }

    /**
     * Given a month in the following manner: YYYY-MM
     * it returns a datetime for the first second of that month
     *
     * @param $year_and_month
     * @return string
     */
    static function monthStart($year_and_month) {
        $month_start = $year_and_month . '-01 00:00:00';

        return $month_start;
    }
}

EDIT 3:

So I've deleted the problematic test DatesTransform and rewritten it using vanilla phpunit, however when running phpunit I get an error which I again can't log it just logs the following:

PHPUnit 7.5.13 by Sebastian Bergmann and contributors.

.

here is my phpunit command:

vendor/bin/phpunit > /path/phpunit.log

EDIT 4:

Here is the new phpunit DatesTransformationsTest:

<?php

namespace Tests\Unit;

use App\Logic\Dates\Transform;
use Tests\TestCase;

class DatesTransformationsTest extends TestCase
{
    public function testMonthEnd()
    {
        self::assertEquals('2018-01-31 23:59:59', Transform::monthEnd('2018-01'));
        self::assertEquals('2018-02-28 23:59:59', Transform::monthEnd('2018-02'));
        self::assertEquals('2018-03-31 23:59:59', Transform::monthEnd('2018-03'));
        self::assertEquals('2018-04-30 23:59:59', Transform::monthEnd('2018-04'));
        self::assertEquals('2018-05-31 23:59:59', Transform::monthEnd('2018-05'));
        self::assertEquals('2018-06-30 23:59:59', Transform::monthEnd('2018-06'));
        self::assertEquals('2018-07-31 23:59:59', Transform::monthEnd('2018-07'));
        self::assertEquals('2018-08-31 23:59:59', Transform::monthEnd('2018-08'));
        self::assertEquals('2018-09-30 23:59:59', Transform::monthEnd('2018-09'));
        self::assertEquals('2018-10-31 23:59:59', Transform::monthEnd('2018-10'));
        self::assertEquals('2018-11-30 23:59:59', Transform::monthEnd('2018-11'));
        self::assertEquals('2018-12-31 23:59:59', Transform::monthEnd('2018-12'));

        self::assertEquals('2016-02-29 23:59:59', Transform::monthEnd('2016-02'));
    }

    public function testMonthStart()
    {
        self::assertEquals('2018-01-01 00:00:00', Transform::monthStart('2018-01'));
        self::assertEquals('2018-02-01 00:00:00', Transform::monthStart('2018-02'));
        self::assertEquals('2018-03-01 00:00:00', Transform::monthStart('2018-03'));
        self::assertEquals('2018-04-01 00:00:00', Transform::monthStart('2018-04'));
        self::assertEquals('2018-05-01 00:00:00', Transform::monthStart('2018-05'));
    }
}

回答1:

Solved it, it turns out I've defined a method inside the schedule method of the Console's Kernel.php and that was raising errors as a duplicate definition for some reason, no idea why. Once I moved it into its own class problems disappeared!