У любого есть XSL для преобразования Повышения. Протестировать журналы XML к презентабельному формату?

У меня есть некоторые проекты C++, пробегающие cruisecontrol.net. Как часть процесса сборки, мы компилируем и выполняем Повышение. Тестовые комплекты модульного теста. Мне настроили их для дампа файлов журнала XML. В то время как формат аналогичен JUnit/NUnit, это - не совсем то же (и испытывает недостаток в некоторой информации), таким образом, cruisecontrol.net не может взять их. Я задаюсь вопросом, создал ли кто-либо (или знает о), существующий XSL преобразовывает, который преобразует Повышение. Результаты испытаний к формату JUnit/NUnit, или альтернативно, непосредственно к презентабельному (HTML) формат.

Спасибо!

8
задан joeymink 26 January 2011 в 20:22
поделиться

2 ответа

Я работаю над созданием собственного Boost.Test -> JUnit XSL. Обратите внимание, что он предназначен для потребления XML отчета из Boost.Test - не лога. Это работа в процессе - вот что я имею на данный момент:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                exclude-result-prefixes="msxsl">

  <xsl:output method="xml"
              indent="yes"/>

  <xsl:template match="TestResult">
    <test-results>
      <xsl:attribute name="total">
        <xsl:value-of select="sum(./TestSuite/@test_cases_passed) + sum(./TestSuite/@test_cases_failed) + sum(./TestSuite/@test_cases_skipped) + sum(./TestSuite/@test_cases_aborted)"/>
      </xsl:attribute>
      <xsl:attribute name="failures">
        <xsl:value-of select="sum(./TestSuite/@test_cases_failed) + sum(./TestSuite/@test_cases_aborted)"/>
      </xsl:attribute>
      <xsl:attribute name="skipped">
        <xsl:value-of select="sum(./TestSuite/@test_cases_skipped)"/>
      </xsl:attribute>
      <xsl:attribute name="not-run">
        <xsl:value-of select="sum(./TestSuite/@test_cases_skipped)"/>
      </xsl:attribute>
      <xsl:call-template name="testSuite" />
    </test-results>
  </xsl:template>

  <xsl:template name="testSuite">
    <xsl:for-each select="TestSuite">
      <test-suite>
        <xsl:call-template name="testAttributes" />
        <results>
          <xsl:call-template name="testSuite" />
          <xsl:for-each select="TestCase">
            <test-case>
              <xsl:call-template name="testAttributes" />
            </test-case>
          </xsl:for-each>
        </results>
      </test-suite>
    </xsl:for-each>
  </xsl:template>

  <xsl:template name="testAttributes">
    <xsl:attribute name="name">
      <xsl:value-of select="@name"/>
    </xsl:attribute>
    <xsl:attribute name="success">
      <xsl:choose>
        <xsl:when test="@result = 'passed'">True</xsl:when>
        <xsl:when test="@result != 'passed'">False</xsl:when>
      </xsl:choose>
    </xsl:attribute>
    <xsl:attribute name="executed">True</xsl:attribute>
    <xsl:attribute name="time">0</xsl:attribute>
    <xsl:attribute name="asserts">
      <xsl:value-of select="@assertions_failed + @assertions_passed"/>
    </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

Я интегрировал это в свой процесс сборки, и он хорошо воспринимается и обрабатывается ccnet. Это не идеально, но это работает лучше, чем полное отсутствие отчетов, которое у меня было раньше. Я открыт для предложений о том, как сопоставить данные Boost.Test с полями "total", "failures", "skipped" и "not-run" отчета JUnit. Также, к сожалению, подробные данные об ошибках (указывающие на характер сбоя и номер файла/строки, где произошел сбой) печатаются только в журнал, а не в отчет, поэтому мне придется "объединить" эти два поля, чтобы получить все данные, которые я хотел бы иметь в идеале.

5
ответ дан 5 December 2019 в 12:56
поделиться

Мы запускаем наши тесты с - report_format = xml --report_level = detail --log_level = test_suite --log_format = xml . Вам нужны как stderr, так и stdout, тогда мы заменяем на и заменяем на . После этого мы запускаем его, хотя и аккуратно, и, наконец, запускаем его через этот xslt.

Вы также должны быть осторожны, чтобы в вашем stdout / err не было никаких тегов в стиле xml. Такие вещи, как , могут нарушить преобразование.

  <xsl:for-each select="./TestSuite">
    <xsl:variable name="name2" select="@name"/>
    <testsuite>
      <xsl:attribute name="errors">
        <xsl:value-of select="@test_cases_failed" />
      </xsl:attribute>
      <xsl:attribute name="tests">
        <xsl:value-of select="@test_cases_failed + @test_cases_passed + @test_cases_skipped" />
      </xsl:attribute>
      <xsl:attribute name="name">
        <xsl:value-of select="@name" />
      </xsl:attribute>
      <xsl:for-each select="./TestCase">
        <xsl:variable name="name3" select="@name"/>
        <testcase>
          <xsl:attribute name="name">
            <xsl:value-of select="@name" />
          </xsl:attribute>
          <xsl:for-each select="/xml/TestLog/TestSuite[@name=$name1]">
            <xsl:for-each select="./TestSuite[@name=$name2]">
              <xsl:for-each select="./TestCase[@name=$name3]">
                <xsl:for-each select="./TestingTime">
                  <xsl:attribute name="time">
                    <xsl:value-of select="./text() div 100000"/>
                  </xsl:attribute>
                </xsl:for-each>
                <xsl:for-each select="./Error">
                  <failure>
                    <xsl:attribute name="type">AssertionFailedError</xsl:attribute>
                    <xsl:attribute name="message">
                      <xsl:value-of select="@file"/>:<xsl:value-of select="@line"/>
                    </xsl:attribute>
                    <xsl:copy-of select="./text()"/>
                  </failure>
                </xsl:for-each>
                <xsl:for-each select="./Exception">
                  <failure>
                    <xsl:attribute name="type">AssertionFailedException</xsl:attribute>
                    <xsl:attribute name="message">
                      <xsl:value-of select="@file"/>:<xsl:value-of select="@line"/>
                    </xsl:attribute>
                    <xsl:copy-of select="./text()"/>
                  </failure>
                </xsl:for-each>
                <system-out>
                  <xsl:copy-of select="./text()"/>
                </system-out>
              </xsl:for-each>
            </xsl:for-each>
          </xsl:for-each>
        </testcase>
      </xsl:for-each>
    </testsuite>
  </xsl:for-each>
</testsuite>

1
ответ дан 5 December 2019 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: