国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

做好自動(dòng)化 API 測(cè)試(1)- 從一個(gè)好用的 Json Validator 開(kāi)始

RancherLabs / 479人閱讀

摘要:就目前我的面試經(jīng)驗(yàn)而言,絕大部分項(xiàng)目都沒(méi)有引入自動(dòng)化測(cè)試,測(cè)試基本都是依靠開(kāi)發(fā)人員的自測(cè)以及測(cè)試人員黑盒測(cè)試。本文不探討黑盒測(cè)試,僅僅發(fā)表一點(diǎn)我對(duì)自動(dòng)化測(cè)試的想法。緣起早在兩年多以前,就在思考如何做的測(cè)試,保證返回的結(jié)果與預(yù)期的一致。

目前,前后端分離的開(kāi)發(fā)模式越來(lái)越受到大家的青睞,前端與后端的職責(zé)也更加清晰,后端通過(guò) API 提供數(shù)據(jù),前端通過(guò) API 獲取數(shù)據(jù),展示頁(yè)面,前端有更大的發(fā)揮空間、后端也可以更加專注于數(shù)據(jù)處理。

在這樣的時(shí)代大背景下,我嘗試從后端的角度出發(fā),通過(guò)一系列文章,探討后端開(kāi)發(fā)人員應(yīng)該如何交付高質(zhì)量的 API 接口,減少溝通成本,降低「聯(lián)調(diào)」可能出現(xiàn)的問(wèn)題,保證代碼質(zhì)量以及項(xiàng)目按期完成。

就目前我的面試經(jīng)驗(yàn)而言,絕大部分項(xiàng)目都沒(méi)有引入自動(dòng)化 API 測(cè)試,測(cè)試基本都是依靠開(kāi)發(fā)人員的自測(cè)以及測(cè)試人員黑盒測(cè)試。本文不探討黑盒測(cè)試,僅僅發(fā)表一點(diǎn)我對(duì)自動(dòng)化 API 測(cè)試的想法。

首先,在我來(lái)看,缺少自動(dòng)化 API 測(cè)試可能存在以下問(wèn)題:

API 實(shí)現(xiàn)與設(shè)計(jì)不符,比如缺少字段或者字段類型不正確

API 無(wú)法形成完整閉環(huán),缺少功能,「聯(lián)調(diào)」還需要不斷修改

新加功能可能導(dǎo)致已有 API 出現(xiàn) BUG,手動(dòng)回歸測(cè)試耗時(shí)且繁瑣

API 測(cè)試是一個(gè)比較大的主題,本文主要就「如何讓 API 的實(shí)現(xiàn)與設(shè)計(jì)相符合」這一點(diǎn)出發(fā),說(shuō)一說(shuō)我的想法及開(kāi)發(fā) Json Validator 的心路歷程。

緣起

早在兩年多以前,就在思考如何做 API Schema 的測(cè)試,保證 API 返回的結(jié)果與預(yù)期的一致。當(dāng)時(shí)發(fā)現(xiàn)了 Json-Schema 這個(gè)工具,也研究了一番,但上手成本還是略高,最終并沒(méi)有實(shí)質(zhì)的產(chǎn)出什么東西。

然后去年在開(kāi)發(fā) Blink Framework 的 API 測(cè)試組件的時(shí)候,發(fā)現(xiàn) Laravel 中 驗(yàn)證 Json 的用法,很簡(jiǎn)潔優(yōu)雅,同時(shí) Codeception 也有類似的組件。

于是我就在想,有沒(méi)有可能結(jié)合這兩種方式的優(yōu)點(diǎn),自己開(kāi)發(fā)一個(gè) Json Validator,保持嚴(yán)謹(jǐn)?shù)耐瑫r(shí)盡可能簡(jiǎn)單易用。

契機(jī)

正好2017新的一年,公司產(chǎn)品需要對(duì)外提供新的 Open API,方便與合作廠商就行業(yè)務(wù)對(duì)接。我認(rèn)為這是一個(gè)實(shí)驗(yàn)和推行新 API 測(cè)試方式的時(shí)機(jī),于是便利用假期的時(shí)間,開(kāi)發(fā)出了 Json Validator 的原型,讀者可以在 rethinkphp/json-validator 查看它的最新代碼。
Json Validator 通過(guò)簡(jiǎn)單的語(yǔ)法定義 Json 結(jié)構(gòu),然后驗(yàn)證給定的數(shù)據(jù)是否滿足預(yù)定義的 Json 結(jié)構(gòu),比 Json-Schema 更加簡(jiǎn)單易用。

