From ff2bc829945b9003e73c360ba88ccb33fc9060ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Mathieu?= Date: Sat, 17 Jan 2026 14:08:03 +0100 Subject: [PATCH] =?UTF-8?q?Vor=20=C3=84nderungen=20am=20Best=C3=A4tigungsd?= =?UTF-8?q?ialog=20-=20Backup=20f=C3=BCr=20Rollback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README_TESTS.md | 228 +++++++++++++++++++++++++++++++++++++++++++++ test_dicom2pacs.py | 200 +++++++++++++++++++++++++++++++++++++++ test_dicom2pacs.sh | 207 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 635 insertions(+) create mode 100644 README_TESTS.md create mode 100755 test_dicom2pacs.py create mode 100755 test_dicom2pacs.sh diff --git a/README_TESTS.md b/README_TESTS.md new file mode 100644 index 0000000..a530293 --- /dev/null +++ b/README_TESTS.md @@ -0,0 +1,228 @@ +# Test-Anleitung für dicom2pacs + +Diese Anleitung erklärt, wie Sie die dicom2pacs-App testen können. + +## Verfügbare Testskripte + +### 1. `test_dicom2pacs.sh` - Interaktives Bash-Testskript + +Ein interaktives Skript mit Menü für verschiedene Test-Optionen. + +**Verwendung:** +```bash +./test_dicom2pacs.sh +``` + +**Optionen:** +- **Option 1: GUI-Test** - Öffnet die App mit GUI für manuelles Testen +- **Option 2: Unit-Test** - Prüft alle Module ohne GUI +- **Option 3: Integrationstest** - Vollständiger Test mit GUI +- **Option 4: Aufräumen** - Löscht Test-Ordner und Transfer-Ordner + +**Was das Skript macht:** +- Erstellt Test-Ordner `~/Downloads/test_dicom` +- Kopiert Test-DICOM-Dateien aus pydicom +- Prüft Konfiguration +- Führt Tests basierend auf Ihrer Auswahl durch + +### 2. `test_dicom2pacs.py` - Automatisiertes Python-Testskript + +Ein Python-Skript, das automatisch alle Module testet. + +**Verwendung:** +```bash +# Mit aktiviertem venv +source venv/bin/activate +python3 test_dicom2pacs.py + +# Oder direkt mit venv-Python +venv/bin/python3 test_dicom2pacs.py +``` + +**Getestete Funktionen:** +- ✓ Module-Imports +- ✓ DICOM-Datei-Erkennung +- ✓ Dateiverwaltung +- ✓ Konfigurationsladen +- ✓ Patientenname-Formatierung +- ✓ Geburtsdatum-Formatierung + +## Manuelle Tests + +### Test 1: GUI öffnet sich + +```bash +source venv/bin/activate +python dicom2pacs.py "Mustermann" "Max" "19800101" "12345" +``` + +**Erwartetes Verhalten:** +- GUI-Fenster öffnet sich +- "Durchsuchen"-Button ist sichtbar +- "Abbruch"-Button ist sichtbar + +### Test 2: DICOM-Dateien finden + +1. Erstellen Sie einen Test-Ordner: +```bash +mkdir -p ~/Downloads/test_dicom +``` + +2. Kopieren Sie Test-DICOM-Dateien: +```bash +# Von der gebauten App +cp dist/dicom2pacs.app/Contents/Resources/lib/python3.13/pydicom/data/test_files/CT_small.dcm ~/Downloads/test_dicom/ + +# Oder vom venv +cp venv/lib/python3.13/site-packages/pydicom/data/test_files/CT_small.dcm ~/Downloads/test_dicom/ +``` + +3. Starten Sie die App und wählen Sie den Test-Ordner + +**Erwartetes Verhalten:** +- App findet DICOM-Dateien +- Fortschrittsanzeige wird angezeigt +- Dateien werden in Transfer-Ordner kopiert + +### Test 3: Patientendaten-Vergleich + +Die App vergleicht Patientendaten aus den DICOM-Dateien mit den übergebenen Argumenten. + +**Erwartetes Verhalten:** +- Wenn Daten übereinstimmen: Kein Dialog +- Wenn Daten abweichen: Dialog mit Vergleichsanzeige +- Benutzer kann wählen: Tomedo-Daten oder Original-Daten + +### Test 4: Server-Verfügbarkeit + +Die App prüft, ob der PACS-Server erreichbar ist. + +**Erwartetes Verhalten:** +- Server erreichbar: Upload startet +- Server nicht erreichbar: Meldung "PACS SERVER NICHT ERREICHBAR" + +### Test 5: Upload (mit konfiguriertem Server) + +Wenn ein PACS-Server konfiguriert ist, werden Dateien hochgeladen. + +**Konfiguration prüfen:** +```bash +cat ~/.dicom2pacs.conf +``` + +**Erwartetes Verhalten:** +- Fortschrittsanzeige während Upload +- Erfolgsmeldung nach Upload +- Transfer-Ordner wird gelöscht + +## Test-Daten vorbereiten + +### Automatisch (empfohlen) + +Das Bash-Testskript erledigt dies automatisch: +```bash +./test_dicom2pacs.sh +``` + +### Manuell + +1. **Test-Ordner erstellen:** +```bash +mkdir -p ~/Downloads/test_dicom +``` + +2. **DICOM-Dateien kopieren:** +```bash +# Option A: Von gebauter App +cp dist/dicom2pacs.app/Contents/Resources/lib/python3.13/pydicom/data/test_files/*.dcm ~/Downloads/test_dicom/ + +# Option B: Von venv +cp venv/lib/python3.13/site-packages/pydicom/data/test_files/*.dcm ~/Downloads/test_dicom/ +``` + +3. **App starten:** +```bash +source venv/bin/activate +python dicom2pacs.py "Mustermann" "Max" "19800101" "12345" +``` + +## Häufige Probleme + +### Problem: "Keine DICOM-Dateien gefunden" + +**Lösung:** +- Stellen Sie sicher, dass der Test-Ordner DICOM-Dateien enthält +- Prüfen Sie, ob Dateien die Endung `.dcm` haben oder keine Endung +- Verwenden Sie `test_dicom2pacs.sh` Option 1, um Dateien automatisch zu kopieren + +### Problem: "PACS SERVER NICHT ERREICHBAR" + +**Lösung:** +- Normal, wenn kein Server konfiguriert ist +- Für vollständigen Test: Orthanc-Server einrichten +- Konfiguration in `~/.dicom2pacs.conf` prüfen + +### Problem: "ModuleNotFoundError" + +**Lösung:** +```bash +source venv/bin/activate +pip install pydicom aiohttp aiofiles tqdm +``` + +### Problem: GUI öffnet sich nicht + +**Lösung:** +- Prüfen Sie die Konsole auf Fehlermeldungen +- Stellen Sie sicher, dass tkinter installiert ist: + ```bash + python3 -m tkinter + ``` + +## Aufräumen nach Tests + +```bash +# Manuell +rm -rf ~/Downloads/test_dicom +rm -rf ~/Downloads/D2OTrans + +# Oder mit Testskript +./test_dicom2pacs.sh +# Option 4 wählen +``` + +## Test-Zusammenfassung + +Nach Ausführung von `test_dicom2pacs.py` erhalten Sie eine Zusammenfassung: + +``` +=== dicom2pacs Automatisierte Tests === + +Teste Imports... +✓ Alle Module erfolgreich importiert + +Teste DICOM-Datei-Erkennung... +✓ DICOM-Datei erkannt: CT_small.dcm -> True + +... + +================================================== +Test-Zusammenfassung: +================================================== +✓ PASS: Imports +✓ PASS: DICOM-Datei-Erkennung +✓ PASS: Dateiverwaltung +... +================================================== +Ergebnis: 6/6 Tests bestanden +🎉 Alle Tests bestanden! +``` + +## Nächste Schritte + +Nach erfolgreichen Tests können Sie: +1. Die App mit echten DICOM-Dateien testen +2. Einen PACS-Server konfigurieren für Upload-Tests +3. Die App in Produktion einsetzen + +Viel Erfolg beim Testen! 🚀 diff --git a/test_dicom2pacs.py b/test_dicom2pacs.py new file mode 100755 index 0000000..c74100e --- /dev/null +++ b/test_dicom2pacs.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python3 +""" +test_dicom2pacs.py - Automatisierte Tests für dicom2pacs +""" + +import os +import sys +import shutil +import tempfile +from pathlib import Path + +# Füge Projektverzeichnis zum Python-Pfad hinzu +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +def test_imports(): + """Test ob alle Module importiert werden können""" + print("Teste Imports...") + try: + import dicom_processing + import file_management + import network_utils + import gui + print("✓ Alle Module erfolgreich importiert") + return True + except ImportError as e: + print(f"✗ Import-Fehler: {e}") + return False + +def test_dicom_file_detection(): + """Test DICOM-Datei-Erkennung""" + print("\nTeste DICOM-Datei-Erkennung...") + try: + import dicom_processing + + # Suche nach Test-DICOM-Dateien + test_dirs = [ + os.path.expanduser("~/Downloads/test_dicom"), + "dist/dicom2pacs.app/Contents/Resources/lib/python3.13/pydicom/data/test_files", + "venv/lib/python3.13/site-packages/pydicom/data/test_files" + ] + + test_file = None + for test_dir in test_dirs: + if os.path.exists(test_dir): + for file in os.listdir(test_dir): + if file.endswith('.dcm'): + test_file = os.path.join(test_dir, file) + break + if test_file: + break + + if test_file and os.path.exists(test_file): + is_dicom = dicom_processing.is_dicom_file(test_file) + print(f"✓ DICOM-Datei erkannt: {os.path.basename(test_file)} -> {is_dicom}") + return True + else: + print("⚠ Keine Test-DICOM-Datei gefunden") + return False + except Exception as e: + print(f"✗ Fehler: {e}") + return False + +def test_file_management(): + """Test Dateiverwaltung""" + print("\nTeste Dateiverwaltung...") + try: + import file_management + + test_dir = os.path.expanduser("~/Downloads/test_dicom") + if os.path.exists(test_dir): + result = file_management.find_dicom_files(test_dir) + if result != 'non_found': + files, count = result + print(f"✓ {count} DICOM-Dateien gefunden") + return True + else: + print("⚠ Keine DICOM-Dateien im Test-Ordner") + return False + else: + print("⚠ Test-Ordner nicht gefunden") + return False + except Exception as e: + print(f"✗ Fehler: {e}") + return False + +def test_config_loading(): + """Test Konfigurationsladen""" + print("\nTeste Konfigurationsladen...") + try: + # Simuliere load_config + config_path = os.path.expanduser("~/.dicom2pacs.conf") + if os.path.exists(config_path): + print("✓ Konfigurationsdatei gefunden") + with open(config_path, 'r') as f: + content = f.read() + print(f" Inhalt: {len(content)} Zeichen") + return True + else: + print("⚠ Konfigurationsdatei nicht gefunden (wird beim ersten Start erstellt)") + return True # Nicht kritisch + except Exception as e: + print(f"✗ Fehler: {e}") + return False + +def test_patient_name_formatting(): + """Test Patientenname-Formatierung""" + print("\nTeste Patientenname-Formatierung...") + try: + import file_management + + # Test verschiedene Formate + test_cases = [ + ("MUSTERMANN^MAX", ("MUSTERMANN", "MAX")), + ("Mustermann^Max", ("Mustermann", "Max")), + ("SMITH", ("SMITH", "")), + ] + + for input_name, expected in test_cases: + result = file_management.format_patient_name(input_name) + if result == expected: + print(f"✓ '{input_name}' -> {result}") + else: + print(f"✗ '{input_name}' -> {result}, erwartet: {expected}") + return False + + return True + except Exception as e: + print(f"✗ Fehler: {e}") + return False + +def test_birthdate_formatting(): + """Test Geburtsdatum-Formatierung""" + print("\nTeste Geburtsdatum-Formatierung...") + try: + import file_management + + test_cases = [ + ("19800101", "01.01.1980"), + ("20001225", "25.12.2000"), + ] + + for input_date, expected in test_cases: + result = file_management.format_birthdate(input_date) + if result == expected: + print(f"✓ '{input_date}' -> {result}") + else: + print(f"✗ '{input_date}' -> {result}, erwartet: {expected}") + return False + + return True + except Exception as e: + print(f"✗ Fehler: {e}") + return False + +def main(): + """Hauptfunktion für alle Tests""" + print("=== dicom2pacs Automatisierte Tests ===\n") + + tests = [ + ("Imports", test_imports), + ("DICOM-Datei-Erkennung", test_dicom_file_detection), + ("Dateiverwaltung", test_file_management), + ("Konfiguration", test_config_loading), + ("Patientenname-Formatierung", test_patient_name_formatting), + ("Geburtsdatum-Formatierung", test_birthdate_formatting), + ] + + results = [] + for test_name, test_func in tests: + try: + result = test_func() + results.append((test_name, result)) + except Exception as e: + print(f"✗ Unerwarteter Fehler in {test_name}: {e}") + results.append((test_name, False)) + + # Zusammenfassung + print("\n" + "="*50) + print("Test-Zusammenfassung:") + print("="*50) + + passed = sum(1 for _, result in results if result) + total = len(results) + + for test_name, result in results: + status = "✓ PASS" if result else "✗ FAIL" + print(f"{status}: {test_name}") + + print("="*50) + print(f"Ergebnis: {passed}/{total} Tests bestanden") + + if passed == total: + print("🎉 Alle Tests bestanden!") + return 0 + else: + print("⚠️ Einige Tests fehlgeschlagen") + return 1 + +if __name__ == "__main__": + sys.exit(main()) diff --git a/test_dicom2pacs.sh b/test_dicom2pacs.sh new file mode 100755 index 0000000..969c9b8 --- /dev/null +++ b/test_dicom2pacs.sh @@ -0,0 +1,207 @@ +#!/bin/bash +# test_dicom2pacs.sh - Automatisiertes Testskript für dicom2pacs + +set -e # Beende bei Fehlern + +# Farben für Ausgabe +GREEN='\033[0;32m' +RED='\033[0;31m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo "=== dicom2pacs Test-Suite ===" +echo "" + +# 1. Prüfe ob venv existiert +if [ ! -d "venv" ]; then + echo -e "${YELLOW}Warnung: venv nicht gefunden. Erstelle es...${NC}" + python3 -m venv venv +fi + +# 2. Aktiviere venv +echo "Aktiviere virtuelles Environment..." +source venv/bin/activate + +# 3. Prüfe ob pydicom installiert ist +if ! python3 -c "import pydicom" 2>/dev/null; then + echo "Installiere pydicom..." + pip install pydicom +fi + +# 4. Erstelle Test-Ordner +TEST_DIR="$HOME/Downloads/test_dicom" +echo "" +echo "Erstelle Test-Ordner: $TEST_DIR" +mkdir -p "$TEST_DIR" + +# 5. Kopiere Test-DICOM-Dateien +echo "Kopiere Test-DICOM-Dateien..." + +# Prüfe ob gebaute App existiert +if [ -d "dist/dicom2pacs.app" ]; then + PYDICOM_PATH="dist/dicom2pacs.app/Contents/Resources/lib/python3.13/pydicom/data/test_files" + if [ -d "$PYDICOM_PATH" ]; then + cp "$PYDICOM_PATH/CT_small.dcm" "$TEST_DIR/" 2>/dev/null || echo "CT_small.dcm nicht gefunden" + cp "$PYDICOM_PATH/MR_small.dcm" "$TEST_DIR/" 2>/dev/null || echo "MR_small.dcm nicht gefunden" + cp "$PYDICOM_PATH/image_dfl.dcm" "$TEST_DIR/" 2>/dev/null || echo "image_dfl.dcm nicht gefunden" + fi +fi + +# Alternative: Prüfe ob pydicom im venv installiert ist +if [ -d "venv/lib/python3.13/site-packages/pydicom/data/test_files" ]; then + PYDICOM_VENV_PATH="venv/lib/python3.13/site-packages/pydicom/data/test_files" + cp "$PYDICOM_VENV_PATH/CT_small.dcm" "$TEST_DIR/" 2>/dev/null || true + cp "$PYDICOM_VENV_PATH/MR_small.dcm" "$TEST_DIR/" 2>/dev/null || true + cp "$PYDICOM_VENV_PATH/image_dfl.dcm" "$TEST_DIR/" 2>/dev/null || true +fi + +# Prüfe ob Dateien kopiert wurden +DICOM_COUNT=$(find "$TEST_DIR" -name "*.dcm" 2>/dev/null | wc -l | tr -d ' ') +if [ "$DICOM_COUNT" -eq 0 ]; then + echo -e "${RED}FEHLER: Keine DICOM-Testdateien gefunden!${NC}" + echo "Bitte manuell DICOM-Dateien nach $TEST_DIR kopieren" + exit 1 +fi + +echo -e "${GREEN}✓ $DICOM_COUNT DICOM-Dateien gefunden${NC}" + +# 6. Prüfe Konfiguration +echo "" +echo "Prüfe Konfiguration..." +CONFIG_FILE="$HOME/.dicom2pacs.conf" +if [ ! -f "$CONFIG_FILE" ]; then + echo -e "${YELLOW}Konfigurationsdatei nicht gefunden. Wird beim ersten Start erstellt.${NC}" +else + echo -e "${GREEN}✓ Konfigurationsdatei gefunden${NC}" + cat "$CONFIG_FILE" +fi + +# 7. Test-Parameter +TEST_NAME="Mustermann" +TEST_VORNAME="Max" +TEST_GEBURTSDATUM="19800101" +TEST_PATIENTEN_ID="TEST12345" + +echo "" +echo "=== Test-Parameter ===" +echo "Name: $TEST_NAME" +echo "Vorname: $TEST_VORNAME" +echo "Geburtsdatum: $TEST_GEBURTSDATUM" +echo "Patienten-ID: $TEST_PATIENTEN_ID" +echo "Test-Ordner: $TEST_DIR" +echo "" + +# 8. Prüfe ob App existiert +if [ ! -f "dicom2pacs.py" ]; then + echo -e "${RED}FEHLER: dicom2pacs.py nicht gefunden!${NC}" + exit 1 +fi + +# 9. Test-Menü +echo "=== Test-Menü ===" +echo "1. GUI-Test (manuell - App öffnet sich)" +echo "2. Unit-Test (prüft Module ohne GUI)" +echo "3. Integrationstest (vollständiger Test)" +echo "4. Aufräumen (löscht Test-Ordner)" +echo "" +read -p "Wählen Sie eine Option (1-4): " choice + +case $choice in + 1) + echo "" + echo -e "${GREEN}Starte GUI-Test...${NC}" + echo "Die App öffnet sich jetzt." + echo "Bitte wählen Sie den Ordner: $TEST_DIR" + echo "" + python dicom2pacs.py "$TEST_NAME" "$TEST_VORNAME" "$TEST_GEBURTSDATUM" "$TEST_PATIENTEN_ID" + ;; + 2) + echo "" + echo -e "${GREEN}Starte Unit-Tests...${NC}" + python3 << 'EOF' +import sys +import os +sys.path.insert(0, os.getcwd()) + +print("Teste dicom_processing...") +try: + import dicom_processing + print("✓ dicom_processing importiert") + + # Test is_dicom_file + test_file = os.path.expanduser("~/Downloads/test_dicom/CT_small.dcm") + if os.path.exists(test_file): + result = dicom_processing.is_dicom_file(test_file) + print(f"✓ is_dicom_file: {result}") + else: + print("⚠ Test-Datei nicht gefunden") +except Exception as e: + print(f"✗ Fehler: {e}") + +print("\nTeste file_management...") +try: + import file_management + print("✓ file_management importiert") + + test_dir = os.path.expanduser("~/Downloads/test_dicom") + if os.path.exists(test_dir): + files = file_management.find_dicom_files(test_dir) + if files != 'non_found': + dicom_files, count = files + print(f"✓ find_dicom_files: {count} Dateien gefunden") + else: + print("⚠ Keine DICOM-Dateien gefunden") + else: + print("⚠ Test-Ordner nicht gefunden") +except Exception as e: + print(f"✗ Fehler: {e}") + +print("\nTeste network_utils...") +try: + import network_utils + print("✓ network_utils importiert") +except Exception as e: + print(f"✗ Fehler: {e}") + +print("\n✓ Unit-Tests abgeschlossen") +EOF + ;; + 3) + echo "" + echo -e "${GREEN}Starte Integrationstest...${NC}" + echo "Dieser Test führt die App im Hintergrund aus." + echo "Bitte beachten Sie, dass die GUI geöffnet wird." + echo "" + read -p "Fortfahren? (j/n): " confirm + if [ "$confirm" = "j" ] || [ "$confirm" = "J" ]; then + python dicom2pacs.py "$TEST_NAME" "$TEST_VORNAME" "$TEST_GEBURTSDATUM" "$TEST_PATIENTEN_ID" & + echo "App gestartet. PID: $!" + echo "Bitte testen Sie die App manuell." + fi + ;; + 4) + echo "" + echo -e "${YELLOW}Lösche Test-Ordner...${NC}" + if [ -d "$TEST_DIR" ]; then + rm -rf "$TEST_DIR" + echo -e "${GREEN}✓ Test-Ordner gelöscht${NC}" + else + echo "Test-Ordner existiert nicht" + fi + + # Lösche auch Transfer-Ordner falls vorhanden + TRANSFER_DIR="$HOME/Downloads/D2OTrans" + if [ -d "$TRANSFER_DIR" ]; then + echo "Lösche Transfer-Ordner..." + rm -rf "$TRANSFER_DIR" + echo -e "${GREEN}✓ Transfer-Ordner gelöscht${NC}" + fi + ;; + *) + echo -e "${RED}Ungültige Option${NC}" + exit 1 + ;; +esac + +echo "" +echo -e "${GREEN}=== Test abgeschlossen ===${NC}"