编写测试

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 可以是 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