Ich habe festgestellt, dass ein Großteil meiner rechnergestützten Programmierung Testanforderungen hat, die nicht durch Standard-Test-Frameworks abgedeckt sind:
Berechnung der Rechenzeit
- Um sicherzustellen, dass Algorithmen nicht langsamer werden. Ich könnte so etwas tun,
assureSmallerEqual(RuntimeWrapper(algorithm),53)
aber ich möchte, dass der 53-Sekunden-Schwellenwert kontinuierlich reduziert wird, während ich an dem Algorithmus arbeite, dh so etwasassureSmallerEqual(RuntimeWrapper(algorithm),'previousbest+noisetolerance')
- Um sicherzustellen, dass Algorithmen nicht langsamer werden. Ich könnte so etwas tun,
Leistungstest
- Um sicherzustellen, dass ein Algorithmus, der zuvor eine gute Annäherung an eine analytische Lösung gefunden hat, immer noch eine Lösung findet, die mindestens genauso gut oder besser ist. Auch dies könnte durch einen Standard-Integrationstest emuliert werden, aber ich möchte, dass die Toleranz kontinuierlich abnimmt, wenn der Algorithmus immer besser wird. Denken Sie daran,
assureAlmostEqual(foo(),1,places=3)
durch zu ersetzenassureAlmostEqual(foo(),1,places='previousbest')
- Um sicherzustellen, dass ein Algorithmus, der zuvor eine gute Annäherung an eine analytische Lösung gefunden hat, immer noch eine Lösung findet, die mindestens genauso gut oder besser ist. Auch dies könnte durch einen Standard-Integrationstest emuliert werden, aber ich möchte, dass die Toleranz kontinuierlich abnimmt, wenn der Algorithmus immer besser wird. Denken Sie daran,
Prüfung der körperlichen Anforderungen
- Um sicherzustellen, dass Algorithmen nicht plötzlich mehr Speicher / Festplattenspeicher benötigen. Sehr ähnlich zu 1.
Abstrakte Anforderungsprüfung
- Um sicherzustellen, dass ein Algorithmus, der mit quadratischen Approximationen gut funktioniert hat, nicht plötzlich kubische Approximationen benötigt, oder dass ein Algorithmus, der mit Zeitschritt 0.1 gut funktioniert hat, nicht plötzlich 0,01 für Stabilität benötigt. Auch diese könnten durch Standardintegrationstests emuliert werden. Ziel ist es jedoch, sich daran zu erinnern, welcher der kleinsten Anforderungsparameter ein bestimmtes Ziel erreicht hat. Dies würde daher viele manuelle Aktualisierungen erfordern. Wenn zum Beispiel
foo(10)
zuvor keine Ausnahmen geworfen wurden, möchte ich, dass das Framework sicherstellt, dass esfoo(10)
immer noch funktioniert, und auch versucht, ob esfoo(9)
jetzt funktioniert (in diesem Fall würden alle zukünftigen Tests sicherstellen, dass esfoo(9)
immer noch funktioniert).
- Um sicherzustellen, dass ein Algorithmus, der mit quadratischen Approximationen gut funktioniert hat, nicht plötzlich kubische Approximationen benötigt, oder dass ein Algorithmus, der mit Zeitschritt 0.1 gut funktioniert hat, nicht plötzlich 0,01 für Stabilität benötigt. Auch diese könnten durch Standardintegrationstests emuliert werden. Ziel ist es jedoch, sich daran zu erinnern, welcher der kleinsten Anforderungsparameter ein bestimmtes Ziel erreicht hat. Dies würde daher viele manuelle Aktualisierungen erfordern. Wenn zum Beispiel
Man könnte argumentieren, dass das, wonach ich frage, keine Tests im Sinne von Unit- / Integrationstests beschreibt, da beispielsweise längere Laufzeiten als Gegenleistung für andere Verbesserungen akzeptabel sein könnten.
In der Praxis weiß ich jedoch, dass ich viel Debugging-Zeit gespart hätte, wenn ich die oben genannten Testfunktionen gehabt hätte, da in 95% der Fälle Anforderungen und Leistung aufgrund von Fehlern, die ich eingeführt habe, schief gelaufen sind. In der Tat weiß ich, dass viele Fehler, die ich (nach viel Zeitverschwendung beim Überprüfen meines eigenen Codes) mit externen numerischen Softwarebibliotheken gefunden habe, trivial hätten vermieden werden können, wenn die oben genannten Tests rigoros angewendet worden wären.
PS
Die ähnlich benannte Frage /programming/34982863/framework-for-regression-testing-of-numerical-code ist kein Duplikat, da sie Funktionen beschreibt, die mit Standard-Regressionstest-Frameworks leichter zu erreichen sind.
Die Frage Strategien für Unit-Tests und testgetriebene Entwicklung fragt nach Strategien im Gegensatz zu einem Framework, das bei deren Implementierung hilft (und die Strategien, nach denen gefragt wird / die in den Antworten enthalten sind, unterscheiden sich meiner Meinung nach von den hier beschriebenen).