はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】NUnit4.0からAssert.AreEqual()やAssert.IsTrue()などのクラシックアサートがLegacyとして切り出されたが4.5で戻ってきた話

はじめに

今回はNUnit v4での破壊的変更について書きたいと思います。

そもそもNUnitとは?と思う方に向けて簡単に説明すると、.NET向けのユニットテストフレームワークです。特にUnityを触られている方は、触ったことがあるかと思います。

NUnit is a unit-testing framework for all .Net languages. Initially ported from JUnit, the current production release, version 3, has been completely rewritten with many new features and support for a wide range of .NET platforms.

// DeepL翻訳
NUnitは、すべての.NET言語向けのユニットテストフレームワークです。当初はJUnitから移植されましたが、現在の製品版であるバージョン3は完全に書き直され、多くの新機能と幅広い.NETプラットフォームへの対応を備えています。

nunit.org


NUnit4.0はNov 27, 2023にはリリースされています。ですので今更感はあるのですが、UnityではNUnit 3.5をベースに活用しているのでNUnit4.0の変更点について知らない人も多いのではないでしょうか。
github.com
docs.unity3d.com

NUnit4.0での変更を知っていないと、NUnit3から4に更新した時に大量のコンパイルエラーが出てくることになってしまうので知っておいて損はないかと思います。

また先週リリースされたv4.5によりこの破壊的変更によるコンパイルエラーがなくなりました。まさかの展開ではあったのですが、そのことについても触れたいと思います。

概要

具体的には以下のメソッドなどが名前空間とクラス名が変わっています。詳細は公式ドキュメントを参照してください。

  • Assert.True
  • Assert.False
  • Assert.Null
  • Assert.NotNull
  • Assert.Zero
  • Assert.NotZero
  • Assert.IsNaN
  • Assert.IsEmpty
  • Assert.IsNotEmpty
  • Assert.AreEqual
  • Assert.AreNotEqual
  • Assert.AreSame
  • Assert.AreNotSame
  • Assert.Contains
  • Assert.Greater
  • Assert.GreaterOrEqual
  • Assert.Less
  • Assert.LessOrEqual
  • Assert.Positive
  • Assert.Negative
  • Assert.IsInstanceOf
  • Assert.IsNotInstanceOf
  • Assert.IsAssignableFrom
  • Assert.IsNotAssignableFrom

Classic Model | NUnit Docs

移行ガイドはこちらにあります。

docs.nunit.org

具体例

// NUnit3
using NUnit.Framework;

Assert.True(hoge);
// NUnit4
using NUnit.Framework.Legacy

ClassicAssert.True(hoge);

v4.5からの変更について

v4.0.0~v4.4.0まではコンパイルエラーになるのですが、v4.5.0でまさかのv3での書き方でもコンパイルエラーにならないように改修が入りました。
github.com

// v4.5.0なら以下の書き方もコンパイルエラーにならない
using NUnit.Framework;

Assert.True(hoge);


C#14で導入された拡張メンバーにより実現されています。
learn.microsoft.com

Assert.Thatを活用した時のIsやDoesといった書き方への不満や、分かりづらい、互換性といった声が届いており、それに応えた形なのかなと思います。
github.com
github.com