おすすめの単体テストフレームワークを探してみる(C#編:2023年6月)

皆さんは、ソフトウェア開発で単体テストフレームワークを利用していますか?
最近の開発現場を見ていると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 アプリケーションの開発に用いられています。

Top