Private
Public Access
127 lines
7.7 KiB
Markdown
127 lines
7.7 KiB
Markdown
# Modul `tests/`
|
|
|
|
Automatische Tests prüfen die aktuelle Software ohne Pi-Hardware.
|
|
|
|
- `test_controller.py` prüft Zustandswechsel, Stopp, Neustartvoraussetzungen
|
|
und gespeicherten Modus mit kontrollierter Uhr und temporären Daten.
|
|
- `test_web.py` prüft Demo-Bild und Webendpunkte über einen ASGI-Client.
|
|
- `test_event_store.py` prüft dauerhafte Ereignisse, Profilzuordnung,
|
|
Profil-Löschen, 30-Tage-Ablauf und die Erweiterung einer älteren
|
|
Ereignistabelle.
|
|
- Lokal ausführen: `python3 -m unittest discover -s tests -v`; für Webtests
|
|
wird zusätzlich `requirements-dev.txt` benötigt.
|
|
- Hardwareverhalten, echte Pi-Kamera, WLAN, SSH-Tunnel und Außeneinsatz nicht
|
|
aus einem grünen Host-Test ableiten; diese Prüfungen getrennt berichten.
|
|
- Tests für neue Sicherheits- oder Zustandsregeln an beobachtbarem Verhalten
|
|
ausrichten, nicht bloß interne Implementierung spiegeln.
|
|
|
|
- `test_detection.py` prüft Linienrichtung, Bestätigung, Flattern, Segmentgrenzen,
|
|
Gruppenfreigabe, Sperrzeit, Neustart/Änderungen, Fehler-Watchdog, synchrone
|
|
Frames und Konfigurations-API mit kontrollierter Uhr ohne Modell/Pi.
|
|
- Echte NanoDet-Inferenz zusätzlich mit ausdrücklich installiertem Modell
|
|
prüfen; ein grüner Geometrietest bestätigt keine Erkennungsqualität.
|
|
|
|
- `test_detection_model.py` prüft atomare/identische Installation und Ablehnung
|
|
falscher Downloads ohne Netzwerk. Optional `HALLOWEEN_TEST_MODEL` auf eine
|
|
geprüfte ONNX-Datei setzen: Dann wird die echte Inferenz auf leerem Bild geprüft.
|
|
|
|
- `test_pi_update.py` prüft echte temporäre Versions-/Datenverzeichnisse mit
|
|
simuliertem systemd, Python-Paketsetup und HTTP-Ergebnis. Erfolgreichen Wechsel,
|
|
Start-/HTTP-/Abhängigkeitsfehler, Rückfall samt Daten, alte flache Installation,
|
|
Erstinstallation und Ablehnung fremder Units/manueller Server prüfen.
|
|
Kein SSH, kein echter Dienst, kein Netzwerk und keine Hardware in diesen Tests.
|
|
|
|
- `test_motion.py` nutzt synthetische JPEGs und optional OpenCV für echten
|
|
Optical Flow. Vorwärts/gegenläufig/parallel, Pfeilumkehr, gedrehte Geometrie,
|
|
Bildruhe/Lichtwechsel, Bereichsgrenzen und Bildlücken prüfen. Diensttests
|
|
prüfen Bestätigung, Sperrzeit, Stopp, Methodenmigration, Persistenz, verworfene
|
|
alte Inferenzfehler und modellfreie Verarbeitung. Ohne OpenCV werden die
|
|
Bildtests übersprungen; kein Ersatz für den Nahbereichstest am Pi.
|
|
|
|
- Nahbereichregression: kleiner 60x60-Bildausschnitt im 640x480-Frame,
|
|
2 Pixel Bewegung pro Bild; automatischen Trigger ohne manuelles Bereich-frei
|
|
und Ablehnung der Gegenrichtung prüfen.
|
|
- `node tests/test_ui_status.js` prüft den echten JS-Statusrenderer isoliert
|
|
ohne Browser/Netzwerk: automatische Freigabe vs. manuelle Bereich-frei-Flagge,
|
|
Vorrang von Stopp/Sequenz/Sperrzeit und wirkungslose Betriebsmodi.
|
|
|
|
- `test_event_images.py` prüft automatisch zugeordnete JPEGs mit synthetischem
|
|
Motiv: beschnittener privater Bereich, Dateirechte, Neustart, Migration alter
|
|
Ereignisse, DB-/Dateifehler, sichere ID-Abrufe, Header für Löschen und Erhalt
|
|
von Ereignis/Profil. Motion-Test prüft die exakten JPEG-Bytes des Trigger-Frames.
|
|
|
|
- `node tests/test_event_images_ui.js` prüft Vorschau/Ansehen und bestätigtes
|
|
Bildlöschen am echten JS-Renderer mit erfundenen Daten, ohne Browser oder Netz.
|
|
Abgebrochene Bestätigung löscht nichts; Ereignis bleibt nach Bildlöschung sichtbar.
|
|
|
|
- Update-Tests verlegen den festen Unitpfad nur in temporären Skriptkopien und
|
|
simulieren sudo/runuser. Zweiten sudo-Aufruf stets ablehnen, damit Erfolg und
|
|
Rückfall unabhängig von Passwort-Tickets geprüft werden. Abgelehnte Anmeldung,
|
|
unprivilegierten Aufruf des internen Rootteils und unveränderte Daten prüfen.
|
|
Kein echter root-/PAM-/systemd- oder Pi-Nachweis aus diesen Tests.
|
|
|
|
- UploadConnectionTest simuliert ssh/rsync und prüft genau einen Master, denselben
|
|
privaten Socket für alle Schritte, BatchMode auf Slaves, TTY für sudo sowie
|
|
Aufräumen bei Erfolg/Verbindungs-/Transfer-/Aktivierungsfehlern und pure Vorschau.
|
|
Dies bestätigt keine reale SSH-/Passwortanmeldung am Pi.
|
|
|
|
|
|
- `test_follow.py` prüft synthetische Farbpunkte (auch Rot um die HSV-Grenze),
|
|
Mehrdeutigkeit, Bildauswahl, Persistenz ohne Fotos, Pulsgrenzen/Geschwindigkeit,
|
|
Richtungswechsel, alte Resultate/Sitzungen, Fehler-/Abbruchpfade, API-Interlock
|
|
und I²C-Protokoll mit künstlichem Bus. Kein echter Pi oder Servo wird angesteuert.
|
|
|
|
- Follow-Einrichttests prüfen Hold/Release, ablaufende Bewegungslease, verspätete
|
|
Tastenbefehle, falsche/alte Sitzung, Grenzen jenseits gespeicherter Followwerte,
|
|
absolute Pulsgrenzen, Richtungsumkehr und persistente Grenze mit Innenabstand.
|
|
|
|
- `test_pages.py` prüft getrennte Seiten/Poller und unabhängige Grab-/Kamera-
|
|
Bedienung. Vorschau darf parallel zur Automatik laufen; echte Bewegung bleibt
|
|
gesperrt. Globale Abschaltung muss weiterhin beide Bereiche stoppen.
|
|
|
|
- `node tests/test_endpoints_ui.js` prüft gespeicherte Werte vs. Speicherkandidaten,
|
|
Freigabe der richtigen Seite, Richtungsumkehr und Schutz vor ungefragtem
|
|
Speichern beim Start beziehungsweise alten Min-/Max-Formularwerten.
|
|
|
|
- Endpunkt-UI-Test zusätzlich: eigene numerische Grenzspeicherung, Erhalt der
|
|
Farb-/Richtungsparameter, Ablehnung von Nachführgrenzen außerhalb des Einrichtbereichs und Startblockade
|
|
bei offenem Eingabeentwurf. Erweiterung des Einrichtbereichs explizit speichern.
|
|
- Followtest: alte Konfiguration migrieren ohne Erweiterung; Einrichtgrenzen
|
|
dauerhaft speichern, Jog dort begrenzen, Endpunkt mit Innenabstand übernehmen
|
|
und Nachführung auf gespeicherte Endpunkte begrenzen. Keine echte Hardware.
|
|
|
|
- Reine Dokumentationspflege: lokale Links/Anker, konsistente Revisionsangaben
|
|
und git diff --check prüfen. Frühere Testzahlen als damaligen Prüfstand
|
|
kennzeichnen; daraus keinen neuen Testlauf oder Pi-Test ableiten.
|
|
|
|
- Startmitten: asymmetrische persistierte Endpunkte, beide Achsen getrennt,
|
|
halbe µs aufgerundet, Richtungsumkehr, Bereiche außerhalb 1500 und gesperrte
|
|
Achse prüfen. Beide Startmodi nutzen dieselbe Berechnung; Dienstkonstruktion
|
|
bewegt nichts. Endpunktspeichern nutzt festen Sitzungsbezug ohne Bewegung,
|
|
erneuter Start berechnet neu. JS prüft dieselbe Speicherfreigabe.
|
|
|
|
- Mittelstellungsbutton: gezielte Service-/API-/JS-Tests für langsame Bewegung
|
|
beider Achsen zu den zuletzt gespeicherten Endpunkten, Ziel ohne Überschwingen,
|
|
unveränderte Konfiguration, Sitzungs-/Modussperre, Stopp und alte Sequenzen,
|
|
Richtungsübernahme und Watchdog-Abbruch. Echte Servos bleiben ungetestet.
|
|
|
|
- Nachführtempo: Altdateien mit 80 µs/s ohne Endpunktänderung migrieren;
|
|
80/400/800 bei 15/20 Auswertungen pro Sekunde, begrenztes Nachholen bei
|
|
Bildlücken und FPS-/Laufzeitanzeige mit künstlicher Uhr prüfen. JS prüft
|
|
ungespeichertes Tempo beim Start und Erhalt beim Endpunktspeichern.
|
|
- `test_camera.py` prüft gemessene Producer-FPS und veraltete Frames mit
|
|
künstlicher Uhr. Kein Nachweis der Picamera2-Konfiguration oder Pi-Leistung.
|
|
|
|
- Suchtests: Opt-in/Altdateimigration, kein Suchen vor Erstfund oder in Vorschau,
|
|
Schwenks mit Achsumkehr innerhalb asymmetrischer Follow-Endpunkte, Tempo,
|
|
gesperrte Achse, endlicher Durchlauf und 60-s-Limit. Zwei aufeinanderfolgende
|
|
Funde, Zwischenverlust, erneute Suche, expliziter Stopp sowie alle Watchdogs
|
|
mit künstlicher Uhr/Treiber prüfen. JS: Suchoption speichern/bei Grenzänderung
|
|
erhalten, Start mit ungespeicherter Option ablehnen. Keine echte Suchfahrt.
|
|
|
|
- Zielverlust-Wartezustand: drei Minuten ohne Punkt bei gesunder Sitzung ohne
|
|
Bewegungsbefehle, Wiederaufnahme nach zwei Funden, nach Suchende kein weiterer
|
|
Durchlauf bis erneutem Fund. Farbe bleibt nach Halt/Dienstneukonstruktion
|
|
erhalten, neue Farbwahl ersetzt sie. Fehlende Bilder/Heartbeat/Auswertung
|
|
beenden weiterhin Sitzung/PWM; reine Abwesenheit des Punkts nicht.
|