注意: 雖然 JavaScript 對於本網站不是必需的,但您與內容的互動將受到限制。請開啟 JavaScript 以獲得完整的體驗。

使用 Python 進行前沿依賴測試

任何語言中的依賴項管理都可能是一個挑戰,Python 也不例外。像 pip 和 conda 這樣的工具使用依賴項解析器來嘗試滿足給定的要求,但版本衝突常常會阻止安裝;當 pip 在 2020 年 10 月引入新的解析器時,這個問題變得更加明顯。上游軟體包的新版本可能會破壞您的程式碼,如果您有一長串的傳遞性依賴項,那麼追查罪魁禍首可能更具挑戰性。

edgetest 是一個開源的基於外掛的 Python 軟體包,旨在幫助開發人員根據現有依賴項的新版本測試他們的程式碼。edgetest 透過以下方式幫助減輕依賴項管理的負擔: - 建立一個虛擬環境; - 將您的本地軟體包安裝到環境中; - 升級指定的依賴項軟體包;以及 - 執行您的測試命令(例如 pytest)。

維護成本和環境管理已成為 pip 解析器“執行引擎”的一部分。現在,edgetest 可以透過自動化最前沿的依賴項測試來幫助降低軟體包的維護成本。例如,如果您依賴 pandas>=0.25.1,<=1.0.0,edgetest 將根據最新的 pandas 版本(撰寫本文時為 1.4.1)測試您的專案。透過有效的測試套件,您將知道是否可以安全地升級到 pandas>=0.25.1,<=1.4.1。edgetest 將根據測試結果報告是否可以安全升級。它將為每個依賴項單獨執行此操作,然後再升級所有上游軟體包,以識別任何潛在的互動。

我們為什麼構建 edgetest

在 pip 於 2020 年 10 月引入依賴項解析器之後,我們決定對 Capital One 的內部專案採取更具規範性的依賴項固定方法。具體來說,這包括為所有軟體包的任何直接依賴項新增下限和上限。然而,這個決定增加了一種新的維護成本:更新固定。我們需要一種自動化方法來幫助修復軟體包中發現的安全漏洞,並以可擴充套件的方式繼續支援最新版本的依賴項。鑑於我們的團隊當時支援的 Python 軟體包數量,edgetest 是解決此問題的一個方案。機器學習軟體包通常具有複雜的依賴結構,新功能的實驗至關重要。雖然模型的實現應始終固定軟體包以確保確定性行為和可審計性,但我們不希望工具本身不必要地具有限制性,而是允許其實現具有一定的靈活性。

我們現在可以安排 CI/CD 作業,這些作業會自動對許多內部庫執行 edgetest,以執行單元測試並提高依賴項固定,從而確保對最新版本有一定程度的信任。我們應該指出,擁有健壯的單元測試對於充分利用 edgetest 至關重要。

這與 GitHub 的 Dependabot 有何不同?

edgetest 不像 GitHub 那樣與特定的版本控制系統繫結。它還透過僅在單元測試透過時升級軟體包依賴項來防止意外更新。最後,一些使用者希望專注於其依賴樹的子集進行更新。有時這些是經常釋出的依賴項(例如 boto3),有時這些軟體包是其庫功能的核心。edgetest 提供多種配置選項,幫助使用者建立適用於其用例的測試和升級系統。

edgetest 實戰

例如,讓我們想象一個簡單的 toy_package,如下所示:

要配置 edgetest,我們可以在 setup.cfg 中包含以下內容

並使用以下命令列語句執行:edgetest -c setup.cfg

這將告訴 edgetest 使用 Python 3.9,並將測試額外的安裝到每個 conda 環境中。edgetest 將建立三個環境:pandas、numpy 和 all-requirements。在前兩個環境中,它將只升級名稱相同的相應軟體包,而 all-requirements 將升級 pandas 和 numpy。接下來,在每個環境中執行測試命令(pytest 是預設值),並將結果報告給使用者。

或者,如果您願意,也可以提供 --export 標誌,為您將更改寫入 setup.cfg。

使用外掛架構

edgetest 的目標之一是確保易於擴充套件,這促使我們使用 pluggy。Pluggy 能夠擴充套件或修改核心軟體包,使 Python 社群能夠構建自定義外掛以與 edgetest 互動。目前有三個外掛:conda、pip-tools 和 hub。

透過 pluggy,我們規劃了幾個 hookspecs

這些鉤子允許使用者覆蓋和注入他們的自定義程式碼,以補充或覆蓋基本功能。例如,create_environment 鉤子支援使用自定義環境管理器,如 conda。下面是基本功能和外掛覆蓋之間的 hookimpl 比較

下一步

edgetest 最大的好處之一是自動化能力。一個基於 edgetest 構建的 GitHub Action 可供 CI/CD 平臺使用者使用,並允許您自動化構建、測試和部署依賴項管理。使用 GitHub Action 相對容易,下面是一個在 YAML 中使用該操作的示例

Run-edgetest-action 可以在 GitHub Marketplace 上找到,使用者可以在其中搜索新增功能和改進工作流程的工具。更多詳細資訊可以在 run-edgetest-actionREADME 中找到。

結論

總之,edgetest 是 Capital One 致力於採用“開源優先”的 Python 軟體開發方法的典範。edgetest 幫助開發人員根據現有依賴項的新版本測試他們的程式碼,並透過自動化最前沿的依賴項測試來降低軟體包的維護成本。它建立一個虛擬環境,安裝您的庫,升級指定的依賴項,並執行測試命令。之後,edgetest 將根據測試結果報告是否可以安全升級。我們鼓勵讀者檢視 GitHub 上的 edgetest,瞭解有關該專案的更多詳細資訊以及如何為 edgetest 做出貢獻。

Capital One 是 Python 軟體基金會的驕傲成員,我們的團隊在今年早些時候的 PyCon US 上展示了 Data Profiler,這是一種用於資料監控的開源機器學習技術。