# Faehrt die komplette Test-Suite gegen die Addon-Dateien. # # Warum es das gibt: die Tests lagen einzeln herum und wurden nur beim Bauen des # jeweiligen Features gestartet. Dadurch waren fuenf davon still veraltet - sie # pruesten gegen Namen und Zip-Versionen, die es laengst nicht mehr gab, und # haetten eine echte Regression nicht gemeldet. Ein Befehl fuer alles. # # Aufruf: # .\run_tests.ps1 # .\run_tests.ps1 -Blender "E:\SteamLibrary\steamapps\common\Blender\blender.exe" # .\run_tests.ps1 -Filter panels # nur tests\test_panels.py # # Hinweis: test_tree_addon.py prueft das GEBAUTE Zip aus dist\ - vorher # .\build.ps1 laufen lassen, sonst meldet der Test das fehlende Zip. param( [string]$Blender = "blender", [string]$Filter = "*" ) $root = $PSScriptRoot $tests = Get-ChildItem (Join-Path $root "tests") -Filter "test_$Filter.py" | Sort-Object Name if (-not $tests) { throw "Keine Tests gefunden fuer Filter '$Filter'" } $failed = @() $abgestuerzt = @() foreach ($t in $tests) { # Ein Lauf kann an einem BLENDER-ABSTURZ sterben statt an einem Testfehler. # Nachgemessen an test_export_robust: rund jeder sechste Lauf endet mit # EXCEPTION_ACCESS_VIOLATION - und zwar ohne einen einzigen Addon-Frame im # Stack (RNA_property_int_get -> rna_property_rna_or_id_get -> # IDP_GetPropertyFromGroup, Null-Deref beim Lesen einer Integer-Property). # Baut man Marker in denselben Test ein, verschwindet der Absturz: ein # Heisenbug, also Blender 5.1.2 und nicht unser Code. Wenn der Lauf # durchlaeuft, bestehen ALLE Checks des Tests. # Deshalb einmal wiederholen und den Absturz benennen, statt ihn als # stillen Testfehler auszugeben - "" hat monatelang # niemandem gesagt, was eigentlich los war. $out = & $Blender --background --factory-startup --python $t.FullName 2>&1 | Out-String $crash = $false if ($out -match "EXCEPTION_ACCESS_VIOLATION") { $crash = $true $out = & $Blender --background --factory-startup --python $t.FullName 2>&1 | Out-String $abgestuerzt += if ($out -match "EXCEPTION_ACCESS_VIOLATION") { $t.BaseName + " (auch im zweiten Lauf)" } else { $t.BaseName } } # Die Tests melden ihr Ergebnis als letzte Zeile mit "ERGEBNIS:" bzw. # "Alle Checks bestanden." - alles andere ist Blender-Rauschen. $line = ($out -split "`n" | Where-Object { $_ -match "ERGEBNIS|Alle Checks bestanden|FEHLGESCHLAGEN" } | Select-Object -Last 1) if (-not $line) { $line = if ($crash) { "" } else { "" } } $line = $line.Trim() $ok = ($line -match "ALLE|OK$|bestanden") -and ($line -notmatch "FEHLER|FEHLGESCHLAGEN") $color = if ($ok) { "Green" } else { "Red" } if (-not $ok) { $failed += $t.BaseName } Write-Host ("{0,-24} {1}" -f $t.BaseName, $line) -ForegroundColor $color } Write-Host "" if ($abgestuerzt) { Write-Host ("Blender-Absturz (wiederholt): {0}" -f ($abgestuerzt -join ", ")) -ForegroundColor Yellow } if ($failed) { Write-Host ("FEHLGESCHLAGEN ({0}): {1}" -f $failed.Count, ($failed -join ", ")) -ForegroundColor Red exit 1 } Write-Host ("Alle {0} Tests bestanden." -f $tests.Count) -ForegroundColor Green