การเขียนการทดสอบ

การทดสอบใน MicroPython อยู่ที่เส้นทาง tests/ ต่อไปนี้คือรายการไดเรกทอรีหลักและสคริปต์ตัวรัน run-tests.py:

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

มีโฟลเดอร์ย่อยที่ดูแลเพื่อจัดหมวดหมู่การทดสอบ เพิ่มการทดสอบโดยสร้างไฟล์ใหม่ในโฟลเดอร์ที่มีอยู่หรือในโฟลเดอร์ใหม่ นอกจากนี้ยังสามารถสร้างการทดสอบแบบกำหนดเองนอกโฟลเดอร์ tests นี้ได้ ซึ่งแนะนำสำหรับพอร์ตแบบกำหนดเอง

ตัวอย่างเช่น เพิ่มโค้ดต่อไปนี้ในไฟล์ print.py ในไดเรกทอรีย่อย tests/unix/:

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 port คือ:

$ 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 รับค่าต่อไปนี้สำหรับ test instance:

  • unix - ใช้ unix port ของ MicroPython ซึ่งระบุโดยตัวแปรสภาพแวดล้อม MICROPY_MICROPYTHON (ซึ่งใช้ค่าเริ่มต้นเป็น variant มาตรฐานของ unix หรือ windows port ขึ้นอยู่กับแพลตฟอร์มโฮสต์)

  • webassembly - ใช้ webassembly port ของ MicroPython ซึ่งระบุโดยตัวแปรสภาพแวดล้อม MICROPY_MICROPYTHON_MJS (ซึ่งใช้ค่าเริ่มต้นเป็น variant มาตรฐานของ webassembly port)

  • port:<device> - เชื่อมต่อและใช้งาน serial port device ที่กำหนด

  • a<n> - เชื่อมต่อและใช้งาน /dev/ttyACM<n>

  • u<n> - เชื่อมต่อและใช้งาน /dev/ttyUSB<n>

  • c<n> - เชื่อมต่อและใช้งาน COM<n>

  • exec:<command> - รันคำสั่งและเชื่อมต่อกับ stdin/stdout ของมัน

  • execpty:<command> - รันคำสั่งและเชื่อมต่อกับ device /dev/pts/<n> ที่พิมพ์ออกมา

  • <a>.<b>.<c>.<d> - เชื่อมต่อกับที่อยู่ IPv4 ที่กำหนด

  • สิ่งอื่นใดระบุ serial port

การเลือกการทดสอบ:

  • -d, --test-dirs - ระบุไดเรกทอรีการทดสอบหนึ่งไดเรกทอรีหรือมากกว่าเพื่อรัน

  • -i, --include REGEX - รวมการทดสอบที่ตรงกับรูปแบบ regex

  • -e, --exclude REGEX - ยกเว้นการทดสอบที่ตรงกับรูปแบบ regex

  • files - ไฟล์การทดสอบเฉพาะที่จะรัน

ตัวเลือกการรัน:

  • --emit <EMITTER> - ตัวสร้างโค้ดของ MicroPython โดย EMITTER สามารถเป็น bytecode หรือ native ค่าเริ่มต้น: bytecode

  • --via-mpy - คอมไพล์ไฟล์ .py เป็น .mpy ก่อน

  • --heapsize - กำหนดขนาดฮีปสำหรับการทดสอบ

  • -j, --jobs N - จำนวนการทดสอบที่รันพร้อมกัน

ตั้งค่าตัวแปรสภาพแวดล้อม MICROPY_MPYCROSS เพื่อใช้เวอร์ชันเฉพาะของ mpy-cross เมื่อใช้ --via-mpy

การจัดการผลลัพธ์:

  • -r, --result-dir - ไดเรกทอรีสำหรับผลการทดสอบ ค่าเริ่มต้น: results/

  • --print-failures - แสดง diff ของการทดสอบที่ล้มเหลวและออก

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