Announcement

Collapse
No announcement yet.

2-fach gruppieren mit sortieren und filtern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 2-fach gruppieren mit sortieren und filtern

    Wir haben hier einen BuildServer laufen und ich bin gerade dabei die Stylefiles für unsere MsTest-Ergebnisse anzupassen. Dabei ist die Anforderung, dass die Erbenisse nach Testausgang (failed, inconclusive, passed) gefilter, gruppiert und sortiert, dann nach testcontainer (= storage) gruppiert und sortiert und schließlich nach Testname sortiert werden sollen. Ich habe mich schon eingehend mit der Muench'schen Methode befasst, habe aber nun nach mehreren Tagen resigniert. Vielleicht kann mir ja einer von euch helfen.

    Der Grundaufbau der Ergebnis-Files ist wie folgt:
    Code:
    <TestRun id="someGUID" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2006">
     <TestRunConfiguration name="..." id="...">
      <someMoreTags />
      <someMoreTags />
     </TestRunConfiguration>
    
     <TestDefinitions>
      <UnitTest name="testName" storage="DllContainingTheTest.dll" id="uniqueTestId">
      </UnitTest>
      <ManyMoreUnitTestDefinitions />
     </TestDefinitions>
    
     <Results>
      <UnitTestResult testId="uniqueTestId" outcome="Failed">
      </UnitTestResult>
      <ManyMoreUnitTestResults />
     </Results>
    
    </TestRun>
    Ich habe das File mal auf die wichtigsten Dinge gekürzt, meist sind in einem Tag noch einige andere Attribute oder Child-Nodes möglich.

    Wichtig ist jedoch, dass jeder "UnitTest" einen Namen hat, den Testnamen und eine eindeutige Id, die TestId, außerdem kennt er noch das Attribut storage, was gleichbedeutend ist mit dem testcontainer. Das "UnitTestResult" kennt auch eine TestId anhand deren man es mit einem UnitTest verknüpfen kann, sprich jedes "UnitTestResult" hat genau ein "UnitTest", weiters kennt er noch den outcome, sprich ob der Test fehlgeschlagen ist (Failed), keine eindeutigen Ausgang hat (Inconclusive) oder funktioniert hat (Passed).

    Mein bisheriges xsl-File produziert soweit schon mal eine gute Ausgabe allerdings mit dem kleine Schönheitsfehler, dass die Ausgabe so oft redundant ist, wie es fehlgeschlagene Test pro Testcontainer (= storage) gibt. Leider habe ich nur xslt 1.0 (.Net-Framework 2.0) zur Verfügung.

    Code:
    <div id="mstest_failedtests_section">
     <xsl:for-each select="/*[local-name()='TestRun']/*[local-name()='TestDefinitions']/*[local-name()='UnitTest' and count(. | key('UnitTest-by-storage-and-outcome', @storage and /*[local-name()='TestRun']/*[local-name()='Results']/*[local-name()='UnitTestResult' and @testId = current()/@id and @outcome = 'Failed'])[1]) = 1]">
      <xsl:sort select="@storage" data-type="text" lang="de" order="ascending"/>
    
      <xsl:variable name="mstest.test.id" select="concat('mstest_divDetails_', generate-id())" />
      <div class="mstest_testname">
       <a>
        <xsl:attribute name="href">javascript:toggleDiv('<xsl:value-of select="$mstest.test.id" />')
        </xsl:attribute>
        <xsl:value-of select="normalize-space(substring-before(@storage, '.dll'))"/>
       </a>
      </div>
    
      <div class="mstest_testdetail" style="display: none; ">
       <xsl:attribute name="id">
        <xsl:value-of select="$mstest.test.id" />
       </xsl:attribute>
    
       <xsl:for-each select="key('UnitTest-by-storage', @storage)">
        <xsl:sort select="normalize-space(substring-before(*[local-name()='TestMethod']/@className, ','))"/>
    
        <xsl:if test="/*[local-name()='TestRun']/*[local-name()='Results']/*[local-name()='UnitTestResult' and @testId = current()/@id and @outcome = 'Failed']">
    
         <blockquote>
          <xsl:value-of select="normalize-space(substring-before(*[local-name()='TestMethod']/@className, ','))"/>
          <br />
          <xsl:value-of select="@name"/>
         </blockquote>
        </xsl:if>
    
       </xsl:for-each>
      </div>
    
     </xsl:for-each>
    <div>
    und die beiden keys:

    Code:
    <xsl:key name="UnitTest-by-storage-and-outcome" match="/*[local-name()='TestRun']/*[local-name()='TestDefinitions']/*[local-name()='UnitTest']" use="@storage and /*[local-name()='TestRun']/*[local-name()='Results']/*[local-name()='UnitTestResult' and @testId = current()/@id and @outcome = 'Failed']"/>
    
    <xsl:key name="UnitTest-by-storage" match="/*[local-name()='TestRun']/*[local-name()='TestDefinitions']/*[local-name()='UnitTest']" use="@storage"/>
    Und rauskommen sollte schlussendlich dann sowas wie:
    Code:
    Failed
     Testcontainer A
      Unittest AA
      Unittest ABA
      Unittest ADFW
     TestContainer C
      Unittest DCA
      Unittest PUO
    
    Inconclusive
     Testcontainer D
      Unittest UTU
    
    Passed
     Testcontainer Z
      Unittest ACDC
    Ich lege noch ein komplettes Beispiel-File bei, ich hoffe das es nicht zu groß ist.
    Hoffentlich habe ich jetzt alle Klarheiten beseitigt und ihr wisst, an was ich gerade verzweifle.
    Vielen herzlichen Dank schon mal im Vorraus, Daniel

    P.S. Ok, das File war zu groß, ich versuche es noch kleiner zu machen, ohne dass die Struktur oder die Datenintegrität verloren geht, das könnte aber noch ein bischen dauern.
    Zuletzt editiert von 6014808007659607; 11.03.2009, 11:56. Reason: Kommentar hinzugefügt

  • #2
    Hallo!

    Ich wollte nur kurz nachfragen, ob ich noch mit weiteren Details dienen kann, um es euch leichter zu machen, eine Antwort zu finden. Mir würde auch schon reichen, wenn es heißt: no-way - es geht einfach nicht.


    Vielen herzlichen Dank, Daniel Ziegenberg

    Comment

    Working...
    X