"Code abgedeckt" vs. "Code getestet"?

Beim Konvertieren meines aktuellen Code-Projekts in TDD ist mir etwas aufgefallen.

class Foo {
    public event EventHandler Test;

    public void SomeFunction() {
        //snip...
        Test(this, new EventArgs());
    }
}

Ich kann zwei Gefahren erkennen, wenn ich diesen Code teste und mich auf ein Code-Coverage-Tool verlasse, um festzustellen, ob Sie über genügend Tests verfügen.

Sie sollten testen, ob dieTest Ereignis wird ausgelöst. Tools für die Codeabdeckung allein sagen Ihnen nichts, wenn Sie dies vergessen.Ich komme gleich zum anderen.

Zu diesem Zweck habe ich meiner Startfunktion einen Ereignishandler hinzugefügt, der so aussieht:

Foo test;
int eventCount;

[Startup] public void Init() {
    test = new Foo();
    // snip...
    eventCount = 0;
    test.Test += MyHandler;
}

void MyHandler(object sender, EventArgs e) { eventCount++; }

Jetzt kann ich einfach nachschaueneventCount um zu sehen, wie oft meine Veranstaltung aufgerufen wurde, wenn sie aufgerufen wurde. Ziemlich ordentlich. Erst jetzt haben wir einen heimtückischen kleinen Fehler durchgelassen, der von keinem Test erfasst werden kann:SomeFunction() Überprüft nicht, ob das Ereignis über Handler verfügt, bevor versucht wird, es aufzurufen. Dies führt zu einer Null-Dereferenzierung, die von keinem unserer Tests abgefangen wird, da allen standardmäßig ein Ereignishandler zugeordnet ist. Ein Tool für die Codeabdeckung meldet jedoch weiterhin die vollständige Abdeckung.

Dies ist nur mein "Beispiel aus der realen Welt", aber mir fällt auf, dass noch viel mehr dieser Fehler durchrutschen können, auch wenn Ihr Code zu 100% "abgedeckt" ist, was immer noch nicht zu 100% getestet ist . Sollten wir die von einem solchen Tool gemeldete Abdeckung beim Schreiben von Tests mit einem Körnchen Salz nehmen? Gibt es andere Arten von Werkzeugen, die diese Löcher fangen könnten?

Antworten auf die Frage(7)

Ihre Antwort auf die Frage