.Net 5 時代のテストフレームワーク比較

この記事は [C# Advent Calendar 2020](https://qiita.com/advent-calendar/2020/csharplang) の 8 日目の記事です。

Microsoft 公式ドキュメント [.NET でのテスト - .NET Core | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/core/testing/) に記載されている主要な三つの xUnit, NUnit, MSTest フレームワークを比較してみます。

## 結論、どれを使うべきか

新しいプロジェクトなら xUnit か NUnit を使うとよいと思います。過去のプロジェクトのマイグレーションならそのプロジェクトで使っているフレームワークでよいと思います。

Visual Studio からの実行や CLI (`dotnet test`) の実行、例外テストやデータドリブンテスト (Theory, DataSource) といった主要な機能はどのフレームワークでも対応しています。

個人的には xUnit の書き方が好きなので xUnit を使うことが多いです。

## トレンド

xUnit と NUnit が人気で、 MSTest は低めの結果になっています。 2020/12/6 での計測です。

### 過去一年間の NuGet

xUnit, NUnit, MSTest の順です。 MSTest はだいぶ低いですね。

[NuGet Trends](https://nugettrends.com/packages?months=12&ids=xunit&ids=NUnit&ids=MSTest.TestFramework)

[![Image from Gyazo](https://i.gyazo.com/19026d395bc8a341548ae0fa5fba0839.png)](https://gyazo.com/19026d395bc8a341548ae0fa5fba0839)

### GitHub

Stars を見ると xUnit が多いですね。 NUnit もそれなりです。 MSTest はとても少なくなっています。

[Github Compare](https://www.githubcompare.com/xunit/xunit+nunit/nunit+microsoft/testfx)

[![Image from Gyazo](https://i.gyazo.com/fae9d515722a5762950c408b9243e8ef.png)](https://gyazo.com/fae9d515722a5762950c408b9243e8ef)

### 2020 年の検索ワード

日本で見ると xUnit が少し低め。 NUnit, MSTest が同率です。

[Japan - xUnit, NUnit, MSTest - Explore - Google Trends](https://trends.google.co.jp/trends/explore?date=2020-01-01%202020-12-31&geo=JP&q=xUnit,NUnit,MSTest)

[![Image from Gyazo](https://i.gyazo.com/96e24151c6779013ff08f8e4b306a93f.png)](https://gyazo.com/96e24151c6779013ff08f8e4b306a93f)

世界中で見ると xUnit, NUnit が高いです。 MSTest は低いですね。

[Worldwide - xUnit, NUnit, MSTest - Explore - Google Trends](https://trends.google.co.jp/trends/explore?date=2020-01-01%202020-12-31&q=xUnit,NUnit,MSTest)

[![Image from Gyazo](https://i.gyazo.com/fe8c0d8ddec863aa53bda34bffa62c13.png)](https://gyazo.com/fe8c0d8ddec863aa53bda34bffa62c13)

## 細かい話（もっと知りたい人向け）

xUnit, NUnit はどちらも .NET Foundation がオーナーで、 MSTest は Microsoft がオーナーです。なのでどれも Microsoft 製なようなものです。
実際に Microsoft 関連の GitHub Repository を見てみると、 [dotnet/aspnetcore](https://github.com/dotnet/aspnetcore) や [Azure/azure-powershell](https://github.com/Azure/azure-powershell) は xUnit を使っており、 [dotnet/maui](https://github.com/dotnet/maui) は NUnit を使っています。
日本発の C# フレームワークとライブラリで有名な企業の Cysharp, Inc の比較的新しいリポジトリ [Cysharp/ConsoleAppFramework](https://github.com/Cysharp/ConsoleAppFramework) は xUnit を使っています。
MSTest は GitHub を検索してみた [mstest · GitHub Topics](https://github.com/topics/mstest) のですが、これと言ってよさそうなものが見つかりませんでした。

ライセンスは NUnit と MSTest は MIT License で、 xUnit のみ Apache License 2.0 (※ LICENCE ファイルの書き方が特殊だけどたぶん合っているはず) です。なのでどれもライセンス表記で使えます。商用などあまり気にしなくても大丈夫ですね。

それぞれの機能やコードの書き方の違いなどは [Unit Testing Frameworks: XUnit vs. NUnit vs. MSTEST for .NET and .NET Core | by Robin Ding | Medium](https://medium.com/@robinding/unit-testing-frameworks-xunit-vs-nunit-vs-mstest-for-net-and-net-core-e526011c0bd2) や [Comparing xUnit.net to other frameworks > xUnit.net](https://xunit.net/docs/comparisons) が参考になると思います。内容は英語ですが表形式なので理解できるかと思います。

.NET 5 とそれぞれのテストフレームワークで作ったソースコードは [KtoZ/dotNet5TestFrameworkDifference](https://github.com/KtoZ/dotNet5TestFrameworkDifference) に置いてあるので参考にしてください。

## 参考

- xUnit
  - 公式: [xUnit.net](https://xunit.net/)
  - GitHub: [GitHub - xunit/xunit: xUnit.net is a free, open source, community-focused unit testing tool for the .NET Framework.](https://github.com/xunit/xunit)
  - NuGet: [NuGet Gallery | xunit](https://www.nuget.org/packages/xunit/)
- NUnit
  - 公式: [NUnit.org](https://nunit.org/)
  - GitHub: [GitHub - nunit/nunit: NUnit 3 Framework](https://github.com/nunit/nunit)
  - NuGet: [NuGet Gallery | NUnit](https://www.nuget.org/packages/NUnit/)
- MSTest
  - GitHub: [GitHub - microsoft/testfx: MSTest V2 framework and adapter](https://github.com/microsoft/testfx)
  - NuGet: [NuGet Gallery | MSTest.TestFramework](https://www.nuget.org/packages/MSTest.TestFramework/2.2.0-preview-20201126-03)