Получить значение дочернего атрибута, пересекающее дочерние узлы для первого соответствия - PullRequest
0 голосов
/ 12 февраля 2019

Каждый класс имеет 3 или более методов тестирования.

Каждый метод тестирования может пройти или потерпеть неудачу.

Ноль, один или несколько методов могут завершиться неудачей.

Требованиечтобы просмотреть результаты тестового метода, и когда найден сбойный метод (первое совпадение), получите значение атрибута 'message' и распечатайте его.

Если ни один из методов не удался, то выведите пустое значение.

Как мне этого добиться?


Input.xml
<testng-results>
<suite>
<test>
    <class name="activities.ActivitiesListTest">
    <test-method status="PASS" started-at="2019-02-07T18:24:47Z" name="initTest">
        <reporter-output>
        </reporter-output>
    </test-method>

    <test-method status="FAIL" started-at="2019-02-07T18:24:47Z" name="ActListsForContactShowsContactRelatedTasksTest">
        <exception class="org.openqa.selenium.NoSuchElementException">
            <message>
                <![CDATA[Element with locator 123 not present']]>
            </message>
        </exception>
        <reporter-output>
        </reporter-output>
    </test-method>

    <test-method status="FAIL" started-at="2019-02-07T18:24:47Z" name="afterClass">
        <exception class="org.openqa.selenium.NoSuchElementException">
        <message>
            <![CDATA[Message 3]]>
        </message>
        </exception>
        <reporter-output>
        </reporter-output>
    </test-method>
</class>
</test>
</suite>
</testng-results>

Ожидаемый результат:

    <Suite>
    <test failed_reason=" <![CDATA[Element with locator 123 not 
    present']]>"/>
    </Suite>

Пробный (XSL):


<Suite>
<xsl:for-each select="/class">
    <test>
        <xsl:attribute name="failed_reason">
            <xsl:choose>
                <xsl:when test="*[@status='FAIL']">test-method[position() = current()]/exception/@message</xsl:when>
            </xsl:choose>
        </xsl:attribute>
    </test>
</xsl:for-each>
</Suite>

Образец абсолютныйсообщение об исключительной ситуации:

suite/test/class[@name='ActivitiesListForContactShowsContactRelatedTasksTest']/test-method[@name='ActListsTest']/exception/message

Но не сработало.

Как достичь ожидаемого результата?

РЕДАКТИРОВАТЬ: пробовать решение Майкла.

Вот так выглядит мой XSL:


<xsl:template match="/">
<Suite>
    <xsl:for-each select="testng-results/suite/test/class">
        <test>
            <xsl:attribute name="start-time">
                <xsl:value-of select="test-method[1]/@started-at"/>
            </xsl:attribute>
            <xsl:attribute name="failed_reason">
                {normalize-space(test-method[@status='FAIL'][1]/exception/message)}
            </xsl:attribute>
        </test>
    </xsl:for-each>
</Suite>
</xsl:template>

1 Ответ

0 голосов
/ 12 февраля 2019

Я предполагаю (!), Что вы хотите сделать что-то вроде:

<xsl:template match="/*">
    <Suite>
        <xsl:for-each select="class">
           <test failed_reason="{normalize-space(test-method[@status='FAIL'][1]/exception/message)}"/>
        </xsl:for-each>
    </Suite>
</xsl:template>

Примечание:

<xsl:for-each select="/class">

не выберет ничего, если class не является корнемэлемент.Но если class является корневым элементом, тогда существует только один класс - поэтому нет смысла использовать xsl:for-each.

...