【C#】MSTestを用いた単体テストで複数の入力をまとめてテストする方法
皆さんこんにちは!
単体テストを行う際に境界値分析のようにテストメソッドの処理としては同じで入力だけを変えたテストを複数行いたいと思ったことはありませんか?
入力値のだけを変えたメソッドを必要なシナリオ分用意してもいいのですが、それでは可読性が落ちてしまいます。そういったときに使用できる方法を調査しましたのでまとめていきます。
調査には下記ページを参考にしました。
環境
- Windows11
- Visual Studio 2022
結論
[DataRow]
属性を用いることで複数のデータセットを1つのメソッドに対して実行することができます。
実際に作成してみる
9999までの自然数において桁数を判定する関数を実装してみます。
まずは新規コンソールプロジェクトを作成しCountDigits()
メソッドを追加します。
public int CountDigits(int num)
{
// 数が0以下もしくは10000以上の場合は例外をスローする。
if(num <= 0 || num >= 10000) { throw new ArgumentOutOfRangeException();}
if( 0 < num && num < 10)
{
// 1桁
return 1;
}
else if( 10 <= num && num < 100 )
{
// 2桁
return 2;
}
else if( 100 <= num && num < 1000)
{
// 3桁
return 3;
}
else
{
// 4桁
return 4;
}
}
次に単体テストプロジェクトを作成し、テストメソッドを追加します。戻り値が変わる境界値(計8件)をすべてテストします。
[TestMethod]
[DataRow (1, 1)]
[DataRow (9, 1)]
[DataRow (10, 2)]
[DataRow (99, 2)]
[DataRow (100,3)]
[DataRow (999,3)]
[DataRow (1000,4)]
[DataRow (9999,4)]
public void CountDigits_DataTest(int num , int digit)
{
var prog = new Prog();
// テスト実行
var result = prog.CountDigits(num);
// 結果判定
Assert.AreEqual(digit, result);
}
すべてのテストを実行すると以下のようになり8件のテストが実行されることを確認しました。
テストメソッドの解説
データセットをテストするためには[DataRow]
属性を使用する必要があります。使用方法は[DataRow(xxx)]
のxxxの部分にテスト用データを記載すること1行が1ケースとして扱われます。
テストメソッドに引数を設定すると[DataRow]
に記載したデータの左側から順番に第一引数、第二引数・・・として使用することができます。今回のケースでは第一引数をメソッドに渡す値。第二引数を期待値として使用しテストを行いました。
またデータセットにはint
型以外の型も使用することができます。
最後に
皆さんいかがでしょうか!
今回はDataRow属性を使用したデータセットを読み込ませて行うテストを紹介しました。この方法を行うことでたくさんのテストケースを実装してもコードをよりスリムにすることができます。
MSTestにはデータセットを変数を変数として用意するDynamicData
属性があります。ご興味があればぜひ調べてみてください!!
この記事で皆様のコーディングライフの助けになれれば幸いです!
ではまた次の記事で!!