導入
ソフトウェア開発を専門とするカリキュラムで学んでいるのでない限り,
テスト駆動開発は,
展開
テスト駆動開発とは
これから紹介するテスト駆動開発は,
- 作成したいソフトウェアの機能を明確にする。
- 目的の機能を,
評価可能な状態まで細分化する。 - まず,
評価のためのコードAを書く。このAをテストコードと呼ぶ。 - Aが問題なく実行されるように目的のソフトウエアのコードを作成する。
ここで1.や2.の
確実に目的の結果を出力するコードを書き,
大切なのは,
ユニットテストを積み重ねて行くテスト駆動開発は,
テスト駆動開発の例
概略設計
次のようなソフトウェアをテスト駆動開発してみましょう。
健康管理アプリを作ろう。
個人情報を入力すると、BMIや肥満度を教えてくれる。
まずはこんな大雑把なところからスタートしましょう。 せっかくですから,
このアプリケーションに登場するオブジェクトを次のように考えてみます。
- ディスプレイウインドウ:人形を表示し,
どこかに入力されたデータと, 計算したデータを表示する。 - 個人情報コンテナ:入力されたデータを保持し,
そのデータをもとにBMIや肥満度を返す。 - コントローラ:マウスやキーボードからの入力を受け取り,
適切な形式で個人情報コンテナにセットする。またディスプレイウインドウへ必要な情報をセットする。
UMLで表現すると,
作成しようとするソフトウェアがかなり具体的になってきましたね。
それでは,
BMIと肥満度の対応表
BMI | 肥満度 |
---|---|
18. | 低体重 |
18. | 普通体重 |
25以上、30未満 | 肥満 |
30以上、35未満 | 肥満 |
35以上、40未満 | 肥満 |
40以上 | 肥満 |
こうして必要な情報を調べてみるとBMIや肥満度に性別や年齢は必要ないのが分かります。そのとき,
テストコードの作成と,目的のコードの作成
それでは,
ユニットテストで使用するのがassert文です。メソッドが目的の値を返すかどうかをチェックする命令です。
私の流儀ですが,
はじめに,HealthApp.
から書きます。
HealthApp.
//HealthApp
boolean DEBUG_MODE = true;
void setup(){
if (DEBUG_MODE == true){
println("<<Debug Mode>> setup");
noLoop();
size(200,100);
testPersonalData();
} else {
println("<<Run Mode>> setup");
}
}
void draw(){
if (DEBUG_MODE == true){
println("<<Debug Mode>> draw");
} else {
println("<<Run Mode>> draw");
}
}
void testPersonalData(){
PersonalData pd = new PersonalData("FEMALE",30, 50,165,true);
assert pd.getSex().equals("FEMALE") : "Error";
assert pd.getAge() == 30 : "Error";
assert pd.getYourWeight() == 50 : "Error";
assert pd.getYourHeight() == 165 : "Error";
assert pd.isAthlete() == false : "Error";
// assert pd.getBMI == 0 : "Error";
// assert pd.getCategory == 0 : "Error";
}
HealthApp.
に書かれたテストコードを満たすように,PersonalData.
にコードを書きます。スケルトンコードではなく最低限動作する状態のコードを書いています。
PersonalData.
class PersonalData{
String sex = "MALE";// 性別 MALE,FEMALE
int age = 17; // 年齢
double your_weight = 70.0; // [kg]
double your_height = 170.0; // [cm]
boolean isAthlete = false; // アスリートかどうか
double BMI = 0; // BMI
double category = 0; // 肥満指数
PersonalData(String _sex, int _age, double _weight, double _height,
boolean _isAthlete) {
sex = _sex;
age = _age;
your_weight = _weight;
your_height = _height;
isAthlete = _isAthlete;
//BMI = getBMI();
//category = getCategory();
}
public String getSex(){
return sex;
}
public int getAge(){
return age;
}
public double getYourWeight(){
return your_weight;
}
public double getYourHeight(){
return your_height;
}
public boolean isAthlete(){
return isAthlete;
}
public double getBMI(){
return BMI;
}
public double getCategory(){
return category;
}
}