設(shè)計(jì)思想

除了保證設(shè)計(jì)的簡(jiǎn)潔優(yōu)雅外,Json Validator 引入類型系統(tǒng)的概念,通過(guò)開(kāi)發(fā)者自定義類型,實(shí)現(xiàn)類型的復(fù)用與自由組合,讓 Json 的驗(yàn)證更方便高效,只要一個(gè)項(xiàng)目的基礎(chǔ)類型定義好了,剩下基本搭積木組裝即可。

基本用法之類型

Json Validator 默認(rèn)提供7種內(nèi)置類型,他們分別是: integer, double, boolean, string, number, arrayobject。開(kāi)發(fā)者也可以定義自己的復(fù)合數(shù)據(jù)類型,如下的例子定義了一個(gè) User 復(fù)合類型:

$validator->defineType("User", [
    "name" => "string",
    "gender" => "string",
    "age" => "?integer",
]);

這個(gè) User 類型有三個(gè)屬性,name、gender 和 age,其中 name 和 gender 都是 string 類型,age 為 integer 類型,但允許為 null。這里我們?cè)陬愋偷那懊婕右粋€(gè) ? 表示該字段可以為 null

除了定義復(fù)合數(shù)據(jù)類型,我們也可以定義列表類型,比如定義一個(gè) UserCollection 的類型,它是一個(gè)數(shù)組,數(shù)組的每個(gè)元素都是 User:

$validator->defineType("UserCollection", ["User"]);

要定義一個(gè)列表類型,類型的定義必須是只有一個(gè)元素的數(shù)組,數(shù)組的第一個(gè)元素即該列表類型所允許容納的類型。

對(duì)于復(fù)雜應(yīng)用場(chǎng)景,我們也可以使用 PHP 的 callable 來(lái)定義更靈活的類型,如下我們定義一個(gè) timestamp 的類型,它驗(yàn)證給定的值必須是合法的時(shí)間字符串。

$validator->defineType("timestamp", function ($value) {
    if ((!is_string($value) && !is_numeric($value)) || strtotime($value) === false) {
        return false;
    }

    $date = date_parse($value);

    return checkdate($date["month"], $date["day"], $date["year"]);
});
基本用法之驗(yàn)證

定義好了數(shù)據(jù)類型之后,我們就可以驗(yàn)證給定的數(shù)據(jù)是否符合定義,如果不符合定義,Validator 會(huì)給出錯(cuò)誤信息。

use rethinkphpjsvValidator;

$validator = new Validator();
// $validator->defineType(...)  Add your custom type if necessary

$matched = $validator->matches($data, "User");
if ($matched) {
    // Validation passed
} else {
    $errors = $validator->getErrors();
}

在一些場(chǎng)景下,我們希望我們定義的類型與給定的數(shù)據(jù)完全匹配,不需要多余的字段,這個(gè)時(shí)候可以使用 Json Validator 的嚴(yán)格模式:

$data = [
    "name" => "Bob",
    "gender" => "Male",
    "age" => 19,
    "phone" => null, // This property is unnecessary
];
$matched = $validator->matches($data, "User", true); // strict mode is turned on
var_dump($matched); // false is returned

這個(gè)例子就會(huì)驗(yàn)證失敗,因?yàn)?phone 字段在 User 中并沒(méi)有定義。

未來(lái)暢想

本文介紹了我開(kāi)發(fā) Json Validator 的背景和過(guò)程以及它的簡(jiǎn)單用法,但我也在想它的使用場(chǎng)景可能不僅局限于此,下面是我對(duì)其未來(lái)的一些想法:

類型系統(tǒng)與文檔生成工具相結(jié)合,從代碼直接生成 API 文檔的數(shù)據(jù)模型部分

自動(dòng)生成 Json-Schema 定義文件,跨語(yǔ)言使用更方便

通過(guò)生成 Json-Schema 定義文件,實(shí)現(xiàn)自描述 RESTFul API

