Ist es eine gute Idee, TDD auf Low-Level-Komponenten durchzuführen?

10

Ich denke darüber nach, einen Low-Level-Treiber oder Betriebssystemkomponenten / Kernel zu schreiben.

Die Leute von osdev.org scheinen zu denken, dass die wichtigen Teile auf diese Weise nicht sinnvoll testbar sind, aber ich habe einige Diskussionen gelesen, in denen die Leute anders dachten. Ich habe mich umgesehen, aber keine realen Beispiele für TDD auf Low-Level-Komponenten gefunden.

Ist dies etwas, was die Leute tatsächlich tun, oder nur etwas, worüber die Leute theoretisch sprechen, weil es in der Praxis keinen guten Weg gibt, dies zu tun?

Rechnung
quelle
Wenn nur MS den Kernel-Entwicklern geeignete "Kernel-Mocks" (oder was auch immer es sein könnte) zur Verfügung stellen würde, wäre die fragliche Praxis meiner Meinung nach nicht so "einfallsreich".
mlvljr
Hi @ Bill - Ich habe Ihre Frage ein wenig umformuliert und dafür gestimmt, sie erneut zu öffnen. Wenn ich es zu sehr von Ihrer ursprünglichen Absicht geändert habe, können Sie es gerne weiter bearbeiten oder die Frage zurücksetzen :)
Rachel
Sagt das gleiche aus meiner Sicht - keine Sorgen
Bill

Antworten:

3

Wenn Sie mit Hardware interagieren oder diese steuern, ist es schwierig, ohne sie zu testen. Sie können versuchen, die Hardware zu emulieren, aber das ist oft schwieriger als das Schreiben des Treibers. Sie wissen also nicht, ob der Fehler in Ihrem Treiber oder in Ihrem Emulator liegt.

TMN
quelle
1
Und warum dann nicht den Emulator testen? ;)
mlvljr
@mlvljr: weil Emulatoren nicht die reale Sache sind. Es gibt keinen Ersatz für echte Hardware.
Paul Nathan
@mlvljr Sie müssten den Emulator auch gegen echte Hardware testen und Testsuiten verwenden, die zum Testen der ursprünglichen Tests erstellt wurden. Warten Sie, wo bin ich wieder?
Hinweis für sich selbst - denken Sie an einen Namen
Also, VMware und ähnliche können dann nicht getestet werden?
mlvljr
1
@mlvljr: Es ist ein gültiger Punkt, aber ich denke, er fällt außerhalb des Bereichs von "TDD". Nicht viele Entwickler haben Zugriff auf einen skriptfähigen, instrumentierten Emulator auf Systemebene. Ich hatte das Glück, ein Vier-Kanal-Oszilloskop zu haben!
TMN
3

Ich persönlich neige dazu zu glauben, dass man viele der Vorteile von TDD nutzen kann (ohne sich tatsächlich an TDD zu halten), indem:

  • Schreiben sowohl der Anrufer und der Angerufene Code in etwa zur gleichen Zeit ( auf jeden Fall nicht mehr als 24 Stunden auseinander).
    • Und nutzen Sie dies, um das Design der Schnittstelle (Objekte, Methodenaufrufe und Parameter) zu beeinflussen.
  • Für eine Komponente, die einen komplizierten Algorithmus / Code erfordert, sollten Sie zunächst die Implementierung in einem einfacheren, aber korrekten Algorithmus in Betracht ziehen, selbst wenn dieser weniger effizient ist (oder dumm ist oder nur in einer engeren Situation funktioniert).
    • Eine sehr einfache Testmethode wäre, beide Algorithmen auszuführen und ihre Ergebnisse zu vergleichen.
  • Sobald ein Fehler (auf irgendeine Weise) in einem Teil des Codes entdeckt wurde, verdient dieser Teil des Codes, viel aggressiver getestet zu werden. Dies bedeutet, anspruchsvollere Tests durchzuführen, als TDD erfordern würde. (basierend auf der Überlegung, dass Fehler in Clustern auftreten )

TDD scheint Sie benötigen eine ziemlich klar haben, zu verstehen , welche Funktion Sie planen , zu implementieren, oder welche Anforderungen Sie planen, durch die Umsetzung des Codes zu erfüllen. In einigen Situationen gibt es einfach zu wenig Verständnis für das Problem. Dies hätte eine Spike- Lösung erforderlich gemacht . Im Rahmen dieser Spike-Lösung kann TDD angewendet werden, da das Problem auf ein überschaubares Maß eingegrenzt wurde. Sobald einige Spikes fertig sind, die jeweils einige Aspekte des ursprünglichen Problems abdecken, kann mit der Arbeit an der vollständigen Lösung begonnen werden, und die Anwendung von TDD an diesem Punkt könnte aufgrund des verbesserten Verständnisses möglich sein.

Bearbeitet:

Nachdem Sie die Seite genauer gelesen haben,

Während es möglich sein sollte, die meisten Kernelfunktionen in einem "Testbed" -Testtreiber zu testen, sind die wirklich "saftigen" Dinge wie Interrupt-Behandlung, Prozessverteilung oder Speicherverwaltung wahrscheinlich nicht auf Einheiten testbar. --- von http://wiki.osdev.org/Unit_Testing

Sie sagen eindeutig, dass die meisten Teile überprüfbar sind und dass einige Teile eine andere Art von Prüfung erfordern: Stresstests .

rwong
quelle
es bedeutet auch, dass die wichtigen Teile die Teile sind, die imho unterschiedliche Tests erfordern.
Bill
Was für eine großartige Antwort! in einigen vielen Ebenen Prost!
ManuelBetancurt
1

Ich nicht. Im eingebetteten Code meines Masters schreibe ich einfach den Code und verbringe meine Zeit damit, darüber nachzudenken, was er tut (und was nicht). Ich bin mir nicht sicher, ob dies in meinem Fall möglich ist. Ich nähere mich störend der physischen Speichergrenze, ohne Testcode einzufügen.

Ich denke, dass für Systeme, die groß genug sind (dh MB Arbeitsspeicher, nicht KB), dies für einige Komponenten möglich ist, wenn Sie genügend Zeit und Mühe haben. Das Testen des Pin-Lese-Codes durch Verspotten der Pins ist ... ähm ... nicht sehr aussagekräftig. Wenn Sie Ihre Logik ausreichend getrennt haben, können Sie die Logik an anderer Stelle testen.

FWIW, ich kaufe TDD im Allgemeinen nicht - es funktioniert gut für Systemstapel, die groß genug sind und über genügend Ressourcen mit genügend deterministischem Verhalten verfügen. Abgesehen davon scheint es keine vernünftige Praxis zu sein.

Paul Nathan
quelle