撰寫測試

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