8

Cruisecontrol.netを介して実行されている C++ プロジェクトがいくつかあります。ビルド プロセスの一環として、Boost.Test単体テスト スイートをコンパイルして実行します。XML ログ ファイルをダンプするようにこれらを構成しました。形式は JUnit/NUnit に似ていますが、まったく同じではない (また、一部の情報が不足している) ため、cruisecontrol.net はそれらを取得できません。Boost.Test の結果を JUnit/NUnit 形式に変換する既存の XSL 変換を誰かが作成した (または知っている) かどうか疑問に思っています。

ありがとう!

4

5 に答える 5

5

上記の Stuart Lange の回答のおかげで、Boost.Test の出力を取得して、Bamboo ビルド システムと統合することができました。Bamboo は、ここで取り込める形式について説明しています。

http://confluence.atlassian.com/display/BAMBOO/JUnit+parsing+in+Bamboo

そこで、上記の Stuart Lange の XSL を出発点として使用し、最終的には次のようになりました。

<?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">
      <xsl:call-template name="testSuite" />
  </xsl:template>

  <xsl:template name="testSuite">
    <xsl:for-each select="TestSuite">
      <testsuite>
        <xsl:attribute name="errors">
            <xsl:value-of select="@test_cases_failed + @test_cases_aborted"/>
        </xsl:attribute>

        <xsl:attribute name="tests">
            <xsl:value-of select="@test_cases_passed + @test_cases_failed + @test_cases_skipped + @test_cases_aborted"/>
        </xsl:attribute>

        <xsl:attribute name="skipped">
            <xsl:value-of select="@test_cases_skipped"/>
        </xsl:attribute>

        <xsl:attribute name="failures">
            <xsl:value-of select="@test_cases_failed"/>
        </xsl:attribute>

        <xsl:call-template name="testAttributes" />
        <!--results-->
          <xsl:call-template name="testSuite" />
          <xsl:for-each select="TestCase">
            <testcase>
              <xsl:call-template name="testAttributes" />
              <xsl:call-template name="testCaseElements" />
            </testcase>
          </xsl:for-each>
        <!--/results-->
      </testsuite>
    </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:template name="testCaseElements">
    <xsl:if test="@result != 'passed'">
        <failure type="No type reported" message="No message reported"/>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

Boost.Test 実行可能ファイルを呼び出すときは、次のコマンド ライン オプションを使用します。

--report_format=xml
--report_level=detailed

印刷物を離れるのは最もホットな XSL ではありませんが、スイート、含まれるテスト、および Bamboo で失敗したもの (ある場合) を確認するだけで十分です。

もう 1 つ注意してください。この方法では、stderr 出力のみをキャプチャする必要があります。stdout の内容 (少なくとも Boost.Test の使用方法) は問題を引き起こします。

于 2011-01-24T18:49:51.043 に答える
5

私は独自の Boost.Test -> JUnit XSL のローリングに取り組んでいます。これは、ログ出力ではなく、Boost.Test からの XMLレポート出力を使用することを意図していることに注意してください。これは進行中の作業です-これが私がこれまでに持っているものです:

<?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 データを JUnit レポートの "total"、"failures"、"skiped"、および "not-run" フィールドにマップする方法に関する提案をお待ちしています。また、残念ながら、エラーの詳細データ (障害の性質と障害が発生したファイル/行番号を示す) は、レポートではなくログにのみ出力されるため、すべてを取得するには 2 つを「マージ」する必要があります。私が理想的に持っていたいデータ。

于 2010-06-04T16:17:48.290 に答える
2

この xsl は、Boost.Test の log.xml を、Bamboo で読み取り可能な JUnit xml に変換するために機能し、メッセージを完備しています!: https://issues.jenkins-ci.org/secure/attachment/19613/boosttest-1.0-to-junit -1.0.xsl

ここからリンクされています: https://issues.jenkins-ci.org/browse/JENKINS-7039

于 2011-08-03T14:08:10.727 に答える
1

を使用してテストを実行します--report_format=xml --report_level=detailed --log_level=test_suite --log_format=xml。stderrとstdoutの両方が必要な場合は、<TestLog>を<xml> <TestLog>に置き換え、</TestResult>を</TestResult><xml>に置き換えます。その後、きちんと実行し、最後にこのxsltを実行します。

また、stdout/errにxmlスタイルのタグが含まれないように注意する必要があります。<foo>のようなものは変換を壊す可能性があります。

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

于 2010-08-04T15:36:00.993 に答える
0

興味深いことに、おそらく新しいCruiseControl(2.8.4)のせいかもしれませんが、上記のどれもうまくいきませんでした。CruiseControl は、上記の変換によって作成されるすべての「エラー」および「失敗」属性を無視し、子要素に対して独自のクエリを実行します。これで、成功したテストの数と失敗したテストの数が実際に表示されます。

ブースト テストのログ ファイルから、より具体的な障害情報も含めるとよいでしょう (ただし、他の誰かがここから拾うことができるかもしれません)。

要点: Boost.Test に以下のフラグを指定して、stdout/stderr を分割します。Ant ビルド スクリプトのスナップショットを次に示します。

<exec executable="cmd " dir="bin/x64/Release">
<arg line="/k @{file} --build_info --report_format=xml --report_level=detailed --log_level=all --log_format=xml 1&gt; @{file}.log.xml 2&gt; @{file}.result.xml"/>
</exec>

次に、それを変換します。

  <xslt in="@{file}.result.xml" out="@{file}.ccresult.xml" style="transform.xslt" /> 

実際の transform.xslt:

<?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/TestSuite">
    <testsuite>
      <xsl:attribute name="name">
        <xsl:value-of select="@name"/>
      </xsl:attribute>

      <xsl:for-each select="TestCase">
        <testcase>
          <xsl:attribute name="name">
            <xsl:value-of select="@name"/>
          </xsl:attribute>
          <xsl:if test="@result!='passed'">
            <failure>See log file.</failure>
          </xsl:if>
        </testcase>
      </xsl:for-each>
    </testsuite>
  </xsl:template>
</xsl:stylesheet>
于 2012-02-15T18:24:44.043 に答える