zoukankan      html  css  js  c++  java
  • 基于laravel自定义测试组件

    3-基于laravel自定义测试组件

    基于laravel自定义测试组件

    0. 课程内容

    1. composer的介绍和laravel的关系
    2. composer工作原理...想跳过 (ノ´▽`)ノ♪
    3. 简要效果及功能介绍
    4. 开发laravel-简化版的单元测试组件-搭建

    1. composer的介绍和laravel的关系

    建议可以看看这个手册:https://docs.phpcomposer.com/01-basic-usage.html

    什么是composer?...没什么可介绍的 ✧*。٩(ˊᗜˋ*)و✧*。 百度,还是简单说一下就是一个专门管理PHP的扩展包的工具。

    laravel 开发模式就是一种组件化的开发模式,把整个框架拆分为不同的单独的零件。每一个零件实际上就是一个单独的组件,每一个组件你都可以在composer的资源包中查找到

    然后你可以在 https://packagist.org/ 查找到这个组件

    所以实际laravel就是一个扩展包。

    2. composer工作原理

    它主要由三个部分组成:命令行工具、包仓库、代码库:

    Packagist

    它是官方仓库,也就是我们平常说的 Composer 源,它的作用是存储这些包的信息,版本,代码来源,依赖,作者,主页等信息。官网是 https://packagist.org/, 你也可以将自己的包发布在上面,这样 Composer 工具就能搜索与安装你的包了,后面我们会具体介绍发布流程。

    Repository

    代码仓库,Packagist 支持公开与私有仓库,通常是 GitHub 作为代码仓库,当然也可以是 BitBucket 或者 GitLab。

    Vendor directory

    我们的 Composer 依赖包都统一安装在项目的 vendor 目录下,其中还有 vendor/composer 目录用于存储依赖包的一些基本信息,比如命名空间等。

    然后composer的源码解析 https://segmentfault.com/a/1190000014948542

    composer的目录结构:

    vendor/
    ├── .editorconfig # 编辑器配置文件,比如缩进大小、换行模式等
    ├── .gitattributes # git 配置文件,可以设计导出时忽略文件等
    ├── .gitignore # git 忽略文件配置列表
    ├── .php_cs # PHP-CS-Fixer 配置文件
    ├── README.md
    ├── composer.json
    ├── phpunit.xml.dist
    ├── src # 源代码核心目录
    │ └── .gitkeep
    └── tests # 用于存放单元测试或者功能测试的测试用例代码,与 src 组织规则基本一致
    └── .gitkeep
    

    我们可以直接引用第三方别人写好的构建composer包的工具

    $ composer global require "overtrue/package-builder" --prefer-source
    $ package-builder build [目标目录名]
    

    3. 开发laravel-简化版的单元测试组件-搭建

    构造项目

    > package-builder build junit-laravel
    
    Name of package (example: foo/bar): shineyorkjunit-laravel
    Namespace of package [ShineyorkJunitLaravel]:
    Description of package: A simplified version of the laravel framework unit test
    Author name of package [ShineYork]:
    Author email of package [shineyork@sixstaredu.com]:
    License of package [MIT]:
    Do you want to test this package ? [Y/n]:
    Do you want to use php-cs-fixer format your code ? [Y/n]:
    Standard name of php-cs-fixer [symfony]:
    Package shineyork/junit-laravel created in: ./junit-laravel
    

    对于如上的那个功能最为重要的几个功能点基于laravel来看就需要视图和路由。对于没有写过的小伙伴们可以参考别人是怎么操作的怎么写的。

    先把基础的调用方法的类写好 srcHttpControllersJunitController.php

    <?php
    namespace ShineYorkJunitLaravelHttpControllers;
    
    use IlluminateHttpRequest;
    use IlluminateRoutingController;
    
    /**
    * use IlluminateRoutingController 这是laravel的基类控制器
    * index() 访问测试的页面
    * store() 是表示用来执行需要测试的方法
    */
    class JunitController extends Controller
    {
    public function index()
    {
    return view('junit::index');
    }
    // 如下内容,想要丰富就自个完善吧
    public function store(Request $request)
    {
    $namespace = $request->input('namespace');
    $className = $request->input('className');
    $action = $request->input('action');
    $param = $request->input('param');
    $class = ($className == "") ? $namespace : $namespace.'\'.$className;
    // 要提换的值 需要的结果
    $class = str_replace("/", "\", $class);
    $object = new $class();
    $param = ($param == "") ? [] : explode('|', $param) ;
    $data = call_user_func_array([$object, $action], $param);
    return (is_array($data)) ? json_encode($data) : dd($data);
    }
    }
    
    ?>
    

    然后添加一下页面 resourcesviewsindex.blade.php

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    </head>
    
    <body>
    <h1>不区分大小写(可以自行完善)</h1>
    <br>
    <form class="" action="{{route('test.store')}}" method="post">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    命名空间:<input type="text" value='' style="width:300px" name='namespace' placeholder="如:appindexcontroller 或appindexcontrollerIndex">可以写全,然后下面类名不用些 <br>
    类名:<input type="text" name='className' placeholder="如:index ">命名空间全可以不用写<br>
    测试方法名:<input type="text" name='action' placeholder="index"><br>
    传递参数以 | 分割:<input type="text" placeholder="如: 1|2|3" name='param'><br>
    <input type="submit" name="" value="测试"/>
    </form>
    </body>
    </html>
    

    对应的项目目录

    那么怎么集成与laravel Σ(☉▽☉"a? 那么我们可以参考的观众选择与 laravel/telescope (这是laravel的一个调试工具) 之后再去解释这个玩意有什么用,把它单独的下载下来

    composer require laravel/telescope --dev
    

    实际上像laravel的这些组件就是通过laravel的服务容器进行加载的,然后启动laravel的时候执行laravel的这些服务容器中的boot方法加载路由以及视图

    模仿着操作一下。

    添加路由srcHttp outes.php

    <?php
    Route::get('/', 'JunitController@index');
    Route::post('/', 'JunitController@store')->name('sjunit.store');
    ?>
    

    添加服务提供者 srcJunitServiceProvide.php

    <?php
    namespace ShineYorkJunitLaravel;
    
    use IlluminateSupportFacadesRoute;
    use IlluminateSupportServiceProvider;
    
    class JunitServiceProvide extends ServiceProvider
    {
    public function boot()
    {
    $this->registerRoutes();
    
    $this->loadViewsFrom(
    __DIR__.'/../resources/views', 'junit'
    );
    }
    
    private function routeConfiguration()
    {
    return [
    'namespace' => 'ShineYorkJunitLaravelHttpControllers',
    'prefix' => 'junit',
    ];
    }
    private function registerRoutes()
    {
    Route::group($this->routeConfiguration(), function () {
    $this->loadRoutesFrom(__DIR__.'/Http/routes.php');
    });
    }
    }
    ?>
    

    然后早config/app.php中添加对于这个服务提供者的加载

    测试:

    $ cd ../junit-laravel-test
    $ composer create-project laravel/laravel laravel
    $ cd laravel
    
    # 配置包路径,注意,这里 `../junit-laravel` 为相对路径,不要弄错了
    $ composer config repositories.shineyork path ../../junit-laravel
    
    # 安装扩展包
    $ composer require shineyork/junit-laravel:dev-master
    
    ./composer.json has been updated
    Loading composer repositories with package information
    Updating dependencies (including require-dev)
    Package operations: 1 install, 0 updates, 0 removals
    - Installing shineyork/junit-laravel (dev-master): Junctioning from ../../junit-laravel
    Writing lock file
    Generating optimized autoload files
    > IlluminateFoundationComposerScripts::postAutoloadDump
    > @php artisan package:discover --ansi
    Discovered Package: beyondcode/laravel-dump-server
    Discovered Package: fideloper/proxy
    Discovered Package: laravel/tinker
    Discovered Package: nesbot/carbon
    Discovered Package: nunomaduro/collision
    Discovered Package: shineyork/junit-laravel
    Package manifest generated successfully.
    

    然后随便在项目中添加一个测试的类Test.php

    然后再通过php artisan route:list检测加载的路由

    >php artisan route:list
    +----------+----------+--------------+---------------------------------------------------------------+--------------+
    | Method | URI | Name | Action | Middleware |
    +----------+----------+--------------+---------------------------------------------------------------+--------------+
    | GET|HEAD | / | | Closure | web |
    | GET|HEAD | api/user | | Closure | api,auth:api |
    | GET|HEAD | junit | | ShineYorkJunitLaravelHttpControllersJunitController@index | |
    | POST | junit | sjunit.store | ShineYorkJunitLaravelHttpControllersJunitController@store | |
    +----------+----------+--------------+---------------------------------------------------------------+--------------+
    

    通过这个操作访问到在app下定义的test类中的index方法 http://127.0.0.1:8000/junit

    然后发现ok那就这样 (o゚▽゚)o

  • 相关阅读:
    《Cracking the Coding Interview》——第11章:排序和搜索——题目2
    《Cracking the Coding Interview》——第11章:排序和搜索——题目1
    《Cracking the Coding Interview》——第9章:递归和动态规划——题目11
    《Cracking the Coding Interview》——第9章:递归和动态规划——题目10
    《Cracking the Coding Interview》——第9章:递归和动态规划——题目9
    《Cracking the Coding Interview》——第9章:递归和动态规划——题目8
    《Cracking the Coding Interview》——第9章:递归和动态规划——题目7
    《Cracking the Coding Interview》——第9章:递归和动态规划——题目6
    《Cracking the Coding Interview》——第9章:递归和动态规划——题目5
    Q-learning
  • 原文地址:https://www.cnblogs.com/weixinsb/p/13051573.html
Copyright © 2011-2022 走看看