使用 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,並將 tests extra 安裝到每個 conda 環境中。edgetest 將建立三個環境:pandas、numpy 和 all-requirements。在前兩個環境中,它將僅升級具有這些名稱的相應軟體包,而 all-requirements 將同時升級 pandas 和 numpy。接下來,將在每個環境中執行測試命令(預設情況下為 pytest),並將結果報告給使用者
或者,如果您願意,您也可以提供 –export 標誌,將更改寫入到 setup.cfg 中。
使用外掛架構
edgetest 的目標之一是確保易於擴充套件,這促使我們使用 pluggy。Pluggy 允許擴充套件或修改核心軟體包,從而使 Python 社群可以構建自定義外掛來與 edgetest 互動。目前有三個外掛:conda、pip-tools 和 hub。
使用 pluggy,我們繪製了幾個 hookspec
- edgetest.hookspecs.addoption()
- 此掛鉤允許使用者將全域性或環境級別的掛鉤新增到配置架構
- edgetest.hookspecs.path_to_python()
- 此掛鉤返回 Python 可執行檔案的路徑
- edgetest.hookspecs.create_environment()
- 此掛鉤建立虛擬環境。
這些掛鉤允許使用者覆蓋和注入自定義程式碼,以補充或覆蓋基本功能。例如,create_environment 掛鉤可以使用自定義環境管理器(例如 conda)。以下是基本功能和外掛覆蓋之間的 hookimpl 的比較
下一步是什麼
edgetest 的最大好處之一是自動化能力。基於 edgetest 構建的 GitHub Action 可供 CI/CD 平臺的使用者使用,並允許您自動化構建、測試和部署依賴項管理。使用 GitHub Action 相對容易,以下是在 YAML 中使用該操作的示例
Run-edgetest-action 可以在 GitHub Marketplace 上找到,使用者可以在其中搜索新增功能和改進工作流程的工具。更多詳細資訊可以在 run-edgetest-action 的 README 中找到。
結論
總而言之,edgetest 是 Capital One 致力於使用 Python 進行軟體開發的“開源優先”方法的示例。edgetest 幫助開發人員針對現有依賴項的新版本測試其程式碼,並透過自動化前沿依賴測試來降低軟體包的維護成本。它建立虛擬環境,安裝您的庫,升級指定的依賴項,並執行測試命令。之後,edgetest 將根據測試結果報告是否可以安全升級。我們鼓勵讀者檢視 GitHub 上的 edgetest,以獲取有關該專案的更多詳細資訊以及如何為 edgetest 做出貢獻。
Capital One 是 Python 軟體基金會的驕傲成員,我們的團隊在今年早些時候的 PyCon US 上介紹了 Data Profiler,這是一種用於資料監控的開源機器學習技術。