2010-06-23 5 views
0

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 ..

+0

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. –

+0

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. –

+0

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

Répondre

0

Cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output indent="yes"/> 
    <xsl:key name="class" match="TestMethod" use="@className"/> 
    <xsl:key name="result" match="UnitTestResult" use="@testName"/> 

    <xsl:template match="/"> 
    <table> 
     <tr> 
     <td>Test Name</td> 
     <td>Result</td> 
     <td>Duration</td> 
     <td>Passed</td> 
     <td>Failed</td> 
     <td>Inconclusive</td> 
     </tr> 
     <xsl:apply-templates/> 
    </table> 
    </xsl:template> 

    <xsl:template match="TestMethod[count(.|key('class',@className)[1])=1]"> 
     <xsl:variable name="result" select="key('result',key('class',@className)/@name)"/> 
     <tr> 
     <td colspan="3"><xsl:value-of select="@className"/></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> 
     </tr> 
     <xsl:apply-templates select="key('class',@className)" mode="sub"/> 
    </xsl:template> 

    <xsl:template match="TestMethod" mode="sub"> 
     <tr> 
     <td><xsl:value-of select="@name"/></td> 
     <td><xsl:value-of select="key('result',@name)/@outcome"/></td> 
     <td>Not in sample</td> 
     </tr> 
    </xsl:template> 

</xsl:stylesheet> 

Résultat:

<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">TestProject1.Test.LogonInfoTest, TestProject1.Test</td> 
<td>2</td> 
<td>0</td> 
<td>0</td> 
</tr> 
<tr> 
<td>NullUserIdInConstructor</td> 
<td>Passed</td> 
<td>Not in sample</td> 
</tr> 
<tr> 
<td>LogonInfoConstructorTest</td> 
<td>Passed</td> 
<td>Not in sample</td> 
</tr> 
</table> 

Remarque: méthode Muenchian pour obtenir chaque className (j'ai utilisé pour faire en template/@match, mais aujourd'hui, il semble que je ne peux pas!) Et l'utilisation d'un ensemble de nœuds pour key() secondes argument. Modifier: Je l'ai eu! Il semble que je ne savais pas assez sur les modèles, modèles intégrés et la priorité ...

Edit2: Pour le premier document d'entrée

