37 Stimmen

Unit-Tests für Gerätetreiber

Ich habe eine Situation, in der ich Folgendes schreiben muss algunos Unit-Tests für einige Gerätetreiber für eingebettete Hardware. Der Code ist ziemlich alt und groß und hat leider nicht viele Tests. Im Moment ist die einzige Art von Tests, die möglich ist, das Betriebssystem vollständig zu kompilieren, es auf das Gerät zu laden, es in realen Szenarien zu verwenden und zu sagen, dass es funktioniert. Es gibt keine Möglichkeit, einzelne Komponenten zu testen.

Ich bin auf eine schöner Thread hier, der Unit-Tests für eingebettete Geräte diskutiert von dem ich viele Informationen erhalten habe. Ich möchte ein wenig spezifischer werden und fragen, ob jemand irgendwelche "Best Practices" für das Testen von Gerätetreibern in einem solchen Szenario kennt. Ich erwarte nicht, dass ich in der Lage sein werde, eines der Geräte zu simulieren, mit denen die fragliche Karte kommuniziert, und werde sie daher wahrscheinlich auf der tatsächlichen Hardware selbst testen müssen.

Auf diese Weise hoffe ich, Daten zur Testabdeckung für die Treiber zu erhalten und die Entwickler dazu zu bewegen, Tests zu schreiben, um die Abdeckung ihrer Treiber zu erhöhen.

Eine Möglichkeit, die mir einfällt, ist das Schreiben von eingebetteten Anwendungen, die auf dem Betriebssystem laufen und den Treibercode trainieren und dann die Ergebnisse zurück an das Test-Harness übermitteln. Das Gerät verfügt über eine Reihe von Schnittstellen, über die ich die Anwendung wahrscheinlich von meinem Test-PC aus steuern kann, um den Code zu üben.

Für weitere Vorschläge oder Erkenntnisse wären wir sehr dankbar.


Update: Auch wenn es vielleicht nicht die exakte Terminologie ist, meinte ich mit "Unit Testing" die Möglichkeit, Code zu testen/zu üben, ohne das gesamte Betriebssystem und die Treiber kompilieren und auf das Gerät laden zu müssen. Wenn ich das tun müsste, würde ich es Integrations-/Systemtests nennen.

Das Problem ist, dass die Hardware, die wir haben, begrenzt ist und oft von den Entwicklern benutzt wird, um Fehler zu beheben usw. Einen dedizierten Rechner zu haben, der mit dem Rechner verbunden ist, auf dem der CI-Server und die automatisierten Tests durchgeführt werden, könnte in diesem Stadium nicht in Frage kommen. Deshalb suche ich nach Möglichkeiten, den Treiber zu testen, ohne das ganze Ding tatsächlich zu bauen und auf das Gerät zu laden.


Zusammenfassung

Basierend auf den ausgezeichneten Antworten unten, denke ich, dass ein vernünftiger Weg, um das Problem zu nähern wäre, um Treiber-Funktionalität mit IOCTLs und dann schreiben Tests in den Anwendungsbereich des eingebetteten Geräts, um tatsächlich den Treiber-Code ausüben.

Es wäre auch sinnvoll, ein kleines Programm im Anwendungsbereich des Geräts zu haben, das eine API zur Verfügung stellt, die den Treiber über die serielle Schnittstelle oder den USB-Anschluss ansprechen kann, so dass der Kern des Einheitstests auf einem PC geschrieben werden kann, der mit der Hardware kommuniziert und den Test ausführt.

Wenn das Projekt erst am Anfang stünde, hätten wir meiner Meinung nach mehr Kontrolle über die Art und Weise, wie die Komponenten isoliert werden, so dass die Tests hauptsächlich auf PC-Ebene durchgeführt werden können. In Anbetracht der Tatsache, dass die Codierung bereits abgeschlossen ist und wir versuchen, das Testsystem und die Testfälle nachträglich in das System einzubauen, halte ich den oben beschriebenen Ansatz für praktischer.

Ich danke Ihnen allen für Ihre Antworten.

1voto

KLE Punkte 22895

Vokabeln

Ich erwarte nicht, dass ich eines der Geräte, mit denen die betreffende Karte kommuniziert, simulieren kann, und werde sie daher wahrscheinlich auf der tatsächlichen Hardware selbst testen müssen.

Dann verlassen Sie die Unit-Tests. Vielleicht könnten Sie stattdessen einen der folgenden Ausdrücke verwenden?

  • Automatisiert Testen : Testen ohne Benutzereingabe (das Gegenteil von Handbuch Prüfung).
  • Integration Testen : Testen mehrerer Komponenten zusammen (das Gegenteil von Einheit Prüfung).
    Wenn man ein ganzes System und nicht nur einige Komponenten zusammen testet, nennt man das in größerem Maßstab System Tests.

HINZUFÜGEN nach Kommentaren und Aktualisierungen in der Frage :

  • Prüfung von Bauteilen : wie Integrationstests oder Systemtests, aber in einem noch kleineren Rahmen.
    Anmerkung: Alle drei Komponenten-Integrations-System-Tests haben dieselbe Problemstellung, allerdings in unterschiedlichem Umfang. Im Gegensatz dazu ist dies bei den Unit-Tests nicht der Fall (siehe unten).

Vorteile von "echten" Unit-Tests

Bei Integrations- (oder System- oder Komponenten-) Tests ist es sicherlich interessant, Rückmeldungen zu erhalten, z. B. zur Testabdeckung. Es ist sicherlich nützlich, dies zu tun.

Es ist jedoch sehr schwierig (sprich: sehr kostspielig), über einen bestimmten Punkt hinaus Fortschritte zu erzielen, so dass
Ich schlage vor, dass Sie ergänzende Ansätze verwenden, wie das Hinzufügen einiger echter Unit-Tests . Warum? :

  • Sie ist sehr schwer, die Rand- oder Fehlerbedingungen zu simulieren . (Beispiele: Die Uhr des Computers geht während einer Transaktion einen Tag oder ein Jahr weiter; das Netzwerkkabel ist nicht angeschlossen; die Stromversorgung einer Komponente oder des gesamten Systems wurde unterbrochen und dann wieder eingeschaltet; die Festplatte ist voll). Mit Unit Testing ist es viel einfacher, diese Bedingungen zu simulieren, als zu versuchen, sie zu reproduzieren. Unit Testing ist Ihre einzige Chance, eine wirklich gute Codeabdeckung zu erreichen.
  • Integrationstests brauchen Zeit (wegen des Zugangs zu externen Ressourcen). Während der Durchführung eines Integrationstests könnten Sie Tausende von Unit-Tests ausführen. Das Testen vieler Kombinationen ist also nur mit Unit Tests möglich...
  • Da sie Zugang zu bestimmten Ressourcen (Hardware, Lizenzen usw.) erfordern, sind Integrationstests oft zeitlich oder vom Umfang her begrenzt. . Wenn die Ressourcen von anderen Projekten gemeinsam genutzt werden, kann es sein, dass jedes Projekt sie nur einige Stunden pro Tag verwendet. Selbst bei exklusivem Zugang kann vielleicht nur ein Rechner darauf zugreifen, so dass Sie keine parallelen Tests durchführen können. Oder Ihr Unternehmen kauft vielleicht eine Ressource (Lizenz oder Hardware) für die Produktion, hat sie aber nicht (oder nicht früh genug) für die Entwicklung...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X