しむしむてるるの日記&雑談 同人誌の進捗やら仕事のあれこれやら書いています。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | TB(-) | CM(-)

ユニットテストって具体的にどうやるのか?

今の業務を始めて、JUnitやNightlyなんて言葉を聞く様になりました。

JUnitはJavaのユニットテストを行うフレームワークで、
Nightlyは毎晩自動でビルド&テストを行うシステム(?)の事です。
プログラムの仕事には、実際にコードを書いていく実装以外にも
『ユニット(単体)テスト』や『結合テスト』などの動作テストがあって、
実際にそれを行うために使うのがJUnitやNightlyな訳です。

と、そこまでは良いんです。
概念的な事や概要は今までの知識や経験で何となく分かりますから。
ただ、『実際にどうやるのか?』それが問題です。
と言っても、フレームワークやらツールは使い方を調べれば良いからそんなに問題にはなりません。
実際の問題は、『ユニットテストをどうやるのか?』です。

単体テストは、単純に考えればメソッド(関数)が正しく動作するかをテストする事になります。
具体的には、引数にいろんなパラメータを入れて、仕様通りの結果が得られるか?
それをテストするわけです。
まぁ、それだけなら別にどうってこと無いと思います。
要はfunc(a,b)と言う関数が a/b と言う除算をするとしたら、
void test(void){
// 0/1なら例外は発生せず、結果が0になる事を期待する
try{
int res = func( 0, 1);
if( res != 0 ) print( "Return Error\n");
}catch{
print( "Exception Error\n");
}
// 1/0なら例外が発生する事を期待する
try{
int res = func( 1, 0);
print( "Not Exception Error\n");
}catch{
}
// 2/1なら例外は発生せず、結果が2になる事を期待する
try{
int res = func( 2, 1);
if( res != 1 ) print( "Return Error\n");
}catch{
print( "Exception Error\n");
}
// 1/2なら例外は発生せず、結果が0.5になる事を期待する
try{
int res = func( 1, 2);
if( res != 0.5 ) print( "Return Error\n");
}catch{
print( "Exception Error\n");
}
}
※このコードは仮想言語のものです

と言う感じでテストすれば良い訳です。
この場合は次の4つのテストをしていることになります。
 ・ 割られる数が0の場合(例外とならず、正しく演算されるか?)
 ・ 割る数が0の場合(例外が発生するか?)
 ・ 除算結果が整数の場合(正しく演算されるか?)
 ・ 除算結果が少数の場合(少数の結果が返ってくるか?)
期待通りの動作をしないとメッセージが出力されるようになります。
実際のコードは、テスト方針や使用する言語・フレームワークで異なると思いますが、基本の考え方はこんな感じになると思います。
もっと詳しくテストするなら、割る数や割られる数が-(負の数)の場合とかも入れる必要があるでしょうけどね。

まぁ、このくらいであれば、悩むとしてもテスト項目を決める事ぐらいでしょう。

では、メソッド(関数)が内部で別のクラスを使って処理をしたり、
外部のDBや通信、ファイルを使用している場合はどうやってテストすれば良いのでしょう?
概念としては、『スタブ』を作って、それに差し替えれば良いことになります。
『スタブ』を作る事はそんなに難しくありません。
ただ、『差し替え』をどうやるのか? が問題です。

と言う訳で、次回はその『差し替え』について考えてみようと思います。
関連記事
スポンサーサイト
[ 2013/02/05 00:37 ] プログラム | TB(0) | CM(0)
コメントの投稿












管理者にだけ表示を許可する
トラックバック:
この記事のトラックバック URL

FC2カウンター
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
Twitter@sweetsblast
過去ログ

2017年 08月 【1件】
2017年 06月 【3件】
2017年 05月 【3件】
2017年 04月 【3件】
2017年 03月 【5件】
2017年 01月 【1件】
2016年 09月 【2件】
2016年 04月 【2件】
2016年 03月 【2件】
2016年 01月 【5件】
2015年 12月 【3件】
2014年 05月 【1件】
2014年 04月 【1件】
2013年 12月 【1件】
2013年 03月 【4件】
2013年 02月 【3件】
2013年 01月 【1件】
2012年 12月 【3件】
2012年 11月 【4件】
2012年 10月 【2件】
2012年 09月 【4件】
2012年 08月 【2件】
2012年 07月 【3件】
2012年 06月 【11件】
2012年 05月 【11件】
2012年 04月 【9件】
2012年 03月 【15件】
2012年 02月 【17件】
2012年 01月 【5件】
2011年 12月 【14件】
2011年 11月 【11件】
2011年 10月 【19件】
2011年 09月 【10件】
2011年 08月 【4件】
2011年 07月 【11件】
2011年 06月 【4件】
2011年 05月 【1件】
2011年 04月 【17件】
2011年 03月 【29件】
2011年 02月 【24件】
2011年 01月 【30件】
2010年 12月 【30件】
2010年 11月 【22件】
2010年 10月 【26件】
2010年 09月 【27件】
2010年 08月 【30件】
2010年 07月 【27件】
2010年 06月 【24件】
2010年 05月 【7件】
2010年 04月 【6件】
2010年 03月 【3件】
2010年 02月 【6件】
2010年 01月 【8件】
2009年 12月 【8件】
2009年 11月 【5件】
2009年 10月 【7件】
2009年 09月 【18件】
2009年 08月 【22件】
2009年 07月 【14件】
2009年 06月 【16件】
2009年 05月 【28件】
2009年 04月 【25件】
2009年 03月 【5件】
2009年 01月 【2件】
2008年 12月 【1件】
2008年 11月 【2件】
2008年 10月 【3件】
2008年 09月 【6件】
2008年 08月 【3件】
2008年 07月 【2件】
2008年 06月 【2件】
2008年 05月 【3件】
2008年 04月 【4件】
2008年 03月 【11件】
2008年 02月 【12件】
2008年 01月 【7件】
2007年 12月 【8件】
2007年 11月 【5件】
2007年 10月 【8件】
2007年 09月 【6件】
2007年 08月 【15件】
2007年 07月 【10件】
2007年 06月 【14件】
2007年 05月 【12件】
2007年 04月 【10件】
2007年 03月 【7件】
2007年 02月 【19件】
2007年 01月 【18件】
2006年 12月 【25件】
2006年 11月 【27件】
2006年 10月 【19件】
2006年 09月 【26件】
2006年 08月 【12件】
2006年 07月 【5件】



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。