<TestRun id="41242257-adae-4e41-b860-f102021e93c8" name="[email protected] 2010-06-09 10:13:57" runUser="AMERICAS\muthuras" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2006"> 
    <ResultSummary outcome="Warning"> 
     <Counters total="3" executed="3" passed="3" error="0" failed="0" timeout="0" aborted="0" inconclusive="0" passedButRunAborted="0" notRunnable="0" notExecuted="0" disconnected="0" warning="0" completed="0" inProgress="0" pending="0" /> 
     <RunInfos> 
      <RunInfo computerName="SMUTHURAJA2" outcome="Warning" timestamp="2010-06-09T10:13:59.6365402-04:00"> 
       <Text>Code coverage instrumentation warning while processing file ClassLibrary1.dll: Warning VSP2013 : Instrumenting this image requires it to run as a 32-bit process. The CLR header flags have been updated to reflect this.</Text> 
      </RunInfo> 
     </RunInfos> 
    </ResultSummary> 
    <Times creation="2010-06-09T10:13:57.3115402-04:00" queuing="2010-06-09T10:14:00.1315402-04:00" start="2010-06-09T10:14:00.3665402-04:00" finish="2010-06-09T10:14:02.2425402-04:00" /> 
    <TestDefinitions> 
     <UnitTest name="EmptyUserIdInConstructor" storage="c:\users\muthuras\documents\visual studio 2008\projects\classlibrary1\testproject1.test\bin\debug\testproject1.test.dll" id="eeffb9fe-2a08-9a88-c3c9-3008a9aeeb50"> 
      <Css projectStructure="" iteration="" /> 
      <Owners> 
       <Owner name="" /> 
      </Owners> 
      <Execution id="ec93c5dc-afbb-41b6-81a1-157d39286eca" /> 
      <TestMethod codeBase="C:\Users\muthuras\Documents\Visual Studio 2008\Projects\ClassLibrary1\TestProject1.Test\bin\Debug\TestProject1.Test.dll" adapterTypeName="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestAdapter, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.Adapter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" className="TestProject1.Test.LogonInfoTest, TestProject1.Test" name="EmptyUserIdInConstructor" /> 
     </UnitTest> 
     <UnitTest name="NullUserIdInConstructor" storage="c:\users\muthuras\documents\visual studio 2008\projects\classlibrary1\testproject1.test\bin\debug\testproject1.test.dll" id="e58f837c-2116-ce69-bf31-1fe6beec73d3"> 
      <Css projectStructure="" iteration="" /> 
      <Owners> 
       <Owner name="" /> 
      </Owners> 
      <Execution id="4ef585f1-02e0-4eb3-b291-29fa7b02d9e6" /> 
      <TestMethod codeBase="C:\Users\muthuras\Documents\Visual Studio 2008\Projects\ClassLibrary1\TestProject1.Test\bin\Debug\TestProject1.Test.dll" adapterTypeName="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestAdapter, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.Adapter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" className="TestProject1.Test.LogonInfoTest, TestProject1.Test" name="NullUserIdInConstructor" /> 
     </UnitTest> 
     <UnitTest name="LogonInfoConstructorTest" storage="c:\users\muthuras\documents\visual studio 2008\projects\classlibrary1\testproject1.test\bin\debug\testproject1.test.dll" id="b9bbb3b6-cc0b-7f4d-276e-16c52b0814c6"> 
      <Css projectStructure="" iteration="" /> 
      <Owners> 
       <Owner name="" /> 
      </Owners> 
      <Execution id="fca1597d-5011-4d16-965b-afaa9d81ee4e" /> 
      <TestMethod codeBase="C:\Users\muthuras\Documents\Visual Studio 2008\Projects\ClassLibrary1\TestProject1.Test\bin\Debug\TestProject1.Test.dll" adapterTypeName="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestAdapter, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.Adapter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" className="TestProject1.Test.LogonInfoTest, TestProject1.Test" name="LogonInfoConstructorTest" /> 
     </UnitTest> 
    </TestDefinitions> 
    <TestLists> 
     <TestList name="Results Not in a List" id="8c84fa94-04c1-424b-9868-57a2d4851a1d" /> 
     <TestList name="All Loaded Results" id="19431567-8539-422a-85d7-44ee4e166bda" /> 
    </TestLists> 
    <TestEntries> 
     <TestEntry testId="b9bbb3b6-cc0b-7f4d-276e-16c52b0814c6" executionId="fca1597d-5011-4d16-965b-afaa9d81ee4e" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" /> 
     <TestEntry testId="e58f837c-2116-ce69-bf31-1fe6beec73d3" executionId="4ef585f1-02e0-4eb3-b291-29fa7b02d9e6" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" /> 
     <TestEntry testId="eeffb9fe-2a08-9a88-c3c9-3008a9aeeb50" executionId="ec93c5dc-afbb-41b6-81a1-157d39286eca" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d" /> 
    </TestEntries> 
    <Results> 
     <UnitTestResult executionId="fca1597d-5011-4d16-965b-afaa9d81ee4e" testId="b9bbb3b6-cc0b-7f4d-276e-16c52b0814c6" testName="LogonInfoConstructorTest" computerName="SMUTHURAJA2" duration="00:00:00.0234997" startTime="2010-06-09T10:14:00.8325402-04:00" endTime="2010-06-09T10:14:01.3215402-04:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d"> 
      <Output /> 
     </UnitTestResult> 
     <UnitTestResult executionId="4ef585f1-02e0-4eb3-b291-29fa7b02d9e6" testId="e58f837c-2116-ce69-bf31-1fe6beec73d3" testName="NullUserIdInConstructor" computerName="SMUTHURAJA2" duration="00:00:00.0047344" startTime="2010-06-09T10:14:01.3235402-04:00" endTime="2010-06-09T10:14:01.3305402-04:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d"> 
      <Output /> 
     </UnitTestResult> 
     <UnitTestResult executionId="ec93c5dc-afbb-41b6-81a1-157d39286eca" testId="eeffb9fe-2a08-9a88-c3c9-3008a9aeeb50" testName="EmptyUserIdInConstructor" computerName="SMUTHURAJA2" duration="00:00:00.0005633" startTime="2010-06-09T10:14:01.3315402-04:00" endTime="2010-06-09T10:14:01.3345402-04:00" testType="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b" outcome="Passed" testListId="8c84fa94-04c1-424b-9868-57a2d4851a1d"> 
      <Output /> 
     </UnitTestResult> 
    </Results> 
</TestRun> 

