yotiky Tech Blog

とあるエンジニアの備忘録

xUnit.net - 利用可能なツール

目次

環境

xUnitTestCodeSnippets

ショートカットテキストを入力して、Tabキーを2回入力するとコードのテンプレートが挿入される。

よく使うショートカットテキスト

  • xtestc
  • xtesm or fact
  • theory
  • afact
  • atheory

github.com

xunit-testmethod.snippet をダウンロードする。

ツール > コードスニペットマネージャー を開く。

インポートをクリックして、ダウンロードしたスニペットファイルを選択する。 My Code Snipets を指定して完了。

Chainning Assertion

メソッドチェーンの形でアサーションを書ける。

// xUnit
Assert.Equal(2, 1+1);
// Chainning Assertion
(1 + 1).Is(2);

github.com

NuGet にあるのは古いので、githubから直接ダウンロードするか、コードをコピペして利用する。 ChainingAssertion.xUnit.cs

Xunit.SkippableFact

xUnitではSkip属性を付与するとテストをスキップできる。ただし、静的にテストをスキップすることを明示することしかできない。 このツールを利用すると、テスト実行時に動的にスキップするかどうかの判定ができるようになる。

[SkippableFact]
public void SomeTestForWindowsOnly()
{
    Skip.IfNot(Environment.IsWindows);

    // Test Windows only functionality.
}

github.com

NuGetからインストールする。

スキップされるとテスト結果上も正しくスキップ扱いにある。

SkippableFact属性の引数で例外の型を指定できるので、NotSupportedExceptionNotImplementedExceptionを指定することができる。

IfNotメソッドやIfメソッドの第2引数でメッセージを渡すと標準出力を上書きできる。

Skip.If(true, "hoge\r\nfuga\r\npiyo");

XMLUnit

単純な文字列比較ではなく、XMLを考慮した比較やテストに関する機能を提供してくれる。

www.xmlunit.org

github.com

NuGetからインストールする。

DOMDifferenceEngineDifferenceListenerに値が異なった場合の処理を登録して、 InputのメソッドからXMLを読み込んでビルドしたものをCompareメソッドに渡して比較する。

下記のように、空タグとコンテンツのない開始タグと終了タグを比較した場合同一とみなされる。 スラッシュの前にスペース(<User />)がある場合も同一扱いされる。

var expected =
@"<PurchaseOrder PurchaseOrderNumber=""99503"" OrderDate=""1999-10-20"">
  <User></User>
</PurchaseOrder>";

var actual =
@"<PurchaseOrder PurchaseOrderNumber=""99503"" OrderDate=""1999-10-20"">
  <User/>
</PurchaseOrder>";

var diff = new DOMDifferenceEngine();
diff.DifferenceListener += (comparison, outcome) =>
{
    Assert.Fail($"Result is {outcome} : {comparison}");
};

var control = Input.FromString(expected).Build();
var test = Input.FromString(actual).Build();
diff.Compare(control, test);

値は同じだがフォーマットが異なる場合や、近似値は許容する等の場合は、DifferenceListenerの中でフィルタすることで対応可能。

var expected =
@"<PurchaseOrder PurchaseOrderNumber=""99503"" OrderDate=""1999-10-20"">
  <User></User>
</PurchaseOrder>";

var actual =
@"<PurchaseOrder PurchaseOrderNumber=""99503"" OrderDate=""1999/10/20"">
  <User />
</PurchaseOrder>";
var diff = new DOMDifferenceEngine();
diff.DifferenceListener += (comparison, outcome) =>
{
    var x = comparison.ControlDetails.Value.ToString();
    var y = comparison.TestDetails.Value.ToString();
    if (DateTime.TryParse(x, out var xDate)
    && DateTime.TryParse(y, out var yDate))
    {
        if (xDate == yDate) { return; }
    }

    Assert.Fail($"Result is {outcome} : {comparison}");
};