Escrevendo testes¶
Os testes no MicroPython estão localizados no caminho tests/. A seguir está uma listagem dos diretórios principais e do script executor run-tests.py:
.
├── basics
├── extmod
├── float
├── micropython
├── run-tests.py
...
Há subpastas mantidas para categorizar os testes. Adicione um teste criando um novo arquivo em uma das pastas existentes ou em uma nova pasta. Também é possível criar testes personalizados fora dessa pasta tests, o que seria recomendado para uma porta personalizada.
Por exemplo, adicione o código a seguir em um arquivo print.py no subdiretório tests/unix/:
def print_one():
print(1)
print_one()
Se você executar seus testes, este teste deve aparecer na saída dos testes:
$ 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
Os testes são executados comparando a saída do alvo de teste com a saída do CPython. Portanto, qualquer teste deve usar instruções print para indicar os resultados do teste.
Para testes que não podem ser comparados com o CPython (ou seja, funcionalidades específicas do micropython), você pode fornecer um arquivo .py.exp que será usado como a verdade de referência para a comparação.
A outra maneira de executar testes, que é útil ao rodar em alvos diferentes da porta Unix, é:
$ cd tests
$ ./run-tests.py
Em seguida, para rodar em uma placa:
$ ./run-tests.py -t /dev/ttyACM0
E para executar apenas um determinado conjunto de testes (por exemplo, um diretório):
$ ./run-tests.py -d basics
$ ./run-tests.py float/builtin*.py
Usando o run-tests.py¶
O script run-tests.py suporta vários parâmetros para personalizar a execução dos testes:
Seleção de Alvo e Dispositivo:
-t, --test-instance
A opção -t aceita os seguintes valores para a instância de teste:
unix - usa a porta unix do MicroPython, especificada pela variável de ambiente MICROPY_MICROPYTHON (que por padrão é a variante padrão da porta unix ou windows, dependendo da plataforma host)
webassembly - usa a porta webassembly do MicroPython, especificada pela variável de ambiente MICROPY_MICROPYTHON_MJS (que por padrão é a variante padrão da porta webassembly)
port:<device> - conecta e usa o dispositivo de porta serial fornecido
a<n> - conecta e usa /dev/ttyACM<n>
u<n> - conecta e usa /dev/ttyUSB<n>
c<n> - conecta e usa COM<n>
exec:<command> - executa um comando e se conecta ao seu stdin/stdout
execpty:<command> - executa um comando e se conecta ao dispositivo /dev/pts/<n> impresso
<a>.<b>.<c>.<d> - conecta ao endereço IPv4 fornecido
qualquer outra coisa especifica uma porta serial
Seleção de Testes:
-d, --test-dirs- Especifica um ou mais diretórios de teste a serem executados-i, --include REGEX- Inclui os testes que correspondem ao padrão regex-e, --exclude REGEX- Exclui os testes que correspondem ao padrão regexfiles- Arquivos de teste específicos a serem executados
Opções de Execução:
--emit <EMITTER>- Emissor do MicroPython; EMITTER pode ser bytecode ou native. Padrão: bytecode--via-mpy- Compila os arquivos .py para .mpy primeiro--heapsize- Define o tamanho do heap para os testes-j, --jobs N- Número de testes a serem executados simultaneamente
Defina a variável de ambiente MICROPY_MPYCROSS para usar uma versão específica do mpy-cross ao usar --via-mpy.
Gerenciamento de Resultados:
-r, --result-dir- Diretório para os resultados dos testes. Padrão: results/--print-failures- Mostra o diff dos testes que falharam e sai--clean-failures- Apaga os arquivos .exp e .out de testes que falharam anteriormente--run-failures- Re-executa apenas os testes que falharam anteriormente
Exemplos:
# 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