WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

unit tests / Komponententest

 

Bluesmaster
Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 06.02.2013, 13:10     Titel: unit tests / Komponententest
  Antworten mit Zitat      
Hallo,

da ich es zur Zeit oft mit komplexer Software zu tun habe, wollte ich mich
mal etwas mit sogn. unit tests beschäftigen.

http://de.wikipedia.org/wiki/Komponententest

Dazu würde ich gern ein paar Meinungen von erfahreneren Programmieren
hören. Bringt das was oder sollte man lieber eigene Methoden verwenden?
Wann sollte man es einsetzen? Welche Erfahrungen habt ihr damit gemacht?

Und vor allem: was ist das Beste für Matlab (es gibt ja eine Unzahl an Angeboten:)

http://www.mathworks.de/matlabcentr.....=%E2%9C%93&term=xunit

http://www.mathworks.de/matlabcentr.....xchange/21888-mlunit2008a

http://www.mathworks.de/matlabcentr.....sting-framework-in-matlab

http://www.mathworks.de/matlabcentral/fileexchange/7979-matunit

http://www.mathworks.de/matlabcentr.....e/7404-unit-testing-tools

http://www.mathworks.de/matlabcentral/fileexchange/7845-munit

http://www.mathworks.de/matlabcentr.....tlab-xunit-test-framework

Vielen Dank und es eilt auch nicht

Gruß

Blues
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.02.2013, 15:06     Titel: Re: unit tests / Komponententest
  Antworten mit Zitat      
Hallo Bluesmaster,

Ich habe mir nicht alle Links angeschaut. Denn es gibt eine grundsätzliche Antwort: Es ist egal, welches Framework Du zum Testen verwendest! Das eine mag vielleicht ein wenig effizienter sein, aber es geht immer darum, ob Du Monate benötigst um einen Bug in 200'000 Zeilen Matlab-Code zu finden, oder eben 2 Minuten, bzw. 2 Minuten und 30 Sekunden.

Ein guter Komponenten-Test kann auch mit handgemachtem Code erfolgen, solange man sich an gewisse Standards hält. Wichtig ist dabei:
1. Die ordnungsgemäße Behandlung von Standard-Inputs muss getestet werden.
2. In Known-Answer-Tests wird der Rückgabe-Wert in möglichst umfassenden bekannten Fällen überprüft. Zudem sind Random-Input-Tests hilfreich Fälle zu finden, an die man einfach noch nicht gedacht hat.
3. Es muss kontrolliert werden, dass die Funktion sinnvoll auf falsche Inputs reagiert (am besten mit einem Fehler): Falsche Anzahl von Inputs, falscher Type, falsche Dimension
4. Die Tests müssen automatisch ablaufen, damit man sie auch wirklich regelmäßig durchführt.
5. Die Ergebnisse der Tests müssen extrem einfach zu druchschauen sein. Wenn der Programmierer 120kB Text-Output durchsuchen muss um Fehler wahrzunehmen, wird das nicht funktionieren. Am besten ist eine Liste mit allen gescheiterten Funktionen. Solange diese dann nicht leer ist, ist das Programm-Paket nicht erfolgreich getestet.
6. Wenn ein Fehler auftritt, muss die Ausgabe so verständlich wie irgend möglich sein. Ein ellenlanger Fehler-Report bringt nicht viel, wenn man nicht weiß, wo man was verbessern muss.
7. Ein Loggin ist essentiell. Natürlich wird irgendwann ein Fehler auftreten, und dann muss man wissen, wann die Funktion zuletzt erfolgreich getestet wurde und was sich seit dem verändert hat.
8. Zudem sind noch Integration-Tests hilfreich: Auch aus 1000 exzellent getesteten Matlab Funktionen kann man ein Programm konstruieren, das Fehler enthält.
9. Die Unit-Tests dienen der Qualitätskontrolle. Damit diese überhaupt ein Ergebnis hat, muss man die Qualität messen (egal wie) und protokollieren.

