最新の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クラスを利用した書き方です。
方法 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で!)