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

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

"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

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

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

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

TestCase.php:替换所有内容

<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
        use CreatesApplication;
}

新建CreatesApplication.php

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

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

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

到此今天踩的所有的坑就全部聊完了。
原文链接地址

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 2
leo

其实没有必要单独下载phpunit,Laravel默认的composer.json里面就带了phpunit,路径是vendor/bin/phpunit

7年前 评论

@leo 是的,我喜欢全局安装,

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!