Pimp your NAV 2013: Code Coverage in 30 Minuten nachrüsten

Pimp your NAV 2013: Code Coverage in 30 Minuten nachrüsten

Rate This
  • Comments 2

Seit meinem letzten Post ist – fiel mir plötzlich auf - bereits einige Zeit ins Land gegangen. Die letzten Wochen und Monate waren geprägt von der Dynamics NAV 2013 Roadshow in Köln, Hamburg und Stuttgart, Arbeit, weiteren Vorträgen, einem langen Urlaub, noch mehr Arbeit, aber letztendlich viel Spaß, vielen netten Kontakten und einer großflächigen Begeisterung für den jüngsten Spross in der Dynamics NAV-Familie, auch wenn dieser noch etwas reifen muss.

Dabei zeigt sich dann aber auch, dass im Hinblick auf liegen gebliebene Arbeit, 24 Stunden für einen Tag einfach viel zu wenig sind. Wer hat sich so eine Einteilung blos ausgedacht?

Eine Ahnung, dass ich wieder ins Schwafeln komme, steigt in mir hoch, deshalb nun zum Thema: Bau dir dein Code Coverage selbst, in 30 Minuten. Warum? Nun, nicht weil Microsoft das nicht als Download anbieten wird, das ist durchaus geplant. Sondern einfach weil es Spaß macht, sinnvoll ist, derzeit noch nicht verfügbar ist und weil ich es auf der Roadshow versprochen habe. Ich gebe zu, es ist wirklich viel Zeit seitdem ins Land gegangen…

Wer in Dynamics NAV 2013 bereits den Object Designer bzw. das C/AL Symbol Menu geöffnet hat, dem wird aufgefallen sein, dass sich unter SYSTEM.Code Coverage etwas getan hat, sprich 3 Befehle zum Code Coverage-Handling dazu gekommen sind.

Ich möchte nicht auf die Befehle im Einzelnen eingehen, diese werden wir, spätestens zur allgemeinen Verfügbarkeit von Dynamics NAV 2013, in der Entwickler-Hilfe erläutern. Aber den Befehl CODECOVERAGELOG möchte ich kurz erwähnen:

[IsActive :=] CODECOVERAGELOG([NewIsActive] [, MultiSession])
IsActive gibt den aktuellen Status des Code Coverage an, ob es aktuell läuft oder nicht.
NewIsActive ist ein neuer Status, dient also zum ein- und ausschalten.
MultiSession, tja, was das wohl bedeutet? Neben der aktuellen Session, der also aus der Code Coverage aktiviert wurde, können auch alle anderen auf dem Client laufenden Sitzungen zusätzlich erfasst werden. Sehr cool!

Den Befehl gab es in abgespeckter Version bereits in älteren Releases, allerdings musste man sich nicht wirklich darum kümmern, da Code Coverage zum eingebauten Repertoire des Classic Client gehörte. In Dynamics NAV 2013 hat sich allerdings einiges verändert. Auch unser geliebter Debugger ist als Applikation in den Windows Client gewandert, ebenfalls unterstützt durch C/AL Befehle. Die Möglichkeiten, die sich dadurch ergeben, sind erschreckend vielfältig:

 

 image

 

Aber nun zurück zum Code Coverage. Es geht los: Schnell die Page 50020 “Code Coverage” erstellt:

  • SourceTable=Code Coverage
  • SourceTableTemporary=Yes
  • PageType=List
  • InsertAllowed=No
  • ModifyAllowed=No
  • DeleteAllowed=No

 

Einige Variablen zum spielen:

image

 

Von der virtuellen Tabelle Code Coverage werden nur die zwei Felder Line und “No. of Hits” benötigt. “No. of Hits” wird zur Berechnung des Hit Ratio herangezogen.

image 

 

Nun folgt noch die wichtigste Zutat: Die Funktion Process(). Bestehend aus zwei lokalen Variablen und den folgenden Quellcode:

 

image

 

 

Process()
AllHits := 0;
TempCodeCoverage.RESET;
TempCodeCoverage.DELETEALL;
 
IF CodeCoverage.FINDSET THEN REPEAT
  
  IF NOT TempCodeCoverage.GET(CodeCoverage."Object Type", CodeCoverage."Object ID", 0) THEN BEGIN
    TempCodeCoverage.TRANSFERFIELDS(CodeCoverage);
    TempCodeCoverage.INSERT;
  END;
 
  TempCodeCoverage."No. of Hits" := TempCodeCoverage."No. of Hits" + CodeCoverage."No. of Hits";
  TempCodeCoverage.MODIFY;
 
  AllHits := AllHits + CodeCoverage."No. of Hits";
