【ハウツー】
xUnit.NETは.NET 2.0以上で動作するテストツールで、MicrosoftのBrad Wilson氏とJames Newkirk氏が中心となって開発を進めています。xUnit.NETは拡張性の向上、カスタム属性の減少、メソッドごと のインスタンス生成を特徴としており、Moq、Ninject、Oxite、KiGGなどのOSSにも採用されています。
前編では、xUnit.NETの導入方法、テストコード、Fact属性とTrait属性の設定を紹介しましたが、今回は後編として、Assertクラスの検証メソッド、データドリブンテストの実行、メソッドが呼び出される順番の確認について説明します。
Assertクラスには、さまざまな検証用のメソッドが用意されています。これらのメソッドを次の4種類に分けて見ていきましょう。
まずは、基本的な「True」「False」「Same」「Null」「IsType」「IsAssignableFrom」を利用するコードを見てみましょう。
[Fact]
public void 基本的なAssertメソッドの確認()
{
//2足す3
Calc c1 = new Calc();
int sum = c1.Add(2, 3);
//合計は5と等しいはず(True)
Assert.True(5 == sum);
//合計は5と異ならないはず(False)
Assert.False(5 != sum);
//c1とc2は同じインスタンスのはず(Same)
Calc c2 = c1;
Assert.Same(c1, c2);
//c3はヌルのはず(Null)
Calc c3 = null;
Assert.Null(c3);
//c4はCalc型のはず(IsType)
Calc c4 = new Calc();
Assert.IsType<Calc>(c4);
//CalcSubClassはCalcに代入できるはず(IsAssignableFrom)
CalcSubClass cs = new CalcSubClass();
Assert.IsAssignableFrom<Calc>(cs);
}
メソッド名のテストが実行されるだけですので、それほど難しくはないでしょう。それぞれ「NotNull」「IsNotType」のように「Not」を付けることで逆の意味のテストを実行できます。
続けて、コレクションや範囲を比較する「Empty」「Single」「Contains」「InRange」のコードを見てみましょう。
[Fact]
public void コレクションに関するAssertメソッド()
{
//コレクションが空っぽのはず(Empty)
List<string> l1 = new List<string>();
Assert.Empty(l1);
//コレクションの要素は1つのはず(Single)
List<string> l2 = new List<string>();
l2.Add("要素を1つ追加");
Assert.Single(l2);
//コレクションに一致する要素が含まれているはず(Contains)
List<string> l3 = new List<string>(new string[] { "あいう", "かきく" });
Assert.Contains("あいう", l3);
Assert.DoesNotContain("いう", l3);
//文字列に特定の文字が含まれているはず(Contains)
string s1 = "あいう";
Assert.Contains("いう", s1);
//範囲の間であること(InRange)
int i = 4;
Assert.InRange(i, 3, 5); //4は、3と5の間である
Assert.NotInRange(i, 1, 3); //4は、1と3の間ではない
}
EmptyメソッドとSingleメソッドはコレクションの要素数をチェックできます。Containsメソッドは、コレクションの中に一致する要素が存在するかをチェックできます。ただし、String型に対してContainsメソッドを実行した場合は、任意の文字列が含まれているかという意味になります。
例外が発生することをテストする際は、Throwsメソッドを使用します。以下のコードでは、ゼロ除算例外が発生することをテストしています。
[Fact]
public void ゼロ除算でエラーが出るはず()
{
Calc c = new Calc();
Assert.Throws<DivideByZeroException>(
delegate
{
//3割0はDivideByZeroException
c.Divide(3, 0);
});
}
なお、基本クラスを指定するとテストに失敗しますので注意してください。例えば、Throws<DivideByZeroException>の部分をThrows<Exception>と記述するとテストに失敗します。
これまで紹介したメソッドでは比較できない場合、独自の比較メソッドを使用することができます。例えば、空白を無視して文字列を比較するケースを見てみましょう。
//(1)空白を無視して文字列を比較するクラス
public class MyCompare : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
return (x.Replace(" ", "") == y.Replace(" ", "")) ? true : false;
}
public int GetHashCode(string obj)
{
return obj.GetHashCode();
}
}
[Fact]
public void 独自比較クラスの使用()
{
string s1 = "青木淳夫";
string s2 = "青 木 淳 夫";
//s1とs2は一致しないはず
Assert.NotEqual(s1, s2);
//(2)s1とs2は空白を無視すれば一致するはず(比較クラスを第3引数指定)
Assert.Equal(s1, s2, new MyCompare());
}
まず(1)の部分でIEqualityComparerインタフェース(System.Collections.Generic名前空間)を実装したMyCompareクラスを定義します。Equalsメソッドをオーバーライドして比較する方法を記述します。ここでは半角スペースを除外してから比較を行っています。次に(2)の部分でEqualメソッドの第3引数にMyCompareクラスを指定します。これによって、半角を無視してs1とs2の比較を行うことができます。
このように比較用のクラスを作成することで、頻繁に使用するチェックロジックを再利用することができます。
| 理研、脳・脊髄形成に必要な神経板湾曲の仕組みを解明 [20:16 5/25] |
| 京大、「慢性閉塞性肺疾患」患者の労作時呼吸困難は鍼治療が有効と実証 [20:08 5/25] |
| 120Hz SHVカメラ用イメージセンサーを使った撮像装置 - SHVフルスペック化へ [18:10 5/25] |
| 京大、視覚による物体認知は前頭前野からのトップダウン信号が重要と確認 [17:45 5/25] |
| 製品数の拡大だけでなくBCPの展開なども含めた総合力で事業の強化を図るTI [17:25 5/25] |
|
[AKB48]じゃんけん2位の藤江れいな、総選挙目標は「17位」 近野莉菜は姉妹グループに対抗心 [15:38 5/27] ホビー |
|
[注目の新譜]きゃりーぱみゅぱみゅ カワイイがいっぱい! 待望の初アルバムを発表 [15:30 5/27] ホビー |
|
奥瀬サキ「火閻魔人」25年ぶり再始動、新キャラも続々 [15:17 5/27] ホビー |
|
[庵野秀明監督]「ヱヴァ」進行状況を聞かれ立腹 「日プロ大賞」授賞式 [15:01 5/27] ホビー |
|
【女性編】おなかが減ったけどおかずがない! そんなときおかずになる調味料ランキング [15:00 5/27] ライフ |
4つの診断で、自分の適性を見つめなおそう!
働くこと・挑戦し続けることへの思いを綴ったインタビュー
あなたにピッタリのアドバイスを読むことができます。
転職に必要な情報が収集できます
企業からアプローチのメッセージが届きます。