miso_soup3 Blog

主に ASP.NET 関連について書いています。

最新のNUnitを知ることを軽んじていたので反省した

最近のラノベは、題名だけで分かるような長ーいタイトルになっているらしいですね
WEBサービスも同じようにしたら、流行るかな…

本題です

最新バージョンのNUnit.Framework.dllといっても、
たくさんのバージョンアップを経ているので、新しいものから古いものまで混在しています。

そのなかで、適切なものを選択することは、テストの効率・正確性・可読性UPにつながります。

その選択の差にどのようなものがあるのか、どんな新しいものがあるのか、
2つ例を挙げてみます。
例外検証 と 比較検証です。

例外検証

例外が発生したかどうかを検証する方法は、
少なくとも、下の2つがあります。

  • 属性 [ExpectedException]
  • Assertクラス Assert.Throws, Assert.That

属性の方は、(NUnit 2.0 plus Updates)のもの。
Assertクラスの方は、2.5で追加されたものです。

オススメは、もちろん後者のAssertクラスです。

属性での書き方です。

[Test]
[ExpectedException(
	typeof(ArgumentNullException), 
	UserMessage="生徒がnullです", 
	MatchType = MessageMatch.Exact)]
public void TestMethod()
{
	//arr
	Teacher teacher = new Teacher();
	Student student = null;

	//test
	teacher.Add(student);
}

Assertクラスでの書き方です。

[Test]
public void TestMethod()
{
	//arr
	Teacher teacher = new Teacher();
	Student student = null;

	//test
	Assert.That(() => teacher.AddStudent(student),
                Throws.Exception.TypeOf<ArgumentNullException>()
                .And.Message.EqualTo("生徒がnullです"));
}

Assert.Throws(...); というのもあります。中身は一緒です。

問題点

属性での書き方には、

”どこで例外が発生したのかテストされていない、分からない” と、
"テストコードが間違った時に、テストが成功となる可能性がある" などの問題があります。

テストの正確性にとても差があります。

補足

同じことを書いている方がいらっしゃいました。結構昔の記事ですが・・・。
また、例外検証では他に、Assert.Catchや Assert.DoesNotThrow などがあります。

比較検証

次の比較検証の例は、機能の優劣ではなく、可読性に差があるケースです。
どの方法もAssertクラスを利用した書き方です。

方法 1

Assert.Greater(scoreIsHigh, scoreIsZero);
Assert.Less(absence, scoreIsZero);

方法 2

Assert.That(scoreIsHigh, Is.GreaterThan(scoreIsZero));
Assert.That(absence, Is.LessThan(scoreIsZero));

前者は、NUnit 2.2.4から、後者は NUnit 2.4 からです。

問題点

テスト機能に問題はありませんが、可読性としては 方法 2 がよいと思います。
引数のどれが優でどれが劣か、いつも分からなくなるので・・・。

補足
Assert.That(myOwnObject, 
    Is.GreaterThan(theExpected).Using(myComparer));

とかもあります。

おしまい

以上、最新のNUnitを知ると捗る!というものでした。
ということで、2012/02にリリースされた最新の2.6の内容については
NUnit 2.6 Final Release
からご覧になれます。
参考になった記事です。
NUnit 2.6 で実装された Action 属性について
NUnitの全貌 〜 基本から、最新バージョンの新機能まで

余談ですが、
Assert.IsTrue,Assert.Equal,Assert.Greater ..といったものは
すべて内部でAssert.Thatを呼び出してるんですね・・・。

NUnitのソースは、ここからDLできます。3.0もあります。

もちろん、テストコードもしっかりかかれています。(NUnitで!)