Ich selbst bevorzuge manuell erstellte Unit-Tests, da ich die leicht mit Code ausliefern kann, den ich z.B. im FileExchange veröffentliche. Dann kann der Downloader mit dem Unit-Test herausfinden, ob der Code auch unter seiner Matlab Rxyz/64bit/Linux-Version so funktioniert, wie ich mir das vorgestellt habe. Wenn er dazu erst ein eigenes Test-Framework installieren muss, wird das im Allgemeinen am Aufwand scheitern.

Wenn sich dagegen TMW entschließen könnte, eines der Test-Frameworks in Matlab zu integrieren, würde ich sofort darauf umsteigen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Themenstarter

Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 06.02.2013, 18:12     Titel:
  Antworten mit Zitat      
Danke Jan für die sehr umfangreiche Antwort.

Da ich nicht aus dem informatischen Bereich komme, war mir
bis vor kurzem gar nicht klar, dass es beim Thema
Testen solche systemischen Lösungen gibt.

Deine lange Antwort macht mir klar dass Unit und Integrationstests
anscheinend eine sehr hohe Relevanz haben.

Besonders das Thema "Logging" interessiert mich.
Geht es dabei eher um Code-logging ( Versionsverwaltung/svn/cvs)
oder um das loggen der Ein- und Ausgabewerte?
Und wenn letzteres wieso sollten die sich ändern, die Tests
sollten doch unabhängig voneinander sein? (Wikipedia > Anfänger)


Und da ich oft Oberflächen entwickle: Wie kann ich deren Verhalten
testen? Diese haben ja nicht direkt eine "known-answer"


Über Antworten freue ich mich ( gern natürlich auch weitere Erfahrungen)

Gruß

Blues
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 07.02.2013, 12:14     Titel:
  Antworten mit Zitat      
Hallo Bluesmaster,

Bei der Entwicklung großer Programme gibt es eine magische Grenze von 100'000 Zeilen Code, die ein einzelner Programmiere noch überschauen kann. Wenn ein Programm größer wird oder mehrere Programmierer daran arbeiten kommt man um eine ordentliche Dokumentation aller Einzel-Funktionen und automatische Tests nicht herum. Andernfalls is die Komplexität so groß, dass die kleinste Änderung, z.B. auch ein Bugfix, zu unkontrollierbaren Effekten auch an ganz anderen Stellen führen kann. Objekt-Orientierte Programmierung ist dann eine große Hilfe, weil hier einzelne Teile voneinander gekapselt werden, aber eine einfache Patent-Lösung ist dies trotzdem nicht.

Große Software-Projekte, die an der explodierenden Komplexität scheitern, gibt es in großen Massen. Google findet (zu) viele herrliche Beispiele von grandiosen Fehlplanungen, bei denen z.B. eine deutsche Krankenkasse mal eben eine Milliarde (nicht Million!) Entwicklungskosten in den Sand gesetzt hat.

Man benötigt sehr dringend eine Versionsverwaltung des Codes, um Änderungen zu protokollieren und kontrollieren zu können. Andererseits muss das Testen ebenfalls damit verbunden sein. Wird für eine Funktion ein neues Feature entwickelt, muss man auch testen, ob alle anderen Funktionen auch damit klarkommen.
Die Tests sollen unabhängig voneinander sein, aber die Funktionen hängen voneinander im Allgemeinen ab. Wenn ich eine effizientere SQRT-Funktion implementiere, muss diese zunächst der Unit-Test geprüft werden. Meine 2-Norm-Funktion kann dann aber trotzdem noch unerwartete Änderungen erfahren, so dass auch diese Funktion neu geprüft werden muss. Nun sind die Tests voneinander unabhängig, die Funktionen aber nicht.

Ich hatte einmal große Schwierigkeiten mit einem Test-Durchlauf, weil ich einen Bug in "isEqualTol" hatte, welches die Gleichheit mit einer relativen und absoluten Toleranz testet. Durch Rundungsfehler kann sich ja das Ergebnis einer M- und C-Implementierung unterscheiden, ohne dass die Funktionen grundsätzlich nicht equivalent sind. Nun riefen aber fast 100 Testfunktionen isEqualTol auf um Ergebnisse zu vergleichen und der Bug darin führte zu hunderten Seiten Fehlermeldungen. Das war also ein grober Design-Fehler.

