author |
date |
category |
tags |
deng |
20250109 |
Note |
Python |
Nox |
FlexibleTest |
Versioning |
Note |
|
image resource
- Abstract
- 在將Python專案打包時會遇到填寫依賴套件及其版本的問題,開發者必須逐一測試Python版本與依賴套件版本之間(甚至是跨平台)不同組合的可運行性,而Nox可以將這一流程自動化。
- Steps
- 在開發環境中安裝Nox(
python -m pip install nox
)
- 在Package資料夾中產生noxfile.py 並撰寫測試程式碼(範例程式碼可見Note)
- 於終端機輸入
nox
開始進行測試
- Note
- 若只想執行某個函式的程式碼,可執行
nox -s [function_name]
- 若想將測試結果輸出檔案(測試組合很多的時候很適合),可執行
nox --report [file_name].json
- 小知識,如果semantic version沒有給patch的話,則其為0(比方說我們要測試的numpy版本設為1.24,則其實際測試的版本為1.24.0)
- 測試的環境會放在
.nox
裡(通常以python搭配套件名稱進行資料夾命名,若套件太多則會hash成短名稱),如果使用reuse_venv
則nox會去重新使用這些環境檔進行測試,可節省重新建立環境的時間
- 若無特殊需求,session的
venv_backend
建議使用預設的venv即可,較省空間
- 以下為noxfile.py範例程式碼(透過環境是否能順利通過單元測試來判別套件之間的匹配性)
# noxfile.py
#
# author: deng
# date : 20250110
import nox
nox.options.sessions = [
'test_flexibility'
]
nox.options.report = 'report.json'
@nox.session(venv_backend='conda', python=['3.10', '3.11', '3.12'])
@nox.parametrize('numpy', ['1.26', '2.0'])
@nox.parametrize('scikit_learn', ['1.5', '1.6'])
def test_flexibility(session, numpy, scikit_learn):
# Install package dependencies
session.install(f'numpy=={numpy}')
session.install(f'scikit-learn=={scikit_learn}')
# Test
session.install('pytest')
session.run('pytest', 'tests', '-v')
- Issues
- 在某些依賴套件組合下,load_model在進行reload測試時會報錯,原因是舊模型與新模型的記憶體位置相同導致AssertionError,詳細原因需調查
- 將nox的venv_backend設為conda,並開啟reuse_venv進行測試,測試一陣子後,會開始出現conda error,猜測原因是reuse的機制出問題,如果是新創造的conda env就沒問題(沒開啟reuse會很耗時,目前一個環境的容量約5GB,安裝得花不少時間)
- 發現是conda的問題(可見github討論串),使用
conda clean -a
將套件暫存與快取清除就可以跑conda create了,詳細原因需調查
- 呈上,若把venv_backend改成預設的venv,在測試一段時間後仍會報錯,原因可能跟上述相同(目前無法還原錯誤)