如何为 micropython 编写测试

Opp*_*ppy 3 doctest micropython bbc-microbit

我想为我正在为 micro:bit 编写的 micropython 代码编写测试。这里的例子使用doctest。我愿意接受任何测试系统的变通方案。

名为testing_python.py 的工作Python 示例:

def sum(a, b):
    '''
    >>> sum(3, 0)
    3
    '''
    return a + b

print(sum(2,2))
Run Code Online (Sandbox Code Playgroud)

当我测试时使用:

python -m doctest -v testing_python.py 

Run Code Online (Sandbox Code Playgroud)

我得到:

4
Trying:
    sum(3, 0)
Expecting:
    3
ok
Run Code Online (Sandbox Code Playgroud)

使用 micropython 作为 micro:bit 的失败示例,名为testing_micropython.py:

from microbit import *

def sum(a, b):
    '''
    >>> sum(3, 0)
    3
    '''
    return a + b

print(sum(2,2))
Run Code Online (Sandbox Code Playgroud)

当我测试时使用:

python -m doctest -v testing_micropython.py 
Run Code Online (Sandbox Code Playgroud)

我明白了

Traceback (most recent call last):
...
ModuleNotFoundError: No module named 'microbit'
Run Code Online (Sandbox Code Playgroud)

我尝试将“import microbit”语句包装在 try, except 子句中。这将使这个简单的示例起作用。但是,当我开始使用 micro:bit 库中找到的任何其他非 python 库函数(例如 Image 或 utime)时,doctest 将再次失败。

ukB*_*Baz 5

unittest.mock是一个用于 Python 测试的库。它允许您用模拟对象替换被测系统的某些部分,并对它们的使用方式做出断言。

这可以用来在没有硬件的情况下编写和测试像 micropython 这样的嵌入式软件。

您可以按照自己的意愿进行复杂的操作,但是在导入 microbit 模块时不出现错误的一个简单方法是模拟该microbit模块。例如有以下文件:

|- testing_micropython.py
|- microbit
  |- __init__.py
Run Code Online (Sandbox Code Playgroud)

我的testing_micropython.py有:

|- testing_micropython.py
|- microbit
  |- __init__.py
Run Code Online (Sandbox Code Playgroud)

其microbit/__init__.py具有:

from microbit import *


def sum(a, b):
    """
    >>> sum(3, 0)
    3
    """
    return a + b

display.show(sum(2,2))
Run Code Online (Sandbox Code Playgroud)

给出以下输出:

python -m doctest -v testing_micropython.py
Trying:
    sum(3, 0)
Expecting:
    3
ok
1 items had no tests:
    testing_micropython
1 items passed all tests:
   1 tests in testing_micropython.sum
1 tests in 2 items.
1 passed and 0 failed.
Test passed.
Run Code Online (Sandbox Code Playgroud)

由于 micro:bit 硬件的内存非常有限,因此我会避免在将加载到 micro:bit 上的文件中放入任何不必要的内容,因此我建议避免使用 doctest。