目次
環境
- Visual Studio 2022
- xunit 2.4.2
xUnitTestCodeSnippets
ショートカットテキストを入力して、Tabキーを2回入力するとコードのテンプレートが挿入される。
よく使うショートカットテキスト
xtestc
xtesm
orfact
theory
afact
atheory
xunit-testmethod.snippet をダウンロードする。
ツール > コードスニペットマネージャー を開く。
インポートをクリックして、ダウンロードしたスニペットファイルを選択する。 My Code Snipets を指定して完了。
Chainning Assertion
メソッドチェーンの形でアサーションを書ける。
// xUnit Assert.Equal(2, 1+1); // Chainning Assertion (1 + 1).Is(2);
NuGet にあるのは古いので、githubから直接ダウンロードするか、コードをコピペして利用する。 ChainingAssertion.xUnit.cs
Xunit.SkippableFact
xUnitではSkip
属性を付与するとテストをスキップできる。ただし、静的にテストをスキップすることを明示することしかできない。
このツールを利用すると、テスト実行時に動的にスキップするかどうかの判定ができるようになる。
[SkippableFact] public void SomeTestForWindowsOnly() { Skip.IfNot(Environment.IsWindows); // Test Windows only functionality. }
NuGetからインストールする。
スキップされるとテスト結果上も正しくスキップ扱いにある。
SkippableFact
属性の引数で例外の型を指定できるので、NotSupportedException
やNotImplementedException
を指定することができる。
IfNot
メソッドやIf
メソッドの第2引数でメッセージを渡すと標準出力を上書きできる。
Skip.If(true, "hoge\r\nfuga\r\npiyo");
XMLUnit
単純な文字列比較ではなく、XMLを考慮した比較やテストに関する機能を提供してくれる。
NuGetからインストールする。
DOMDifferenceEngine
のDifferenceListener
に値が異なった場合の処理を登録して、
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}"); };