Vous avez besoin de quelques modifications mineures.Avec cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:test="http://microsoft.com/schemas/VisualStudio/TeamTest/2006" exclude-result-prefixes="test"> 
    <xsl:output indent="yes"/> 
    <xsl:key name="class" match="test:TestMethod" use="@className"/> 
    <xsl:key name="result" match="test:UnitTestResult" use="@testName"/> 
    <xsl:template match="text()"/> 
    <xsl:template match="/"> 
     <table> 
      <tr> 
       <td>Test Name</td> 
       <td>Result</td> 
       <td>Duration</td> 
       <td>Passed</td> 
       <td>Failed</td> 
       <td>Inconclusive</td> 
      </tr> 
      <xsl:apply-templates/> 
     </table> 
    </xsl:template> 
    <xsl:template match="test:TestMethod[count(.|key('class',@className)[1])=1]"> 
     <xsl:variable name="result" select="key('result',key('class',@className)/@name)"/> 
     <tr> 
      <td colspan="3"> 
       <xsl:value-of select="@className"/> 
      </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> 
     </tr> 
     <xsl:apply-templates select="key('class',@className)" mode="sub"/> 
    </xsl:template> 
    <xsl:template match="test:TestMethod" mode="sub"> 
     <tr> 
      <td> 
       <xsl:value-of select="@name"/> 
      </td> 
      <td> 
       <xsl:value-of select="key('result',@name)/@outcome"/> 
      </td> 
      <td> 
       <xsl:value-of select="key('result',@name)/@duration"/> 
      </td> 
     </tr> 
    </xsl:template> 
</xsl:stylesheet> 

Vous obtenez ce résultat:

<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">TestProject1.Test.LogonInfoTest, TestProject1.Test</td> 
<td>3</td> 
<td>0</td> 
<td>0</td> 
</tr> 
<tr> 
<td>EmptyUserIdInConstructor</td> 
<td>Passed</td> 
<td>00:00:00.0005633</td> 
</tr> 
<tr> 
<td>NullUserIdInConstructor</td> 
<td>Passed</td> 
<td>00:00:00.0047344</td> 
</tr> 
<tr> 
<td>LogonInfoConstructorTest</td> 
<td>Passed</td> 
<td>00:00:00.0234997</td> 
</tr> 
</table> 

Remarque: L'utilisation de l'espace de noms dans les modèles (Votre premier document d'entrée est un espace de noms par défaut, mais pas votre deuxième échantillon). J'ai trouvé vos données de durée dans votre première entrée. Vous devez filtrer les nœuds de texte (il n'y en avait pas dans votre première entrée)

+0

@Alejandro: Merci. C'est très utile. Mais les clés ne semblent pas retourner quoi que ce soit pour moi. Pourriez-vous s'il vous plaît me dire ce que cela fait exactement? TestMethod [count (. | Key ('class', @ className) [1]) = 1] – Sidd

+0

@Sidd: Avez-vous exécuté cette transformation? Quel était le résultat? 'TestMethod [count (. | Key ('class', @ className) [1]) = 1]' signifie: Un élément 'TestMethod' pour lequel renvoie un résultat résultant du comptage de l'union de lui-même avec le premier élément 'TestMethod 'qui a une valeur de clé égale à l'attribut' className' de l'élément donné. En d'autres termes: le premier 'TestMethod' avec une telle valeur de clé. –

+0

@Alejandro: J'ai eu 0 dans toutes mes colonnes. J'ai essayé de changer les espaces de noms pour les éléments et je n'arrive toujours pas à obtenir les nombres corrects. – Sidd

0

Ne connaissant pas la sortie exacte que vous voulez, la feuille de style suivant correspond aux critères décrits:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:tt="http://microsoft.com/schemas/VisualStudio/TeamTest/2006"> 
<xsl:output method="xml" indent="yes" /> 
    <xsl:template match="/"> 
     <tests> 
      <xsl:apply-templates select="//tt:UnitTest"/> 
     </tests> 
    </xsl:template> 

    <xsl:template match="tt:UnitTest"> 
     <xsl:variable name="id" select="@id" /> 
     <test> 
      <className> 
       <xsl:value-of select="tt:TestMethod/@className"/> 
      </className> 
      <outcome> 
       <xsl:value-of select="//tt:UnitTestResult[@testId=$id]/@outcome"/> 
      </outcome> 
     </test> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

et génère la sortie exemple suivant:

<?xml version="1.0" encoding="UTF-8"?> 
<tests xmlns:tt="http://microsoft.com/schemas/VisualStudio/TeamTest/2006"> 
    <test> 
     <className>TestProject1.Test.LogonInfoTest, TestProject1.Test</className> 
     <outcome>Passed</outcome> 
    </test> 
    <test> 
     <className>TestProject1.Test.LogonInfoTest, TestProject1.Test</className> 
     <outcome>Passed</outcome> 
    </test> 
    <test> 
     <className>TestProject1.Test.LogonInfoTest, TestProject1.Test</className> 
     <outcome>Passed</outcome> 
    </test> 
</tests> 
+0

Je suis désolé. Je veux calculer le nombre de tests réussis et échoués pour chaque classe. Ma sortie finale affiche une liste de classes avec le nombre correspodant de tests réussis et échoués. En cliquant sur la classe donnerait plus de détails sur les tests. – Sidd

Questions connexes