初心者のためのC#プログラミング本格入門102 - テストはプログラムを分けよう
前回のテストプログラムの問題点がわかったかな?正解は・・・
//関係のないプログラムは省略しています
class SimpleListTest : Test
{
public void AddElementCheck()
{
base.Execute();
//一旦実行させる
for ( int i = 0 ; i < 10000 ; ++i ) {
this.target.Add( i );
}
//チェックプログラム
for ( int i = 0 ; i < 10000 ; ++i ) {
int result = this.target[ i ];
if ( result != i ) {
string message = "予期せぬ値が返されました。" +
"予想値:" + i +
" 返された値" + result;
base.Error( message );
}
}
}
}
前回との違いは、テストするメソッドの実行とチェックプログラムを分けている点です。試しに新しいテストを実行してみましょう。すると、大量のエラーが報告されます。この結果は、SimpleListが大量のデータに対応できない事を示しています。テストするメソッドとチェックプログラムを分けると、何度か実行した後に発生するエラーをとらえられます。とくに耐久テストの場合、テスト対象の決まったメソッドを何回も実行します。この状況下では、エラーは耐えきれなくなった後で発生します。従って、すべて実行した後でチェックする方が正しいテスト結果を得られます。
エラーがあるのがわかったので、デバッグ(プログラムにある間違いを取り除く行為)をしましょう。エラーメッセージをよく観察すると、格納されている数値が0になっているのがわかります。その事実から、格納した数値が消えていると推測できます。試しにブレークポイントを、
this.data = new int[ this.data.Length * 2 ];
の行に設定してみましょう。そのあとデバッグ実行(F5)し、止まったらステップイン(F7)を1回だけ押し、ローカルウィンドウを見てください。そうすると、配列変数の「data」内の数値が0になっている事を確認できます。エラーの原因がわかったら解決したのも同然です。配列内の数値が消えるのが問題なのですから、新しい配列を作った後に、元の数値を格納すればよいとわかります。
//関係のないプログラムは省略しています
partial class SimpleList
{
public void Add( int value )
{
++this.insertIndex;
if ( this.insertIndex == this.data.Length )
{
int[ ] tmp = new int[ this.data.Length * 2 ];
for ( int i = 0 ; i < this.data.Length ; ++i ) {
tmp[ i ] = this.data[ i ];
}
this.data = tmp;
}
this.data[ this.insertIndex ] = value;
}
}
これでOKです。今度はテストを実行してもエラーメッセージが表示されません。今回解説したことは耐久テストで必須となる知識です。言われてみれば簡単だと思うでしょうが、知らないと意外と本場で失敗します。ちょっとしたことでも、経験者と未経験者に差が出ます。その小さな差が積み重なって大きな差となります。しかし所詮小さなことですから、覚えて初心者を卒業しましょう。