J'écris un xslt pour le fichier trx de mstest.
En plus de connaître les résultats de toute la session, j'aimerais aussi connaître le nombre de réussites et d'échecs pour chaque cours.
J'ai essayé de nombreuses façons, mais je ne suis pas capable d'obtenir les résultats pour une classe particulière.
Voici à quoi ressemble le fichier XML.tests de regroupement basés sur la classe dans le rapport mstest en utilisant xsl
(modifier)
<TestRun>
<ResultSummary outcome="Completed">
<Counters total="2" passed="2" error="0" failed="0" inconclusive="0" />
</ResultSummary>
<TestDefinitions>
<UnitTest name="NullUserIdInConstructor" id="e58f837c-2116-ce69-bf31-1fe6beec73d3">
<TestMethod className="TestProject1.Test.LogonInfoTest, TestProject1.Test" name="NullUserIdInConstructor" />
</UnitTest>
<UnitTest name="LogonInfoConstructorTest" id="b9bbb3b6-cc0b-7f4d-276e-16c52b0814c6">
<TestMethod className="TestProject1.Test.LogonInfoTest, TestProject1.Test" name="LogonInfoConstructorTest" />
</UnitTest>
</TestDefinitions>
<Results>
<UnitTestResult testId="b9bbb3b6-cc0b-7f4d-276e-16c52b0814c6" testName="LogonInfoConstructorTest" outcome="Passed" >
</UnitTestResult>
<UnitTestResult testId="e58f837c-2116-ce69-bf31-1fe6beec73d3" testName="NullUserIdInConstructor" outcome="Passed" >
</UnitTestResult>
</Results>
</TestRun>
Voici un échantillon de la puissance requise.
<table>
<tr>
<td>Test Name</td>
<td>Result</td>
<td>Duration</td>
<td>Passed</td>
<td>Failed</td>
<td>Inconclusive</td>
</tr>
<tr>
<td colspan="3">This is the Class Name</td>
<td>2</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>LogonInfoConstructorTest</td>
<td>Passed</td>
<td>00:00:00.0234997</td>
</tr>
<tr>
<td>NullUserIdInConstructor</td>
<td>Passed</td>
<td>00:00:00.0047344</td>
</tr>
</table>
Je reçois le className
attribut de //UnitTest/TestMethod
, obtenir le correspoding id
de //UnitTest
et correspondant puis avec //UnitTestResult[@testId]
pour obtenir la valeur correspondante de l'attribut outcome
. Mais je ne suis pas capable d'accomplir mon exigence. Je ne suis pas sûr d'où je vais mal.
Cet exemple a seulement 1 classe. mais le fichier sur lequel je travaille a beaucoup de cours.
Merci d'avance.
(edit2) Voici une partie de la xsl que j'utilise actuellement.
<xsl:key name="class-key" match="@className" use="."/>
<xsl:key name="class" match="t:TestMethod" use="@className"/>
<xsl:key name="result" match="t:UnitTestResult" use="@testName"/>
<xsl:variable name="unique-classes" select="//t:TestMethod/@className[generate-id(.)=generate-id(key('class-key',.))]" />
<xsl:template name="details2">
<h3>Unit Test Results</h3>
<table>
<tr>
<td></td>
<td>Test Name</td>
<td>Result</td>
<td>Duration</td>
</tr>
<xsl:for-each select="$unique-classes">
<xsl:sort />
<xsl:variable name="curClass" select="."/>
<xsl:variable name="parentId" select="generate-id(./..)" />
<xsl:variable name="currentId" select="generate-id(.)" />
<tr id="{$parentId}">
<td id="{$currentId}"
style="font-weight:bold; cursor:pointer;"
onClick="toggleDetail(this)">[+]</td>
<xsl:call-template name="groups" />
</tr>
<xsl:call-template name="classRunsDetail">
<xsl:with-param name="curClass" select="."/>
</xsl:call-template>
<tr id="{$currentId}-end" style="display:none;">
<td style="border-bottom:0px solid black;height:1px;background-color:black" colspan="4"></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template name="classRunsDetail">
<xsl:param name="curClass"/>
<xsl:variable name="parentId" select="generate-id(.)" />
<xsl:for-each select="//t:UnitTest/t:TestMethod[@className=$curClass]">
<xsl:sort select="@name"/>
<xsl:variable name="testid" select="../@id"/>
<xsl:for-each select="//t:UnitTestResult[@testId=$testid]">
<tr id="{$parentId}">
<td></td>
<td>
<xsl:value-of select="@testName"/>
</td>
<td>
<xsl:choose>
<xsl:when test="@outcome = $fail">FAILED</xsl:when>
<xsl:when test="@outcome = $pass">Passed</xsl:when>
<xsl:when test="@outcome = $incon">Not Run</xsl:when>
<xsl:otherwise>Error</xsl:otherwise>
</xsl:choose>
</td>
<td>
<xsl:value-of select="@duration"/>
</td>
</tr>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<xsl:template name="groups" match="t:TestMethod[count(.|key('class',@className)[1])=1]">
<xsl:variable name="result" select="key('result',key('class',@className)/@name)"/>
<td valign="bottom" style="background-color:beige;font-weight:bold;" colspan="3">
<xsl:value-of select="key('class', @className)[1]"/>
</td>
<td>
<xsl:value-of select="count($result[@outcome='Passed'])"/>
</td>
<td>
<xsl:value-of select="count($result[@outcome='Failed'])"/>
</td>
<td>
<xsl:value-of select="count($result[@outcome='Inconclusive'])"/>
</td>
<xsl:apply-templates select="key('class',@className)" mode="sub"/>
</xsl:template>
Désolé pour l'énorme entrée de code. Mais j'utilise en fait javascript pour faire glisser les noms des tests quand on clique sur une classe particulière. J'ai donc besoin de tant de modèles. Est-ce que je manque quelque chose dans le code ..
Si vous voulez vraiment que quelqu'un vous réponde, vous devez fournir un exemple très simple (pas plus de 20 lignes) et aussi fournir votre sortie désirée. –
Je peux imaginer en lisant votre explication que cette tâche peut être accomplie facilement avec des clés (car il y a des références croisées ici.) Si vous pouviez fournir un petit exemple de la structure du document d'entrée (sans les attributs qui ne sont pas nécessaires pour cela transformation, par exemple) et un exemple de document de sortie, nous pouvons vous donner un exemple de feuille de style complète. –
J'ai modifié la question avec un exemple d'entrée et un exemple de sortie. J'ai essayé d'utiliser des clés. Mais peut-être que je les utilisais mal. Votre aide est tres apprecie. Merci beaucoup. – Sidd