未完待續(xù)...


本文首發(fā)于「代碼寫(xiě)詩(shī)」微信公眾號(hào)及同名知乎專欄

掃描二維碼關(guān)注「代碼寫(xiě)詩(shī)」公眾號(hào)

微信公眾號(hào): https://mp.weixin.qq.com/s/cN...
知乎專欄: https://zhuanlan.zhihu.com/p/...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/22545.html

相關(guān)文章

  • Spring 參數(shù)校驗(yàn)最佳實(shí)踐(附完整實(shí)例)

    摘要:否則非法請(qǐng)求參數(shù)小則影響用戶體驗(yàn)或者產(chǎn)生垃圾數(shù)據(jù),大則會(huì)拖跨整個(gè)系統(tǒng)其次,手工對(duì)所有的參數(shù)進(jìn)行校驗(yàn)相當(dāng)繁瑣,容易出錯(cuò),而且最后,通過(guò)工具來(lái)完成其實(shí)是比較好的方式,但是必須讓工具變得優(yōu)雅一些。 聲明:本文屬原創(chuàng)文章,始發(fā)于公號(hào):程序員自學(xué)之道,同步發(fā)布到 sf,轉(zhuǎn)載請(qǐng)注明出處。 不夠好的方案 在 Web 開(kāi)發(fā)中, 我們經(jīng)常需要校驗(yàn)各種參數(shù),這是一件繁瑣又重要的事情,對(duì)于很多人來(lái)說(shuō),在做參...

    tomlingtm 評(píng)論0 收藏0
  • flask starter: tadpole

    摘要:另外一個(gè)則用于健康檢查。聯(lián)合使用這些查詢條件可以看到僅僅返回了中列出的列而且按照過(guò)濾的結(jié)果并且根據(jù)中的排序條件進(jìn)行了排序。數(shù)據(jù)庫(kù)中沒(méi)有記錄的以及沒(méi)有關(guān)聯(lián)的是對(duì)所有人開(kāi)放的。 tadpole 是一個(gè)flask starter 項(xiàng)目。從平時(shí)flask項(xiàng)目的開(kāi)發(fā)過(guò)程中提出來(lái)的一些通用的功能,如通過(guò)gunicorn管理flask應(yīng)用的配置文件和啟動(dòng)腳本,初始化virtualenv環(huán)境同時(shí)安裝必...

    mengera88 評(píng)論0 收藏0
  • 小白邊學(xué)邊寫(xiě),一個(gè)基于laravelAPP接口【API】(三)

    摘要:但是,作為一名合格的,我們也應(yīng)該具備一些前端知識(shí)。但是,我們還需要驗(yàn)證手機(jī)號(hào)是否是唯一的,如果不唯一則應(yīng)告知給客戶端。 前言 前兩篇文章我們已經(jīng)把基本的注冊(cè)功能給完成了。但是,作為一名合格的PHPer,我們也應(yīng)該具備一些前端知識(shí)。HTML+css已經(jīng)是最基本的技能了,那么接下來(lái),就來(lái)點(diǎn)題外內(nèi)容,讓我們?nèi)パ芯恳幌翵avaScript吧。首先先說(shuō)明用js要做什么事情,對(duì),就是完善注冊(cè)頁(yè)面的...

    TerryCai 評(píng)論0 收藏0
  • 小白邊學(xué)邊寫(xiě),一個(gè)基于laravelAPP接口【API】(三)

    摘要:但是,作為一名合格的,我們也應(yīng)該具備一些前端知識(shí)。但是,我們還需要驗(yàn)證手機(jī)號(hào)是否是唯一的,如果不唯一則應(yīng)告知給客戶端。 前言 前兩篇文章我們已經(jīng)把基本的注冊(cè)功能給完成了。但是,作為一名合格的PHPer,我們也應(yīng)該具備一些前端知識(shí)。HTML+css已經(jīng)是最基本的技能了,那么接下來(lái),就來(lái)點(diǎn)題外內(nèi)容,讓我們?nèi)パ芯恳幌翵avaScript吧。首先先說(shuō)明用js要做什么事情,對(duì),就是完善注冊(cè)頁(yè)面的...

    econi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

RancherLabs

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<