Я пишу xslt для trx-файла mstest.
Помимо информации о результатах всего сеанса, я также хотел бы знать количество успешных и неудачных попыток для каждого класса.
Я пытался разными способами, но я не могу получить результаты для определенного класса.
Вот как выглядит xml.
(редактировать)
<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>
Вот образец требуемого вывода.
<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>
Я получаю атрибут className
из //UnitTest/TestMethod
, получаю соответствующий id
из //UnitTest
, а затем сопоставляю его с //UnitTestResult[@testId]
, чтобы получить соответствующее значение атрибута outcome
. Но я не могу выполнить свое требование. Не знаю, где я ошибаюсь.
В этом примере только 1 класс. но в самом файле, над которым я работаю, много классов.
Заранее спасибо.
(edit2) Вот часть xsl, которую я сейчас использую.
<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>
Извините за огромный ввод кода. Но на самом деле я использую javascript, чтобы скользить по именам тестов при нажатии на определенный класс. Так что мне нужно так много шаблонов. Я что-то пропустил в коде..