---
author: deng
date: "20250109"
category: Note
tags:
  - Python
  - Nox
  - FlexibleTest
  - Versioning
  - Note
---

![cover](resources/nox.png)
[image resource](https://nox.thea.codes/en/stable/index.html)

- Abstract
	- 在將Python專案打包時會遇到填寫依賴套件及其版本的問題，開發者必須逐一測試Python版本與依賴套件版本之間（甚至是跨平台）不同組合的可運行性，而Nox可以將這一流程自動化。
- Steps
	1. 在開發環境中安裝Nox（`python -m pip install nox`）
	2. 在Package資料夾中產生*noxfile.py* 並撰寫測試程式碼（範例程式碼可見Note）
	3. 於終端機輸入`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*範例程式碼（透過環境是否能順利通過單元測試來判別套件之間的匹配性）

```python
# 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
	1. 在某些依賴套件組合下，load_model在進行reload測試時會報錯，原因是舊模型與新模型的記憶體位置相同導致AssertionError，詳細原因需調查
	2. 將nox的venv_backend設為conda，並開啟reuse_venv進行測試，測試一陣子後，會開始出現conda error，猜測原因是reuse的機制出問題，如果是新創造的conda env就沒問題（沒開啟reuse會很耗時，目前一個環境的容量約5GB，安裝得花不少時間）
		- 發現是conda的問題（可見github[討論串](https://github.com/conda/conda/issues/9794#issuecomment-884032662)），使用``conda clean -a``將套件暫存與快取清除就可以跑conda create了，詳細原因需調查
	3. 呈上，若把venv_backend改成預設的venv，在測試一段時間後仍會報錯，原因可能跟上述相同（目前無法還原錯誤）