UNTIL CodeCoverage.NEXT = 0;
 
RESET;
DELETEALL;
 
IF TempCodeCoverage.FINDSET THEN REPEAT
  TempCodeCoverage."No. of Hits" := (ROUND(TempCodeCoverage."No. of Hits" / AllHits * 100, 0.01) * 100);
  TempCodeCoverage.MODIFY;
  Rec := TempCodeCoverage;
  INSERT;
UNTIL TempCodeCoverage.NEXT = 0;
  

Wie man sieht wird hier das Code Coverage selbst ausgelesen und in die temporäre Instanz übertragen. Über die Menge an Hits insgesamt wird bei der zweiten Übertragung in den Page-Record das Verhältnis ermittelt. Multiliziert mit 100, da “No. of Hits” ein Integer-Feld ist und die Anzeige des HitRatio im OnAfterGetRecord() Trigger durch Division wieder angeglichen wird. Damit ergibt sich (abgesehen von kleinen Rundungsfehlern, die aber hier keine Rolle spielen) dann ein prozentualer Anteil an Treffern.

Dementsprechend wird die Page 50020 noch vervollständigt:

image

 

Abschließend benötigen wir natürlich noch einige Actions zum Starten und Beenden des Code Coverage und auch zur Anzeige des Quellcode:

image

 

Alle drei Actions sind nach dem gleichen Schema aufgebaut (Images: Start, Stop, DesignCodeBehind) und enthalten den folgenden kurzen Quellcode:

 

image

 

Achtung: Die Page “Code Coverage Log” die hier aufgerufen wird, erstellen wir nun. Ich habe es der Einfachheit halber aber schon einmal aufgeführt.

 

image

 

Zwei Felder, die Zeilennr. und die Zeile, nebst einer Text-Variable. Man beachte die fehlende Länge, das ist ein neues Feature, wir benötigen für Text-Variablen keine explizite Längenangabe mehr!

 

image

Die beiden Felder haben die Variable LineStyle als Quelle. Hierbei handelt es sich ebenfalls um ein neues Feature in Dynamics NAV 2013. Die Angabe der StyleExpr ohne den Style anzugeben. StyleExpr kann nun auch direkt einer der Stile sein, die im Dropdown unter Style zu sehen sind:

 

image

 

Im Windows Client sehen die verschiedenen Stile aus, wie im folgenden Bild zu sehen. Beachten Sie auch die Hilfe für die Eigenschaft:

image

 

Dementsprechend sieht der Quellcode des OnAfterGetRecord() Triggers der Page folgendermaßen aus:

LineStyle := 'None';
 
CASE TRUE OF
  "Line Type" = "Line Type"::Object: LineStyle := 'Strong';
  "Line Type" = "Line Type"::"Trigger/Function": LineStyle := 'StrongAccent';
  ("Line Type" = "Line Type"::Code) AND ("No. of Hits" = 0): LineStyle := 'Ambiguous';
  ("Line Type" = "Line Type"::Empty): LineStyle := 'Ambiguous';
END;

 

30 Minuten, oder auch etwas mehr oder weniger, sind nun um, Code Coverage ist damit aber implementiert. Natürlich gilt: Man kann immer etwas besser machen. Also Erweiterungen (Stichwort: MultiSession) sind immer gewünscht. Aktuell sieht die Lösung aus wie unten zu sehen, den Quellcode habe ich an den Artikel angehängt.

Einfacher schwarzer Text ist übrigens durchlaufen worden Smile

 

image

 

Viel Spaß mit Dynamics NAV 2013 und den neuen Möglichkeiten. Bald, September/Oktober, kommt das neue Release!

 

Carsten Scholling

Microsoft Dynamics Germany
Microsoft Customer Service und Support (CSS) EMEA

Email: cschol@microsoft.com
Microsoft Connect: http://connect.microsoft.com
Online Support: http://www.microsoft.com/support
Sicherheitsupdates: http://www.microsoft.de/sicherheit

Microsoft Deutschland GmbH
Konrad-Zuse-Straße 1
D-85716 Unterschleißheim
http://www.microsoft.de

Attachment: nav2013codecoverage.zip
Leave a Comment
  • Please add 7 and 4 and type the answer here:
  • Post
  • Moin,

    zum Download freigegebene Datei ist unvollständig.

    Sie lässt sich so nicht einlesen.

    Die Hälfte der Page fehlt.

    Homer

  • Servus Homer,

    ich habe eine neue Version hochgeladen, bei der alten fehlte aus mir unbekannten Gründen das Ende des Objekts.

    Gruß,

    Carsten Scholling

Page 1 of 1 (2 items)