基於 ThinkPHP6 的註解路由 + 自動接口文檔生成 + 自動Mock測試數據生成

基於 ThinkPHP6 的註解路由 + 自動接口文檔生成 + 自動測試數據生成

做者

zsw zswemail@qqcom

主頁 https://zsw.inkphp

github https://github.com/iszsw/mockgit

gitee https://gitee.com/iszsw/mockgithub

使用

一、安裝

composer require iszsw/mock:dev-masterjson

二、添加測試代碼 在 app/controller 目錄下增長Test.php文件
<?php
namespace app\controller;

use app\BaseController;
use iszsw\mock\annotation\illustrate\AutoValidate;
use iszsw\mock\annotation\illustrate\Route;
use iszsw\mock\annotation\illustrate\Mock;
use iszsw\mock\annotation\illustrate\MockPack;
use iszsw\mock\annotation\illustrate\WikiItem;
use iszsw\mock\annotation\illustrate\WikiMenu;

/**
 * @WikiMenu("測試")
 * @package app\controller
 * Author: zsw zswemail@qq.com
 */
class Test extends BaseController
{

    /**
     * @Route("test", method="GET")
     * @WikiItem("首頁", description="首頁詳情")
     *
     * @AutoValidate({"username":"require|chsAlpha"}, message={"username":"請輸入用戶名"})
     * @Mock("username", mode="request", title="用戶名", example="name")
     * @Mock("name", mode="response", title="名字", example="name", description="文章ID")
     */
    public function index($username){
        return "hello " . $username;
    }

    /**
     * @Route("mock", method="GET")
     * @WikiItem("詳情", description="文章詳情")
     *
     * @Mock("id", title="ID", example="numberBetween", description="文章ID")
     * @MockPack("articles", mode="response", title="文章列表", description="文章列表", limit=5)
     * @Mock("id", mode="response", title="ID", example="randomDigitNotNull", description="文章ID")
     * @Mock("title", mode="response", title="標題", example="name")
     * @Mock("create_time", mode="response", title="建立時間", example={"date": {"Y-m-d", "now"}})
     * @Mock("content", mode="response", title="內容", example={"sentence": 10})
     * @Mock("image", mode="response", title="圖片", example="randomDigit")
     * @MockPack("user", main=true, mode="response", title="用戶", description="發佈者信息", limit=0)
     * @Mock("username", mode="response", title="用戶名", example="name")
     * @MockPack("user")
     * @MockPack("articles")
     * @Mock("page", mode="response", title="頁碼", example="randomDigitNotNull", description="當前頁碼")
     */
    public function mock(){}
}
三、複製文檔資源文件 vendor/iszsw/mock/src/static 文件夾放置到public下
<br>若是路徑不不是 /static 能夠在config/mock.php配置文件中修改
四、 訪問
註解路由:/test?username=zsw

測試數據:/mock?mock=1

接口文檔:/wiki

功能說明

配置文件 config/mock.php

一、註解路由

路由註解 模型註解 自動注入同Tp6官方註解

新增AutoValidate註解app

@AutoValidate({"username":"require|chsAlpha"}, message={"username":"請輸入用戶名"})

二、接口測試數據生成

MockPack 嵌套數據生成支持無限級嵌套
@MockPack extends MockBase
    // 數據長度 0表示單層數據
    @var int limit 
    
    /*
     * 置頂 (limit > 1 時有效)
     * false:['fields'=>[["a"=>"b"], ["aa"=>"bb"]]]
     * true:[["a"=>"b"], ["aa"=>"bb"]]
     */
    @var boolean main

例:composer

/**
 * @MockPack("articles", mode="response", title="文章列表", description="文章列表", limit=3)
 * @Mock("title", mode="response", title="標題", example="name")
 * @Mock("content", mode="response", title="內容", example={"sentence": 10})
 *
 * @MockPack("user", main=true, mode="response", title="用戶", description="發佈者信息", limit=0)
 * @Mock("username", mode="response", title="用戶名", example="name")
 * @MockPack("user")
 * 
 * @MockPack("articles")
 */
 
