编写测试¶
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