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:
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.
und die beiden keys:
Und rauskommen sollte schlussendlich dann sowas wie:
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.
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>
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>
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"/>
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
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.
Comment