Wie funktionieren Code Coverage Tools in verschiedenen Sprachen?

9

Die meisten etablierten Sprachen verfügen über solide Testberichterstattungs-Tools, die Funktionalität ist jedoch sehr unterschiedlich.

Auch haben die verschiedenen VMs und Compiler eine derart heterogene Struktur, dass das Schreiben eines Code-Coverage-Tools in C ein sehr unterschiedlicher Job sein muss als beispielsweise in Lisp.

  • Python hat sys.settrace , um dir direkt mitzuteilen, welche Zeilen ausgeführt werden
  • Clover (für Java) verwendet einen eigenen Compiler und fügt Debug-Metadaten hinzu (das letzte Mal, als ich es benutzt habe)
  • Emma (für Java) hat einen ClassLoader, der Bytecode im laufenden Betrieb neu schreibt
  • COVER (für Lisp) hat einen Annotation Pass, um den Code
  • zu instrumentieren

Ich bin an der Implementierung der Codeabdeckung für verschiedene Sprachen interessiert:

  1. Was sind die wichtigsten Ansätze, um zu C0 Berichterstattung zu gelangen, wo Sie verfolgen können, welche Zeilen von Code wurde ausgeführt? Ich erwähne oben native VM-Introspektion und statische und dynamische Code-Instrumentierung - gibt es andere Methoden?

  2. Die Suche nach aufklärerischeren Daten wie C1 oder C2 scheint eine sprachunabhängige Aufgabe zu sein verglichen mit C0. Ist Smacks von großen Karnaugh Karte Manipulation für mich; Gibt es Best Practices, wie man es wirklich macht? Verwenden modernere Logiktechniken wie Unschärfe eine Rolle?

  3. Ein viel übersehener Aspekt der Testabdeckung ist die Anzeige der Ergebnisse an den Programmierer, der mit den C1- und C2-Daten immer schwerer wird. Ehrlich gesagt, obwohl sie die Aufgabe für C0 erledigen, bin ich von den meisten Testberichterstattungsschnittstellen nicht begeistert; Welche neuartigen und intuitiven Schnittstellen haben Sie für Coverage-Daten gesehen?

James Brady 18.01.2009, 12:24
quelle

3 Antworten

6

Im Wesentlichen instrumentieren alle Code-Coverage-Tools den Code, um zu überprüfen, welche Teile des Codes ausgeführt wurden.

Wie in dem von Ihnen angegebenen Link definiert, sind C0 und C1 vom Standpunkt der Person, die die Instrumentierung schreibt, ziemlich ähnlich. Der einzige Unterschied ist, wo Sie den Code platzieren. Ich werde weiter spekulieren, dass C1 noch einfacher ist als C0, weil die Instrumentierung auf der, sagen wir, abstrakten Syntaxebene stattfindet, wo die Zeilenenden nicht sehr zählen.

Ein weiterer Grund, warum ich sage, dass C1 einfacher ist, ist, dass es sich mit syntaktischen Entitäten im Gegensatz zu lexikalischen Entitäten befasst: Wie würdest du instrumentieren:

%Vor%

Nun, nur ein Gedanke.

Was C2 angeht, habe ich es nie in der Praxis gesehen. Der Grund dafür ist, dass Sie einen exponentiellen Anstieg bekommen können:

%Vor%

Für n Codezeilen benötigen Sie 2 ^ n Tests. Was machst du auch für Schleifen? In der Regel abstrahieren Sie sie als einfache if-Anweisungen (d. H. Für jede Schleife, die Sie testen, dass ihr Körper 0 Mal für einen Test und mindestens einmal in einem anderen Test ausgeführt wurde).

Ich glaube, das Sampling des PC ist eine besonders schreckliche Art, Code Coverage zu machen, weil Sie einige Anweisungen verpassen können, weil sie zu schnell ausgeführt haben. D Das Gleiche gilt für Fuzzy-Logik, die verwendet wird, um Annäherungen zu begründen; Normalerweise möchten Sie, dass Ihre Codeabdeckung deterministisch ist.

Karnaugh-Maps werden zum Minimieren boolescher Funktionen verwendet, und ich sehe keinen nützlichen Link zu Code-Coverage-Tools.

Auch Ihre Frage ist manchmal nicht sehr klar: Wollen Sie Techniken, um eine bessere Codeabdeckung zu erreichen, oder interessiert Sie nur die Implementierung von Code-Coverage-Tools?

    
user51568 21.01.2009, 10:47
quelle
0

Eine Methode, die mit praktisch jeder Sprache funktioniert, ist das Einfügen von Instrumenten Verwenden eines Programmtransformationssystems.

Ein technisches Dokument hier gefunden: Ссылка erklärt, wie dies im Allgemeinen durchgeführt werden kann.

Meine Firma Semantic Designs bietet eine große Auswahl an Tools zur Testabdeckung die bieten, was oben als C1-Abdeckung bezeichnet wird (z. B. "Zweigabdeckung") also ja ist häufig gemacht), für verschiedene Sprachen (C, C ++, C #, Java, COBOL, PHP, alles in mehreren Dialekte). Siehe www.semdesigns.com/Products/TestCoverage/index.html

    
Ira Baxter 14.06.2009 04:06
quelle
-2

In .NET sollten Sie vorzugsweise die .NET Profiling-API verwenden , die im Grunde eine Reihe von gemeinsamen Punkten in der CLR selbst bietet.

    
Romain Verdier 18.01.2009 13:00
quelle