2022 年 11 月 16 日,星期三 ·12分鐘閱讀

介紹:Bowtie

這將是關於 Bowtie 的一系列文章中的第一篇,希望能不時更新。我在此發言不代表 JSON Schema 組織的任何官方立場 -- Bowtie 並非我們 JSON Schema 團隊今天以任何方式「祝福」的工具,儘管我個人希望它能成為某種官方工具,並且開發它的目的是希望它能以任何意義上的方式歸「社群」所有。目前,我僅以其作者的身分發言 :)

JSON Schema

架構
{ "$schema": "https://json-schema.dev.org.tw/draft/2020-12/schema", "type": "string", "maxLength": 3}

驗證長度最多為 3 的字串。此行為是規範所說的應該發生的情況。在廣泛的程式語言中,每個規範的實作是否都能正確地遵循規範?其他更複雜的架構/實例對呢?這是 Bowtie 試圖解決的關鍵問題 -- 我們如何比較 JSON Schema 實作之間以及規範之間的行為差異,以期更輕鬆地修復實作問題並闡明規範中任何不清楚的部分?

它是什麼

Bowtie 是我所謂的「中繼驗證器」,我的意思是它可以執行其他 JSON Schema 驗證實作並從中收集結果的程式。

在這方面已經有先例。 JSONPath Comparison 專案在這方面對於 JSONPath 做得非常好,而 Nicolas Seriot 的「Parsing JSON is a Minefield」 則是 JSON 本身的絕佳範例。 Bowtie 試圖將這些想法帶入 JSON Schema。

從現有的 JSON Schema 實作列表中,Bowtie 已經 支援 12 個跨 9 種程式語言的實作,允許任何人執行任何這些實作並查看它們對架構和實例的看法。

它附帶一個 命令列程式,但更令人興奮的是,已經設定了此 CLI 的持續自動執行,因此 Bowtie 會發出 跨其所有支援實作的報告

為了產生此報告,Bowtie 會執行 官方 JSON Schema 測試套件,這是我們現有的測試集,旨在驗證是否符合 JSON Schema 規範。許多實作已經 在其自身的持續整合中使用該套件,但這是 JSON Schema 的使用者以及實作者首次可以在單一位置查看跨多個實作執行該套件的結果。測試套件已經很好地涵蓋了我們的規範(特別是其中的驗證部分)。該套件當然並不完美,但因此 Bowtie 的結果確實很好地涵蓋了驗證規範。

為什麼它可能有趣

Bowtie 最顯著的功能是讓您可以輕鬆比較實作遵循規範的程度。這讓實作的使用者以及社群可以了解可能難以實作或常見的錯誤實作的領域。我們希望這能促使改進並激勵大家協助修復問題,並讓整體社群更加強大!

即使超出測試套件的範圍,Bowtie 也能夠為其支援的實作提供統一的介面,這表示您可以快速存取每個實作的結果,而無需學習每個實作提供的語言特定 API。如果您有一個架構和實例,並且想要在多個實作中執行它,或者想要執行您不熟悉或未設定的單一實作,Bowtie 可以提供協助。

我該如何執行它?

如果您僅對其輸出(即測試套件執行的報告)感興趣,您目前可以在以下連結中找到它們,這些連結對應於每個版本的規範

中期目標是將這些合併為一份統一的報告(屆時連結可能會變更,但希望我們能設定重新導向)。

如果您想超出測試套件報告的範圍,您也可以在本地執行 Bowtie,並使用您想要的任何輸入。 Bowtie 是使用 Python 編寫的,並發佈在 PyPI 上。如果您沒有安裝 Python 應用程式的現有偏好設定,請使用您作業系統的平台特定指示來安裝 pipx,然後執行

1$ pipx install bowtie-json-schema

這應該會為您提供一個可運作的 Bowtie,您可以透過以下方式檢查:

1$ bowtie --help

使用說明位於 Bowtie 的文件中,但絕對需要更多文件,因此如果您有任何不了解的地方,請洽詢我 (Julian),這將促使我們記錄它們。

它是如何運作的?

我不會在本篇文章中詳細說明 Bowtie 的實作細節,但在較高的層級,Bowtie 是一個以 Python 編寫的命令列程式,用於協調啟動和關閉 OCI 容器(廣義上為「Docker 容器」)。它執行的容器是「測試工具」-- 一些小型橋接程式,它們採用以任何程式語言編寫的 JSON Schema 實作,然後允許來自 Bowtie 的傳入請求呼叫到正在測試的程式庫中。新增對實作的支援基本上意味著以這種方式實作測試工具(這通常很容易做到),並且一旦測試工具存在,該實作就會在 Bowtie 的報告中亮起,並且任何 Bowtie 的使用者都將能夠透過 Bowtie 的統一 CLI 執行該實作。

如何協助

您(JSON Schema 的使用者、實作的作者或社群成員)可以在兩個方面提供協助

改進實作

首先,也是最明顯的是,將 Bowtie 發現的任何問題(在確認後)回饋給實作,然後協助實作修復它們。

尋找您最喜歡的 JSON Schema 實作,以及它未通過的測試。實作的錯誤追蹤器上是否有關於這些失敗的公開問題?如果這些問題是之前未知的,實作者很可能會歡迎您提交一個包含最簡重現步驟的問題單,因此您可能會想提交一個。如果這些問題已經已知,您可以向 Bowtie 提交一個 Pull Request,其中包含關於下游問題的資訊,Bowtie 可以在報告中使用這些資訊(透過顯示該測試已被明確跳過)。這是一個Pull Request 範例,展示了如何進行操作。

敬請期待不久後將推出的Bowtie 生成的徽章,您可以使用這些徽章來展示您的規範遵循度(沒有比這更酷的了,對吧?)。

