私は仕事で同様の目標を持っているので、テストまたはスイートを 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);
}
}