目录

Laravel5.3升级到5.4phpunit闹出的乌龙

laravel5.4这个版本几个月前就已经发布了,这几天想着尝鲜就更新了一下,这儿更新还很简单,主要就是修改composer.json文件,修改如下,找到相应位置替换就可以了,随后执行composer update,laravel的更新就OK了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
"require ": {
    "php ": ">=5.6.4 ",
    "laravel/framework ": "5.4.* ",
    "raulfraile/ladybug ": "^1.0 ",
    "barryvdh/laravel-ide-helper ": "^2.2 ",
    "predis/predis ": "^1.1 ",
    "phpoffice/phpword ": "v0.13.* ",
},
"require-dev ": {
    "fzaninotto/faker ": "~1.4 ",
    "mockery/mockery ": "0.9.* ",
    "phpunit/phpunit ": "~5.7 ",
    "symfony/css-selector ": "3.1.* ",
    "symfony/dom-crawler ": "3.1.* ",
},

今天看了一下phpunit,虽然之前一直就对测试感兴趣,但是一直在迭代,真没时间来看这些东西。直到今天,才开始了解这部分

安装phpunit

在laravel5.4中,对phpunit的要求是5.7,我就在开发机上安装了phpunit

1
2
3
4
wget https://phar.phpunit.de/phpunit.phar
chmod +x phpunit.phar
sudo mv phpunit.phar /usr/local/bin/phpunit
phpunit --version

上面的东西很简单,但是我还是遇到了问题,在运行phpunit命令的时候,提示我***/usr/bin/env: php: 没有那个文件或目录***,这个问题是由于我的php安装路径和phpunit识别的路径不一致所导致的,这个通过软连就可以搞定“ln -s /opt/remi/php70/root/usr/bin/php /usr/local/bin/php”这样就可以解决第一个坑。

phpunit的使用

直接到你的项目目录下执行phpunit就OK了,但是这儿还是会有一个坑,这个坑应该只针对于从5.3升级过来的用户,在这个过程中你会遇到这样的问题

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
PHP Fatal error:  Class 'Tests\TestCase' not found in /search/service/nginx/html/laravel/tests/Feature/ExampleTest.php on line 10
PHP Stack trace:
PHP   1. {main}() /usr/local/bin/phpunit:0
PHP   2. PHPUnit\TextUI\Command::main() /usr/local/bin/phpunit:468
PHP   3. PHPUnit\TextUI\Command->run() phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:136
PHP   4. PHPUnit\TextUI\Command->handleArguments() phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:147
PHP   5. PHPUnit\Util\Configuration->getTestSuiteConfiguration() phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:776
PHP   6. PHPUnit\Util\Configuration->getTestSuite() phar:///usr/local/bin/phpunit/phpunit/Util/Configuration.php:856
PHP   7. PHPUnit\Framework\TestSuite->addTestFiles() phar:///usr/local/bin/phpunit/phpunit/Util/Configuration.php:952
PHP   8. PHPUnit\Framework\TestSuite->addTestFile() phar:///usr/local/bin/phpunit/phpunit/Framework/TestSuite.php:400
PHP   9. PHPUnit\Util\Fileloader::checkAndLoad() phar:///usr/local/bin/phpunit/phpunit/Framework/TestSuite.php:327
PHP  10. PHPUnit\Util\Fileloader::load() phar:///usr/local/bin/phpunit/phpunit/Util/Fileloader.php:39
PHP  11. include_once() phar:///usr/local/bin/phpunit/phpunit/Util/Fileloader.php:55

这个问题主要原因是类的加载,laravel5.4是使用了命名空间处理这个东西,而5.3版本则是使用了classname的方式引入TestCaes,这个问题的处理也比较简单,直接按照5.4的文件去修改就好了。 修改composer.json文件和TestCase.php文件,以及创建CreatesApplication.php composer.json,找到autoload-dev,然后去将下面的内容替换掉文件的内容

1
2
3
4
5
"autoload-dev ": { 
   "psr-4 ": {
       "Tests  \ \ ": "tests/ ",
  }
},

TestCase.php:替换所有内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;
}

新建CreatesApplication.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php

namespace Tests;

use Illuminate\Contracts\Console\Kernel;

trait CreatesApplication
{
    /**
     * Creates the application.
     *
     * @return \Illuminate\Foundation\Application
     */
    public function createApplication()
    {
        $app = require  __DIR __ . '/../bootstrap/app.php';
        $app->make(Kernel::class)->bootstrap();
        return $app;
    }
}

在做完这些工作后你就可以运行下面的命令,创建test文件了

1
2
3
4
5
// 在 Feature 目录下创建一个测试类...
php artisan make:test UserTest

// 在 Unit 目录下创建一个测试类...
php artisan make:test UserTest --unit

到此今天踩的所有的坑就全部聊完了。