Tests schrijven

Tests in MicroPython bevinden zich in het pad tests/. Hieronder volgt een overzicht van de belangrijkste mappen en het run-tests.py-runnerscript:

.
 ├── basics
 ├── extmod
 ├── float
 ├── micropython
 ├── run-tests.py
 ...

Er worden submappen onderhouden om de tests te categoriseren. Voeg een test toe door een nieuw bestand aan te maken in een van de bestaande mappen of in een nieuwe map. Het is ook mogelijk om aangepaste tests buiten deze tests-map te maken, wat aanbevolen zou zijn voor een aangepaste port.

Voeg bijvoorbeeld de volgende code toe in een bestand print.py in de submap tests/unix/:

def print_one():
    print(1)

print_one()

Als je je tests uitvoert, zou deze test in de testuitvoer moeten verschijnen:

$ 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

Tests worden uitgevoerd door de uitvoer van het testdoel te vergelijken met de uitvoer van CPython. Elke test moet dus print-statements gebruiken om testresultaten aan te geven.

Voor tests die niet met CPython kunnen worden vergeleken (d.w.z. micropython-specifieke functionaliteit), kun je een .py.exp-bestand opgeven dat als de referentie voor vergelijking wordt gebruikt.

De andere manier om tests uit te voeren, die handig is bij het draaien op andere doelen dan de Unix-port, is:

$ cd tests
$ ./run-tests.py

Vervolgens om op een board te draaien:

$ ./run-tests.py -t /dev/ttyACM0

En om alleen een bepaalde set tests uit te voeren (bijv. een map):

$ ./run-tests.py -d basics
$ ./run-tests.py float/builtin*.py

run-tests.py gebruiken

Het script run-tests.py ondersteunt verschillende parameters om de testuitvoering aan te passen:

Doel- en apparaatselectie:

  • -t, --test-instance

De optie -t accepteert de volgende waarden voor de testinstantie:

  • unix - gebruik de unix-port van MicroPython, opgegeven door de omgevingsvariabele MICROPY_MICROPYTHON (die standaard de standaardvariant is van ofwel de unix- ofwel de windows-port, afhankelijk van het hostplatform)

  • webassembly - gebruik de webassembly-port van MicroPython, opgegeven door de omgevingsvariabele MICROPY_MICROPYTHON_MJS (die standaard de standaardvariant van de webassembly-port is)

  • port:<device> - maak verbinding met en gebruik het opgegeven seriële-poortapparaat

  • a<n> - maak verbinding met en gebruik /dev/ttyACM<n>

  • u<n> - maak verbinding met en gebruik /dev/ttyUSB<n>

  • c<n> - maak verbinding met en gebruik COM<n>

  • exec:<command> - voer een commando uit en koppel aan de stdin/stdout ervan

  • execpty:<command> - voer een commando uit en koppel aan het afgedrukte /dev/pts/<n>-apparaat

  • <a>.<b>.<c>.<d> - maak verbinding met het opgegeven IPv4-adres

  • al het andere specificeert een seriële poort

Testselectie:

  • -d, --test-dirs - Geef een of meer testmappen op om uit te voeren

  • -i, --include REGEX - Neem tests op die overeenkomen met het regex-patroon

  • -e, --exclude REGEX - Sluit tests uit die overeenkomen met het regex-patroon

  • files - Specifieke testbestanden om uit te voeren

Uitvoeringsopties:

  • --emit <EMITTER> - MicroPython-emitter, EMITTER kan bytecode of native zijn. Standaard: bytecode

  • --via-mpy - Compileer eerst .py-bestanden naar .mpy

  • --heapsize - Stel de heapgrootte voor tests in

  • -j, --jobs N - Aantal tests dat gelijktijdig moet worden uitgevoerd

Stel de omgevingsvariabele MICROPY_MPYCROSS in om een specifieke versie van mpy-cross te gebruiken bij het gebruik van --via-mpy.

Resultaatbeheer:

  • -r, --result-dir - Map voor testresultaten. Standaard: results/

  • --print-failures - Toon de diff van mislukte tests en stop

  • --clean-failures - Verwijder .exp- en .out-bestanden van eerdere mislukte tests

  • --run-failures - Voer alleen eerder mislukte tests opnieuw uit

Voorbeelden:

# 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