Visual Studio 2013 で xUnit を使う
Visual Studio 2013 で xUnit を使う手順を記載。
xUnit とは
xUnit.net とは、.NET Framework のためのユニットテストフレームワーク。
環境
- Visual Studio 2013 Update 4
- xUnit 2.0.0
テスト対象のプロジェクトを用意する
ファイル>新規作成>プロジェクト。「C#」で「クラスライブラリ」を選択。
プロジェクト名は例として「ClassLibrary1」とし、以下のように「MyMessage.cs」クラスを作成する。
テストを書く用のプロジェクトを追加する。
ソリューションを右クリック>追加>新しいプロジェクト。
「C#」の「クラスライブラリ」を選択。
プロジェクト名は例として「MyClassLibraryTest」とし、「MyMessage.cs」クラスを作成する。
「MyClassLibraryTest」プロジェクトを右クリック>追加>参照 で、「MyClassLibrary」の参照を追加する。
「パッケージマネージャコンソール」ウィンドウを開き、既定のプロジェクトを「MyClassLibraryTest」をし、
「install-package xunit」を入力する。
続いて「install-package xunit.runner.visualstudio」を入力する。
インストール完了後の「MyClassLibraryTest」の「packages.config」は以下のようになった。
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="xunit" version="2.0.0" targetFramework="net451" /> <package id="xunit.abstractions" version="2.0.0" targetFramework="net451" /> <package id="xunit.assert" version="2.0.0" targetFramework="net451" /> <package id="xunit.core" version="2.0.0" targetFramework="net451" /> <package id="xunit.extensibility.core" version="2.0.0" targetFramework="net451" /> <package id="xunit.runner.visualstudio" version="2.0.0" targetFramework="net451" /> </packages>
「MyMessageTest.cs」に以下のようにテストを書く。
MyMessage クラスの Say メソッドが「Hello, world」を返しているかどうかを書いている。
using MyClassLibrary; using Xunit; namespace MyClassLibraryTest { public class MyMessageTest { [Fact] public void SayTest() { var message = new MyMessage(); string actual = message.Say(); string expect = "Hello, world"; //assert Assert.Equal(expect, actual); } } }
テストメソッドには [Fact] 属性を付与する。
メニューから テスト >ウィンドウ>テストエクスプローラー を開く。
「すべて実行」からテストを実行することができる。
試しに、間違った実装に変更し、再度テストを実行すると、次のように失敗と表示される。
ちなみに実装クラスの方では、このように表示されている。
ブレイクポイントを設置すれば右クリックからデバッグも可能。
ドキュメント
- Github xUnit
- xUnit Project Home
- 前までは Visual Studio の拡張機能を使って xUnit を走らせていたが、不要になったみたい。
- Nunit や MSTest との書き方の違い一覧
- MSDN 単体テストを使用したコードの検証
Setup 例
プロジェクト全体の準備コードを書く場合のコード例を書いておく。
参照:https://gist.github.com/bradwilson/8423477
/// <summary> /// プロジェクト全体のテストの準備(Setup) /// </summary> using Xunit; public class Fixture : IDisposable { public Fixture() { //準備 } public void Dispose() { } } [CollectionDefinition(“CallFixture”)] public class ProjectSetup : ICollectionFixture<Fixture> { }
テスト実行前に準備を処理したいときは、次のように[Collection(“CallFixture”)]属性を付与。
using Xunit; [Collection(“CallFixture”)] public class HogeTest { [Fact] public void Test() { //test } }