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 regex

  • files - 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