Die GUIs lassen sich testen, wenn man dies von vornherein im Design berücksichtigt. Dazu muss die Benutzeroberfläche streng von den eigentlichen Berechnungen getrennt sein. GUIDE macht das strukturierte Vorgehen viel schwerer, darum verzichte ich grundsätzlich darauf ausser um testweise die Buttons hin-und-her zu schubsen um zu beurteilen, was hübscher aussieht. Ein GUI-Known-Answer-Test wäre dann das Setzen bestimmter Werte (String in Edit-Felder, Values von Check-Boxen und Toggle-Buttons etc) in den UICONTROLs, dann das Auslösen von Callbacks (das geht ja eben auch per Programm) z.B. eines Start-Buttons. Dann wird nicht das eigentliche Programm aufgerufen, sondern mit einer Liste der Argumente eine eigene Test-Funktion. Dazu benötigt das GUI also einen "Test-Mode", der sich möglichst nur in dem Punkt vom normalen Mode unterscheiden darf, dass die Ausgabe getestet wird, statt die Berechnung zu starten. Der GUI-Test testet also wirklich nur das GUI, während die Berechnung ein ganz getrennter und eigenständig getesteter Punkt ist.
Eine solche Funktionialität lässt sich kaum im Nachhinein ein ein GUI hineinpfriemeln.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Themenstarter

Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 07.02.2013, 19:04     Titel:
  Antworten mit Zitat      
Das sind wirklich wertvolle Einblicke, und ich danke dir dass du dir die Zeit genommen hast.

Komplexität ist ein Risiko. Und das Beispiel mit der Krankenkasse ist wirklich
brutal, immerhin gibt es Länder, die haben noch nicht einmal so ein Bruttoinlandsprodukt.

Aber Komplexität ist auch ein eine einzigartige Chance, gerade weil sienicht jeder beherrscht.
Ein Flaschenhals durch den auch der gewichtigste Konzern nicht einfach hindurchschlüpfen kann egal wieviel Geld er in die Hand nimmt, wenn er
nicht die richtigen Leute mit den richtigen Methoden hat.

Auf jedenfall ein lohnendes Gebiet mit dem ich mich weiter beschäftigen werde.

Gruß

Blues
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.03.2013, 22:38     Titel:
  Antworten mit Zitat      
Hallo,

an dieser Stelle ist vielleicht auch 2013a interessant. Neues Feature dort:
Zitat:
matlab.unittest package, an xUnit-style testing framework for the MATLAB language that allows writing and running unit tests, and analyzing test results

http://www.mathworks.de/de/help/relnotes/new-features.html#MATLAB

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Themenstarter

Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 31.03.2013, 09:21     Titel:
  Antworten mit Zitat      
Jup, das habe ich auch schon bemerkt.

Damit erübrigt sich denke ich auch die Qual der Wahl zwischen
den ganzen 3rd-Party Angeboten.

Zumindest sobald ich sobald ich wieder was übrig habe
für eine neue Lizenz Wink



Gruß

Blues
Private Nachricht senden Benutzer-Profile anzeigen
 
Super8film
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 13.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.10.2016, 08:54     Titel:
  Antworten mit Zitat      
Ist zwar ein älterer Beitrag, aber ich dachte es vllt doch recht aktuelles Thema immer noch.
Habt ihr bereits Erfahrung mit den Testing Frameworkhttp://de.mathworks.com/help/matlab.....-unit-test-framework.html gesammelt? Kann man es auch für Simulinkmodelle verwenden? Ich habe bisher noch keine Zeit in ein eigenes Beispiel für mich persönlich reingesteckt.
Ich würde gerne etwas verwenden wo das Framework stimmig ist und ich nicht noch das Framework selbst abtesten muss. Deswegen möchte ich nicht wieder selbst Skripte nehmen, sondern meine bisherigen Sachen gerne in ein bestehendes Framework übernehmen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.