改進 Bowtie

第二種方式是幫助改進 Bowtie 本身,我已經有很多想法了,而且隨著越來越多人開始使用它,這些想法只會增加。

再次重複以上部分,我自己已經實作了對許多實作的支援。如果您維護或使用其中一個實作,請查看我編寫的 harness —— 有可能是我誤用了您的實作(雖然到目前為止,幸運的是沒有發生)。

我也想提一下,我一直在嘗試在這裡的直播中進行 Bowtie 的工作 —— 如果不嫌自我宣傳,隨時歡迎來打聲招呼,或者甚至翻閱我之前與各種 Bowtie 相關事物搏鬥的直播,這可能會給您一些關於如何使用它的提示。

以下是一些關於需要幫助的具體領域的指導

這份資訊在本文發布時是最新的,但我希望它很快就會過時。如果看起來是這樣,請隨時聯繫!

給我一些容易上手的事情

在 Bowtie 的問題追蹤器上,有一個我試圖整理的「適合新手」的問題清單。它們涵蓋了 Bowtie 程式碼庫的各個部分(Python 部分、前端部分及其周邊基礎設施)。該標籤並不表示這個問題一定「很小」而容易修復,儘管有很多是這樣。但它確實表示相關的功能或修復是「直接」或很可能範圍明確的。如果您沒有看到有人在處理某個問題,如果您開始處理它,請隨時留言。

我想學習新的實作或程式語言

這可能是最「有趣」的事情之一,或者至少我非常喜歡做這件事。從實作列表中選擇一個 Bowtie 尚未支援的實作,並按照撰寫 harness 的教學進行操作,這將引導您了解 Bowtie 對 harness 的期望。如果教學中有任何不足,請提出或通知我!但這可以是在您之前未使用過的語言中玩簡單程式的好方法,也是學習 JSON Schema 實作的好方法,這些實作可能做出了與您已經熟悉的實作不同的選擇。

報告很醜,我是一個可以提供幫助的前端開發人員或 UI 設計師

這可能是您能提供幫助的最有益的領域。如果這不明顯的話,我自己不是前端開發人員。我(使用 Bootstrap)拼湊出來的東西基本上是展示 Bowtie 輸出結果所需的最低限度。如果您有更多經驗或有餘力思考如何有效地報告測試結果,或比較實作,請提供幫助!Bowtie 的所有「前端程式碼」現在都位於一個地方:一個 Jinja2 模板,它被格式化為靜態單頁網站。除了籠統地「讓它更漂亮、更響應式或更易於使用」之外,這裡還有一些需要注意的具體問題:

我開發 JSON Schema 生態系統中的其他工具

太棒了!我希望 Bowtie 可以很好地與其他上游或下游工具結合使用。舉個具體的例子,鑑於 Bowtie 為下游實作提供統一的介面,一個「明顯」的補充工具可能是跨所有實作進行模糊測試,尋找它們意見不一致、崩潰或產生不符合規範的行為(而這並未在測試套件中明確涵蓋)的情況。這樣做可能只是意味著將這樣的工具連接到 Bowtie 並讓它運行。請參閱此問題,但它沒有包含超出以上內容的細節。

其他工具在與 Bowtie 結合使用時也可能具有良好的互動特性,因此如果您有其他想法,請聯繫或嘗試!

我想貢獻測試

這絕對也有幫助。如果它們是規範本身的測試,請檢查它們是否已存在於官方套件中,如果沒有,請將它們提交到那裡。如果它們不是官方套件目前涵蓋的測試,例如,因為它們涵蓋了導致實作「崩潰」而不是產生結果的病態情況,那麼現在可以將它們添加到(某個地方,待定),因為 Bowtie 可以「溫和地」執行實作並捕獲這些類型的錯誤。Bowtie 還允許更廣泛的 $ref 相關測試,因為它的協定會使用一個實作應該能夠參考的 schema「註冊表」來特別檢測 harness。這個問題是相關的,但也歡迎在這裡提出關於我們現在可以新增的測試類型的想法。

我發現一個錯誤,或對 Bowtie 本身有一個想法

如果它與實作有關,您很可能應該將其提交到實作的問題追蹤器。請禮貌,因為問題仍然有很小的但非零的可能性是由 Bowtie 本身引起的。即使沒有,也請對維護人員友善,許多人(包括我自己!)已經意識到 Bowtie 標記的問題,並且可能真的想修復它們,但有些事情讓修復它們變得困難。如果可以,請幫助實作!

如果它與 Bowtie 本身有關,或是一個與 Bowtie 相關的新想法,請務必提交一個問題開始一個討論,或在 JSON Schema Slack 上發起一個主題。

我想做一些隨機且很酷的事情

在這個分類中,即使是現在,也有一些很酷的想法。我很想知道我們是否可以利用 Bowtie 來統一地基準測試實作,而不僅僅是測試它們。能夠跳到特定語言的 REPL也是一個有點離譜的想法,但可能會很有趣。可能還有許多其他的想法!

設定 Bowtie 很難,但我搞定了 / 我想在 CI、「基礎設施」或分類方面提供幫助

這些都是您可以在其中提供幫助的未受重視的領域,因此如果您對這方面的任何事情感興趣,請聯繫。即使是讓那些不使用 Python 的人更容易安裝 Bowtie 也是一個很好的幫助!(現在,建置會產生一個 shiv,但不是跨平台的。)

結論

感謝您花時間了解 Bowtie。還要特別感謝Postman,他們全職僱用我,才能代表社群做這樣的工作。沒有 Postman,這項工作永遠不會發生!我希望未來還有更多的工作要做。請分享您的意見回饋,我們非常歡迎,如果您想參與其中,我們將非常感激!

封面照片透過 Stable Diffusion 生成。