7

Fitnesse Acceptance テスト スイートを TFS ベースの CI プロセスに統合しています。

Fitnesse Test スイートを RESTful な方法で実行できます ( http://fitnesse.org/FitNesse.UserGuide.RestfulTests ):

http://myfitnesseserver/MyTestSuite?suite&format=xml

テスト結果の XML ドキュメントを取得します。

これを、TFS が成功/失敗したテストの数として解釈できる形式に変換したいと思います。

ポインタはありますか?

ありがとう

4

3 に答える 3

9

私は仕事で同様の目標を持っているので、テストまたはスイートを Web 要求として実行し、結果の XML を解析して以下のスタイル シートを使用して変換し、最終的に結果をVisual Studio のジェネリック テストで指定された %TestOutputDirectory% の「results.xml」というファイル。

結果ファイルは Visual Studio によって読み込まれ、Fitnesse テストまたはスイートで成功または失敗した子テストの数を報告する要約結果ファイルとして解析されます。出力ファイル形式の詳細はここに記載されていますが、デフォルトの Fitnesse wiki で Fitnesse の 2 分間の例に対して実行すると、簡単な例は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<SummaryResult>
  <TestName>TwoMinuteExample</TestName>
  <TestResult>Failed</TestResult>
  <ErrorMessage>6 right, 1 wrong, 0 ignores and 0 exceptions.</ErrorMessage>
  <InnerTests>
    <InnerTest>
      <TestName>TwoMinuteExample</TestName>
      <TestResult>Failed</TestResult>
      <ErrorMessage>6 right, 1 wrong, 0 ignores and 0 exceptions.</ErrorMessage>
    </InnerTest>
  </InnerTests>
</SummaryResult>

そのため、Visual Studio から、またはビルドの一部として実行する Fitnesse テスト/スイートごとに、テスト プロジェクトで Visual Studio "汎用テスト" を作成できるようになりました。汎用テストでは、汎用テスト ランナー実行可能ファイルへのパス、Fitnesse サーバー、ポート、および wiki 内のテスト/スイート名を指定する必要があります。テスト実行またはビルドの出力に表示される詳細を取得するには、「概要結果ファイル」のボックスをオンにして「Results.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:variable name="GlobalRightCount" select="sum(//result/counts/right)"/>
  <xsl:variable name="GlobalIgnoresCount" select="sum(//result/counts/ignores)"/>
  <xsl:variable name="GlobalWrongCount" select="sum(//result/counts/wrong)"/>
  <xsl:variable name="GlobalExceptionsCount" select="sum(//result/counts/exceptions)"/>
  <xsl:variable name="GlobalFailureCount" select="$GlobalWrongCount + $GlobalExceptionsCount"/>

  <xsl:template match="testResults">
    <SummaryResult>
      <TestName>
        <xsl:value-of select="rootPath"/>
      </TestName>
      <xsl:choose>
        <xsl:when test="$GlobalFailureCount = 0">
          <TestResult>Passed</TestResult>
          <xsl:call-template name="GlobalErrorMessage"/>
        </xsl:when>
        <xsl:otherwise>
          <TestResult>Failed</TestResult>
          <xsl:call-template name="GlobalErrorMessage"/>
        </xsl:otherwise>
      </xsl:choose>
      <InnerTests>
        <xsl:for-each select="result">
          <InnerTest>
            <TestName>
              <xsl:value-of select="relativePageName"/>
            </TestName>
            <xsl:choose>
              <xsl:when test="sum(counts/wrong) + sum(counts/exceptions) = 0">
                <TestResult>Passed</TestResult>
                <xsl:call-template name="ResultErrorMessage"/>
              </xsl:when>
              <xsl:otherwise>
                <TestResult>Failed</TestResult>
                <xsl:call-template name="ResultErrorMessage"/>
              </xsl:otherwise>
            </xsl:choose>
          </InnerTest>
        </xsl:for-each>
      </InnerTests>
    </SummaryResult>
  </xsl:template>


  <xsl:template name="GlobalErrorMessage">
    <ErrorMessage><xsl:value-of select ="$GlobalRightCount"/> right, <xsl:value-of select ="$GlobalWrongCount"/> wrong, <xsl:value-of select ="$GlobalIgnoresCount"/> ignores and <xsl:value-of select ="$GlobalExceptionsCount"/> exceptions.</ErrorMessage>
  </xsl:template>

  <xsl:template name="ResultErrorMessage">
    <ErrorMessage><xsl:value-of select ="sum(counts/right)"/> right, <xsl:value-of select ="sum(counts/wrong)"/> wrong, <xsl:value-of select ="sum(counts/ignores)"/> ignores and <xsl:value-of select ="sum(counts/exceptions)"/> exceptions.</ErrorMessage>
  </xsl:template>
</xsl:stylesheet>

更新: 一般的なテスト ランナー コードの追加

これは間違いなく単なる概念実証であり、必ずしも最終的な解決策ではありません。この手法を Martin Woodward の回答と組み合わせて、テスト リスト自体が動的である全体像を把握できる場合があります。または、テスト ランナーを変更して、(サブ) wiki 全体で検出されたすべてのテストを実行することもできます。ここにはおそらく他にもいくつかのオプションがあります。

次のコードは最適化にはほど遠いですが、一般的なプロセスを示しています。これを新しいコンソール アプリケーション プロジェクトに貼り付けることができます。コマンド ライン パラメータが必要であり、プロジェクト プロパティでこれらのデフォルトを指定できることに注意してください。

サンプル コマンド ライン: localhost 80 FitNesse.UserGuide.TwoMinuteExample

class Program
{
    static int Main(string[] args)
    {
        //Default to error unless proven otherwise
        int returnValue = 1; 

        try
        {
            List<string> commandLineArgs = args.ToList<string>();

            string host = args[0];
            int port = int.Parse(args[1]);
            string path = args[2];
            string testCommand = "suite";

            XmlDocument fitnesseResults = GetFitnesseResult(host, port, path, testCommand);
            XmlDocument visualStudioResults = TransformFitnesseToVisualStudioResults(fitnesseResults);
            visualStudioResults.Save("Results.xml");

            var testResultNode = visualStudioResults.DocumentElement.SelectSingleNode("TestResult");
            var value = testResultNode.InnerText;
            if (value == "Success")
            {
                returnValue = 0;
            }
        }
        catch (System.Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

        return returnValue;
    }

    private static XmlDocument GetFitnesseResult(string host, int port, string path, string testCommand)
    {
        UriBuilder uriBuilder = new UriBuilder("http", host, port, path, "?" + testCommand + "&format=xml");
        WebRequest request = HttpWebRequest.Create(uriBuilder.Uri);
        request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);

        WebResponse response = request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        StreamReader responseReader = new StreamReader(responseStream);
        string responseString = responseReader.ReadToEnd();

        XmlDocument rawResults = new XmlDocument();
        rawResults.LoadXml(responseString);

        return (rawResults);
    }

    private static XmlDocument TransformFitnesseToVisualStudioResults(XmlDocument fitnesseResults)
    {
        XslCompiledTransform transformer = new XslCompiledTransform(false);
        string codeBase = Assembly.GetEntryAssembly().CodeBase;
        string directory = Path.GetDirectoryName(codeBase);
        string xsltPath = Path.Combine(directory, "FitnesseToSummaryResult.xslt");
        transformer.Load(xsltPath);

        MemoryStream resultsStream = new MemoryStream();
        transformer.Transform(fitnesseResults, null, resultsStream);
        resultsStream.Position = 0;
        XmlDocument results = new XmlDocument();
        results.Load(resultsStream);

        return (results);
    }
}
于 2009-11-02T02:34:05.487 に答える
0

@ジェリーなど アル。

この問題に遭遇しましたか?上記と非常によく似たコードを実行すると、nUnitTest モードで URI に「/?test&format=xml」が含まれている場合、nUnit テストは失敗し、IOException、「トランスポート接続からデータを読み取れません: 接続が閉じられています。」

ただし、その時点で実行されていた Fiddler トレースは、まさに私が期待した xml を示しています。

ブラウザ経由で送信されたときに送信されるリクエストヘッダーを(ほぼ)正確に再作成しました。

最後に、URI から "/?test&format=xml" を除外すると、そうでなければ期待していた html が得られます。

興味をそそられましたか?私はソースコードを持っています... :)

于 2009-11-06T00:05:43.237 に答える
0

2008 の TRX ファイル形式は生成がかなり簡単ですが、十分に文書化されていません。これには多数の GUID が含まれています。最適なドキュメントは、次のブログ投稿にあります。

JUnit からの出力を受け取り、それを TRX ファイルに変換するコードをいくつか書きました。これは実際には 2 つのステップで行われます。最初のステップでは、すべての JUnit 結果ファイルを 1 つのファイルに統合し、TRX ファイルが必要とする必要な GUID を生成します。次に、結合された XML ファイルに対して XSLT を実行して TRX ファイル形式に変換してから、Visual Studio の Team エディション (Team Suite、Developer、または Test エディション) に同梱されている MSTest.exe コマンド ライン ツールを使用して TFS に公開します。

そのコードは、MSPL の下でライセンスからダウンロードできます。

于 2009-10-26T15:31:17.380 に答える