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

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

// PHP CODE

"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

// SHELL CODE

$ 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升级过来的用户,在这个过程中你会遇到这样的问题

// SHELL CODE

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,然后去将下面的内容替换掉文件的内容

// PHP CODE

"autoload-dev ": {
"psr-4 ": {
"Tests \ \ ": "tests/ ",
}
},

TestCase.php:替换所有内容

// PHP CODE

<?php
namespace Tests;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
abstract class TestCase extends BaseTestCase
{
use CreatesApplication;
}

新建CreatesApplication.php

// PHP CODE

<?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文件了

// SHELL CODE

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

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