皆さんは、ソフトウェア開発で単体テストフレームワークを利用していますか?
最近の開発現場を見ているとCI/CD環境の導入が進むにつれて、一緒に単体テストフレームワークの導入も増えてきているように感じられます。
しかし、単体テストフレームワークも開発言語によって色々あるため、初めて導入する場合はどのフレームワークを採用したら良いか悩むことがあるかと思います。
そこで、本記事では、C#をターゲットに「おすすめの単体テストフレームワーク」をまとめてみましたので、その内容をご紹介します。
目次
単体テストフレームワークの種類
C#で有名な単体テストフレームワークを3つご紹介します。
1.MSTest
Visual Studioに初めて標準搭載された、単体テストフレームワークで、Microsoft Corporationによって提供されている。
Visual StudioのUI上からテストコードを簡単に作成することができ、初期のMSTestV1のバージョンで利用できた「コード化されたUIテスト(※1)」の廃止に合わせて、新しいバージョン「MSTestV2 (※2)」がリリースされた。
【参考情報】
開発元 :Microsoft Corporation
最新バージョン:3.0.4(2023/6 更新) ※MSTestV3
ドキュメント :参考ページ
※1. コード化されたUIテストの参考ページ
※2. MSTestV2についての参考ページ
2.NUnit
Java用の単体テストフレームワーク(JUnit)から移植された、.NET用の単体テストフレームワークで、Microsoftが設立した.NET Foundation(非営利団体)によって提供されている。
C#用にテストコードを簡単に生成できる拡張機能(※3)も提供されており、Visual Studio 2017(14.8)以降からVisual Studioに標準搭載されるようになった。
【参考情報】
開発元 :.NET Foundation
最新バージョン:3.13.3(2022/3 更新)
ドキュメント :参考ページ
※3. 拡張機能:NUnit Test Generator VS2022
3.xUnit(xUnit.net)
NUnitの開発者によって新しく作成された単体テストフレームワークで、.NET Foundation(非営利団体)によって提供されている。
他の単体テストフレームワークの問題を参考に、機能や利便性の改善が行われているフレームワーク(※4)で、NUnitと同様にVisual Studio 2017(14.8)以降からVisual Studioに標準搭載されるようになった。テストコードを生成できる拡張機能(※5)も提供されている。
【参考情報】
開発元 :.NET Foundation
最新バージョン:2.4.2(2022/8 更新)
ドキュメント :参考ページ
※4. xUnitの構築理由や改善内容など
※5. 拡張機能:xUnit.net.TestGenerator2022
単体テストフレームワークの比較
単体テストフレームワークの概要だけでは違いが分かり難いため、情報をまとめて比較してみます。
1.基本情報
内容 | MSTest | NUnit | xUnit |
開発元 | Microsoft Corporation | .NET Foundation | .NET Foundation |
VisualStudioの標準搭載 | 有り(VS2005以降) | 有り(VS2017以降) | 有り(VS2017以降) |
バージョン更新日 | 2023/6 | 2022/3 | 2022/8(Pre 2023/6) |
Google検索ヒット数(全て) | 約615,000件 | 約2,590,000件 | 約2,520,000件 |
Google検索ヒット数(日本語サイト) | 約13,500件 | 約41,000件 | 約46,900件 |
開発元は、全てMicrosoft Corporationが関連しており、VisualStudioの新しいバージョンにも単体テストフレームワークが全て標準搭載されています。
バージョン更新日を見てみると、MSTestとxUnitは2023年も更新され続けている(xUnitはプレリリース版が更新されている)ため、開発元の活動が活発な印象ですが、NUnitの更新はあまり行われていないようです。(xUnitに力を入れているかもしれません)
また、Google検索ヒット数は、NUnitとxUnitの情報量が極端に多く、逆にMSTestの情報量は少ないです。(MSTestのドキュメントが充実しているため?)
次は、機能的な内容(単体テストフレームワークの属性)です。
2.単体テストフレームワークの属性(一部)
内容 | MSTest | NUnit | xUnit |
テストメソッド | [TestMethod] | [Test] | [Fact] |
テストクラス | [TestClass] | [TestFixture] | – |
テストメソッド呼び出し直前に実行 | [TestInitialize] | [SetUp] | コンストラクタ |
テストメソッド呼び出し直後に実行 | [TestCleanup] | [TearDown] | IDisposable.Dispose |
テストクラスの最初に1回実行 | [ClassInitialize] | [OneTimeSetUp] | IClassFixture<T> |
テストクラスの最後に1回実行 | [ClassCleanup] | [OneTimeTearDown] | IClassFixture<T> |
テストフィクスチャーの定義 | – | – | ICollectionFixture<T> |
パラメータ化(データドリブン) | [DataSource] | [Theory] | [Theory] [InlineData] [MemberData] [ClassData] |
※ 上記は xUnit.netサイトのドキュメント(Attributes)から引用
https://xunit.net/docs/comparisons#attributes
単体テストフレームワーク毎に、属性の定義内容の違いはありますが、xUnitは他の単体テストフレームワークにはない、以下の特徴(一部)があります。
・ テストケースの分離 :テストケース毎にテストクラスがインスタンス化されるため、テスト間の依存関係が最小限になる。初期化に関する属性も
廃止され、代わりにコンストラクタやDisposeが使用される。
・ 自由なフィクスチャー:IClassFixture、ICollectionFixtureを使用することで、フィクスチャーを自由に設定・共有することが可能になる。
・ パラメータ化の簡略化:テストデータ用の属性(InlineData、MemberData、ClassData)が使用できるため、パラメータ化の定義が簡略化さ
れる。
この特徴により、xUnitは他の単体テストフレームワークに比べて、拡張性の高いテストコードをシンプルな構文で定義できるため、保守性の高い自由なテストケースを作成することが可能になります。
その他機能の比較については、xUnit.netサイトのドキュメントにもまとめられていますので、よろしければご覧ください。
最後は、単体テストフレームワークの流行です。
3.単体テストフレームワークの流行
Google Trends(キーワード検索回数の平均値)
検索年 | 日本のみ | 全ての国 | ||||
MSTest | NUnit | xUnit | MSTest | NUnit | xUnit | |
2021年 | 17 | 16 | 24 | 20 | 74 | 74 |
2022年 | 11 | 13 | 23 | 17 | 67 | 81 |
2023年 | 23 | 21 | 24 | 18 | 66 | 84 |
※ 上記の数値はGoogle Trendsから各フレームワーク名をキーワードに算出
https://trends.google.co.jp/trends?geo=JP&hl=ja
全ての国では、圧倒的にxUnit(続いてNUnit)の検索回数が多く、日本のみで見てみると、最近ではxUnitとMSTestの検索数が多くなっています。日本の企業は、Microsoft製品に高い信頼を寄せており、MSTestも昔からVisual Studioに統合されて利用しやすい環境のため、その一環として日本でMSTestが広く採用されているのかもしれません。
nuget Trends(nugetに公開されている単体テストフレームワークのダウンロード数)
検索年 | MSTest | NUnit | xUnit |
2年前(1年間)のDL数 | 47,926,220 | 59,244,716 | 77,689,410 |
直近1年間のDL数 | 61,243,389 | 79,067,077 | 109,616,035 |
直近1年間のDL数(増加率) | 27% | 33% | 41% |
※ 上記の数値はnuget Trendsから各フレームワーク名をキーワードに算出
https://nugettrends.com/
Google Trendsの検索回数(全ての国)と同様に、ダウンロード数も「1. xUnit、2. NUnit、3. MSTest」の順に多くなっています。しかも、「直近1年間のDL数(増加率)」からも分かるようにxUnitは圧倒的に多く利用されているため、最近の人気の高さが伺えます。また、MSTestもバージョンアップが頻繁に行われているためか、DL数は極端に少なくありません。
まとめ
C#の単体テストフレームワーク(MSTest、NUnit、xUnit)の紹介と比較を行いましたが、私のおすすめできる単体テストフレームワークは・・・
xUnit です!!
理由としては、「開発元の活動も活発で定期的に更新されている」「世界的に人気があるためフレームワークに関する情報量も多い」、「属性やテストコードが簡略化され保守性が高い」ことに魅力を感じたからです。
但し、必ずしもxUnitを利用した方が良いという訳ではなく、プロジェクトの「テストのノウハウ(資産)」「メンバーの知識」「予算(工数)」等を考慮し、最適な単体テストフレームワークを選定することが、プロジェクトの成功に繋がると思います。
また、単体テストフレームワークには、より活用し易くするための拡張機能やツール「dotTEST(以下のParasoft dotTESTについてを参照)」等もありますので、試してみてはいかがでしょうか。
dotTESTを利用することで、本記事でご紹介した単体テストフレームワーク(MSTest、NUnit、xUnit)のテスト結果の集計やカバレッジ計測ができるようになります。(テストの網羅性・妥当性の判断などにご活用いただけます。)
Parasoft dotTESTについて

C# VB.NET対応 静的解析・単体テストツール dotTEST
dotTEST は、C#言語VB.NET言語対応した静的解析・動的解析テストツールです。製造業・医療・金融など幅広い業界において、Windows アプリケーション・Web アプリケーションなどのさまざまな.NET アプリケーションの開発に用いられています。