生成結果

{
    "articles": [{
        "title": "喬陽",
        "content": "Vero impedit et consequatur quasi doloribus dolores illum sit expedita doloremque fugiat esse deleniti quisquam.",
        "user": {
            "username": "方建明"
        }
    }, {
        "title": "蒙桂花",
        "content": "Iure explicabo officiis minima et impedit sunt dignissimos necessitatibus ratione animi nam aperiam dolorum.",
        "user": {
            "username": "谷致遠"
        }
    }, {
        "title": "鄭文",
        "content": "Minus cum unde exercitationem sunt laudantium eveniet voluptatem magni ut cum non.",
        "user": {
            "username": "寧麗娟"
        }
    }]
}
Mock 數據生成
@Mock extends MockBase
    /**
      * 自定義字符串 example="zsw"
      * Faker方法名 參考https://github.com/fzaninotto/Faker
      * 自定義方法名 \app\logic\Mock::name
      * example="方法名" || example={"方法名": {"參數1", "參數2"}}
      */
    @var string|array example

三、接口文檔生成

<?php
/**
 * @WikiMenu("測試")
 */
class Test extends BaseController
{
    /**
     * @Route("test", method="GET")
     * @WikiItem("首頁", description="首頁詳情")
     * @Mock("name", mode="response", title="名字", example="name", description="名字")
     */
    public function index(){
        return "zsw";
    }
}

使用參考

一、註解路由

二、接口測試數據生成

<?php
namespace app\controller;

use app\BaseController;
use iszsw\mock\annotation\illustrate\Route;
use iszsw\mock\annotation\illustrate\Mock;
use iszsw\mock\annotation\illustrate\MockPack;
use iszsw\mock\annotation\illustrate\WikiItem;
use iszsw\mock\annotation\illustrate\WikiMenu;

/**
 * @WikiMenu("測試")
 */
class Test extends BaseController
{
    /**
     * @Route("mock", method="GET")
     * @WikiItem("詳情", description="文章詳情")
     * @Mock("id", title="ID", example="numberBetween", description="文章ID")
     * 
     * @MockPack("articles", mode="response", title="文章列表", description="文章列表", limit=3)
     * @Mock("title", mode="response", title="標題", example="name")
     * @Mock("content", mode="response", title="內容", example={"sentence": 10})
     *
     * @MockPack("user", main=true, mode="response", title="用戶", description="發佈者信息", limit=0)
     * @Mock("username", mode="response", title="用戶名", example="name")
     * @MockPack("user")
     * 
     * @MockPack("articles")
     */
    public function mock(){}
}

生成的數據格式爲dom

{
    "articles": [{
        "title": "喬陽",
        "content": "Vero impedit et consequatur quasi doloribus dolores illum sit expedita doloremque fugiat esse deleniti quisquam.",
        "user": {
            "username": "方建明"
        }
    }, {
        "title": "蒙桂花",
        "content": "Iure explicabo officiis minima et impedit sunt dignissimos necessitatibus ratione animi nam aperiam dolorum.",
        "user": {
            "username": "谷致遠"
        }
    }, {
        "title": "鄭文",
        "content": "Minus cum unde exercitationem sunt laudantium eveniet voluptatem magni ut cum non.",
        "user": {
            "username": "寧麗娟"
        }
    }]
}

三、接口文檔生成

<?php
namespace app\controller;

use iszsw\mock\annotation\illustrate\Route;
use iszsw\mock\annotation\illustrate\WikiItem;
use iszsw\mock\annotation\illustrate\WikiMenu;

/**
 * @WikiMenu("測試")
 */
class Test
{

    /**
     * @Route("test", method="GET")
     * @WikiItem("首頁", description="首頁詳情")
     * @Mock("username", mode="request", title="用戶名", example="name")
     * @Mock("name", mode="response", title="名字", example={"\app\controller\Mock::name": {100}}, description="文章ID")
     */
    public function index($username){}
}


文檔圖片 https://wx2.sbimg.cn/2020/07/...測試

相關文章
相關標籤/搜索