ユニットテストをしましょう
ASP.NET Core MVC では、推奨されるユニットテストフレームワークとしてxUnit.NETが採用されました。
さよならMSTest、いい奴だったよ。
xUnit.NET を準備する
今日は準備だけなので、公式サイトの情報
Getting started with xUnit.net (.NET Core / ASP.NET Core) > xUnit.net
を読めばほとんど同じことが書いてあります。
というか、いろんなサイトを周ったり試行錯誤をした事がたいてい書いてありました。
公式サイトは読むべきですね!!!!
テストプロジェクトを追加する
ユニットテストプロジェクトを追加するのですが、下記のように"test"というソリューションフォルダを作成して、そこにテストプロジェクトを追加する事にしました。
ところで、このソリューションフォルダは実フォルダを作成してくれないので、エクスプローラから別途"test"というフォルダを作成した方が良いです。
テストプロジェクトを作成
次にテストプロジェクトを作成します。
ソリューションフォルダ"test"を右クリックして、"Add"->"New Project..."から、作成します。
プロジェクト名は、"[テスト対象名].Test(s)" などが一般的なようです。
この際に、下記のようにLocationの末尾に"\test"を追加するのを忘れないようにしましょう。
参照を追加
次に、テストプロジェクトにテスト対象プロジェクトの参照を追加します。
新たに追加した[PracticeWorld1.Test]の[References]を右クリックし、[Add Reference...]->[Projects]->[Solution]より、[PracticeWorld1]を選択し、[OK]を押します。
そうすると、サンプルサイトを利用していた場合は下記のように、「ターゲットフレームワークに互換性がない」旨のエラーが出ます。
しょうがないので、テストプロジェクトのターゲットフレームワークを変更します。
テストプロジェクトのproject.jsonの"framework"をテスト対象と同じにします。
"frameworks": { "netcoreapp1.0": { "imports": [ "dotnet5.6", "portable-net45+win8" ] } }
「win8とか言われても意味わからん」と思いますが、堪えて先に進みます。
これにより先ほどエラーになったPracticeWorld1の参照が追加できます。
xUnit.NETを追加
次に下記のように"dependencies"にxunitなどを追加します。
特に"Microsoft.NETCore.App"は、テスト対象プロジェクトでも同じものを参照しているため、バージョンを合わせるようにしてください。
コピーするのが手っ取り早いと思います。
{ "version": "1.0.0-*", "dependencies": { "PracticeWorld1": "1.0.0-*", "xunit": "2.2.0-beta3-build3402", "dotnet-test-xunit": "2.2.0-preview2-build1029", "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.1" } }, "frameworks": { "netcoreapp1.0": { "imports": [ "dotnet5.6", "portable-net45+win8" ] } } }
テストを作成し、実行する
テストプロジェクトに新規ファイルを追加し、何かテストを書いてみます。
using Microsoft.AspNetCore.Mvc; using PracticeWorld1.Controllers; using Xunit; namespace PracticeWorld1.Test { public class SomeTest { [Fact] public void Test1() { Assert.Equal(2, 1 + 1); } [Fact] public void Test2() { var controller = new HomeController(); var view = controller.Index() as ViewResult; Assert.NotNull(view); } } }
VisualStudioの右クリックメニューから"Run Tests"あるいは"Debug Tests"を実行します。
テストが実行されました!ブレイクポイントを設定してデバッグもできます。
CUI でテストを実行する
CUIでテストランナーを実行するには、テストプロジェクト直下(project.json ファイルがある場所)にて、
> dotnet test
を実行します。
PracticeWorld1\test\PracticeWorld1.Test> dotnet test Project PracticeWorld1 (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation. Project PracticeWorld1.Test (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation. xUnit.net .NET CLI test runner (64-bit .NET Core win10-x64) Discovering: PracticeWorld1.Test Discovered: PracticeWorld1.Test Starting: PracticeWorld1.Test Finished: PracticeWorld1.Test === TEST EXECUTION SUMMARY === PracticeWorld1.Test Total: 2, Errors: 0, Failed: 0, Skipped: 0, Time: 0.187s SUMMARY: Total: 1 targets, Passed: 1, Failed: 0.