撰寫測試¶
MicroPython 中的測試位於 tests/ 路徑下。以下列出主要目錄與 run-tests.py 執行器指令碼:
.
├── basics
├── extmod
├── float
├── micropython
├── run-tests.py
...
其中維護了一些子資料夾用以分類測試。要新增測試,可在某個既有資料夾或新資料夾中建立新檔案。也可以在這個 tests 資料夾之外製作自訂測試,對於自訂移植版本而言會建議採用此做法。
例如,在 tests/unix/ 子目錄下的 print.py 檔案中加入以下程式碼:
def print_one():
print(1)
print_one()
如果你執行測試,這個測試應該會出現在測試輸出中:
$ cd ports/unix
$ make tests
skip unix/extra_coverage.py
pass unix/ffi_callback.py
pass unix/ffi_float.py
pass unix/ffi_float2.py
pass unix/print.py
pass unix/time.py
pass unix/time2.py
測試的執行方式是將測試目標的輸出與 CPython 的輸出進行比較。因此任何測試都應使用 print 陳述式來表示測試結果。
對於無法與 CPython 比較的測試(即 micropython 專屬的功能),你可以提供一個 .py.exp 檔案,作為比較的基準依據。
另一種執行測試的方式,在 Unix 移植版本以外的目標上執行時很有用,如下:
$ cd tests
$ ./run-tests.py
接著在開發板上執行:
$ ./run-tests.py -t /dev/ttyACM0
若只想執行某一組特定的測試(例如某個目錄):
$ ./run-tests.py -d basics
$ ./run-tests.py float/builtin*.py
使用 run-tests.py¶
run-tests.py 指令碼支援數個參數來自訂測試的執行:
目標與裝置選擇:
-t, --test-instance
-t 選項接受下列形式作為測試實例:
unix - 使用 MicroPython 的 unix 移植版本,由 MICROPY_MICROPYTHON 環境變數指定(其預設為 unix 或 windows 移植版本的標準變體,視主機平台而定)
webassembly - 使用 MicroPython 的 webassembly 移植版本,由 MICROPY_MICROPYTHON_MJS 環境變數指定(其預設為 webassembly 移植版本的標準變體)
port:<device> - 連接並使用指定的序列埠裝置
a<n> - 連接並使用 /dev/ttyACM<n>
u<n> - 連接並使用 /dev/ttyUSB<n>
c<n> - 連接並使用 COM<n>
exec:<command> - 執行某個指令並接附至其 stdin/stdout
execpty:<command> - 執行某個指令並接附至所印出的 /dev/pts/<n> 裝置
<a>.<b>.<c>.<d> - 連接至指定的 IPv4 位址
其他任何內容都會被指定為序列埠
測試選擇:
-d, --test-dirs- 指定一個或多個要執行的測試目錄-i, --include REGEX- 納入符合正規表示式模式的測試-e, --exclude REGEX- 排除符合正規表示式模式的測試files- 要執行的特定測試檔案
執行選項:
--emit <EMITTER>- MicroPython 發射器(emitter),EMITTER 可為 bytecode 或 native。預設值:bytecode--via-mpy- 先將 .py 檔案編譯為 .mpy--heapsize- 設定測試的堆積大小-j, --jobs N- 同時執行的測試數量
在使用 --via-mpy 時,可設定 MICROPY_MPYCROSS 環境變數以使用特定版本的 mpy-cross。
結果管理:
-r, --result-dir- 測試結果的目錄。預設值:results/--print-failures- 顯示失敗測試的差異並退出--clean-failures- 刪除先前失敗測試所產生的 .exp 與 .out 檔案--run-failures- 只重新執行先前失敗的測試
範例:
# Run only basic tests with native emitter
$ ./run-tests.py --emit native -d basics extmod
# Run tests excluding async functionality
$ ./run-tests.py -e async
# Run tests matching *_pep_*
$ ./run-tests.py -i *_pep_*
# Run specific test files in parallel
$ ./run-tests.py -j 4 basics/list*.py
# Test on a connected OpenMV Cam
$ ./run-tests.py -t /dev/ttyACM0
# or
$ ./run-tests.py -t a0
# Re-run only failed tests from previous run
$ ./run-tests.py --run-failures